Merge pull request #11841 from wxy/20181212-How-to-Build-a-Netboot-Server,-Part-2

PRF&PUB:20181212 How to Build a Netboot Server, Part 2
This commit is contained in:
Xingyu.Wang 2018-12-29 22:56:11 +08:00 committed by GitHub
commit cb39fa70a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,18 +1,18 @@
[#]: collector: (lujun9972) [#]: collector: (lujun9972)
[#]: translator: (qhwdw) [#]: translator: (qhwdw)
[#]: reviewer: () [#]: reviewer: (wxy)
[#]: publisher: () [#]: publisher: (wxy)
[#]: url: () [#]: url: (https://linux.cn/article-10396-1.html)
[#]: subject: (How to Build a Netboot Server, Part 2) [#]: subject: (How to Build a Netboot Server, Part 2)
[#]: via: (https://fedoramagazine.org/how-to-build-a-netboot-server-part-2/) [#]: via: (https://fedoramagazine.org/how-to-build-a-netboot-server-part-2/)
[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/) [#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/)
如何构建一台网络引导服务器(部分 如何构建一台网络引导服务器(二)
====== ======
![](https://fedoramagazine.org/wp-content/uploads/2018/12/netboot2-816x345.jpg) ![](https://fedoramagazine.org/wp-content/uploads/2018/12/netboot2-816x345.jpg)
在 [如何构建一台网络引导服务器(部分][1] 的文章中,我们展示了如何创建一个网络引导镜像,在那个镜像中使用了一个名为 “liveuser” 帐户,它的 home 目录位于内存中,重启后 home 中的内容将全部消失。然而很多用户都希望机器重启后保存他们的文件和设置。因此,在本系列的第二部分,我们将向你展示如何在第一部分的基础上,重新配置网络引导镜像,使它能够使用 [活动目录][2] 中的用户帐户进行登陆,然后能够从一个 NFS 服务器上自动挂载他们的 home 目录。 在 [如何构建一台网络引导服务器(一)][1] 的文章中,我们展示了如何创建一个网络引导镜像,在那个镜像中使用了一个名为 `liveuser` 帐户,它的家目录位于内存中,重启后家目录中的内容将全部消失。然而很多用户都希望机器重启后保存他们的文件和设置。因此,在本系列的第二部分,我们将向你展示如何在第一部分的基础上,重新配置网络引导镜像,以便 [活动目录][2] 中的用户帐户可以进行登录,然后从一个 NFS 服务器上自动挂载他们的家目录。
本系列的第三部分,我们将向你展示网络引导客户端如何与中心化配置的 iPXE 引导菜单进行交互。 本系列的第三部分,我们将向你展示网络引导客户端如何与中心化配置的 iPXE 引导菜单进行交互。
@ -22,7 +22,7 @@
### 删除 Liveuser 帐户 ### 删除 Liveuser 帐户
删除本系列文章第一部分中创建的 “liveuser” 帐户: 删除本系列文章第一部分中创建的 `liveuser` 帐户:
``` ```
$ sudo -i $ sudo -i
@ -33,7 +33,7 @@ $ sudo -i
### 配置 NTP、KRB5 和 SSSD ### 配置 NTP、KRB5 和 SSSD
接下来,我们需要将 NTP、KRB5和 SSSD 的配置文件复制进客户端使用的镜像中,以便于它们能够使用同一个帐户: 接下来,我们需要将 NTP、KRB5 和 SSSD 的配置文件复制进客户端使用的镜像中,以便于它们能够使用同一个帐户:
``` ```
# MY_HOSTNAME=$(</etc/hostname) # MY_HOSTNAME=$(</etc/hostname)
@ -45,7 +45,7 @@ $ sudo -i
# cp /etc/sssd/sssd.conf /fc28/etc/sssd # cp /etc/sssd/sssd.conf /fc28/etc/sssd
``` ```
重新配置 sssd 在已配置的识别服务的基础上去提供认证服务: 在已配置的识别服务的基础上,重新配置 sssd 提供认证服务:
``` ```
# sed -i '/services =/s/$/, pam/' /fc28/etc/sssd/sssd.conf # sed -i '/services =/s/$/, pam/' /fc28/etc/sssd/sssd.conf
@ -63,9 +63,9 @@ $ sudo -i
# for i in passwd shadow group gshadow; do grep "^nfsnobody:" /etc/$i >> /fc28/etc/$i; done # for i in passwd shadow group gshadow; do grep "^nfsnobody:" /etc/$i >> /fc28/etc/$i; done
``` ```
### 连接活动目录 ### 加入活动目录
接下来,你将执行一个 chroot 将客户端镜像连接到活动目录。从删除预置在网络引导镜像中同的计算机帐户开始: 接下来,你将执行一个 `chroot` 将客户端镜像加入到活动目录。从删除预置在网络引导镜像中同的计算机帐户开始:
``` ```
# MY_USERNAME=jsmith # MY_USERNAME=jsmith
@ -73,20 +73,20 @@ $ sudo -i
# adcli delete-computer "${MY_CLIENT_HOSTNAME%%.*}" -U "$MY_USERNAME" # adcli delete-computer "${MY_CLIENT_HOSTNAME%%.*}" -U "$MY_USERNAME"
``` ```
在网络引导镜像中如果有 krb5.keytab 文件,也删除它: 在网络引导镜像中如果有 `krb5.keytab` 文件,也删除它:
``` ```
# rm -f /fc28/etc/krb5.keytab # rm -f /fc28/etc/krb5.keytab
``` ```
在网络引导镜像中执行一个 chroot 操作 `chroot` 到网络引导镜像中
``` ```
# for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc28/$i; done # for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc28/$i; done
# chroot /fc28 /usr/bin/bash --login # chroot /fc28 /usr/bin/bash --login
``` ```
执行一个 join 操作: 执行一个加入操作:
``` ```
# MY_USERNAME=jsmith # MY_USERNAME=jsmith
@ -97,7 +97,7 @@ $ sudo -i
# adcli join $MY_DOMAIN --login-user="$MY_USERNAME" --computer-name="${MY_HOSTNAME%%.*}" --host-fqdn="$MY_HOSTNAME" --user-principal="host/$MY_HOSTNAME@$MY_REALM" --domain-ou="$MY_OU" # adcli join $MY_DOMAIN --login-user="$MY_USERNAME" --computer-name="${MY_HOSTNAME%%.*}" --host-fqdn="$MY_HOSTNAME" --user-principal="host/$MY_HOSTNAME@$MY_REALM" --domain-ou="$MY_OU"
``` ```
现在登出 chroot并清除命令历史 现在登出 chroot并清除 root 用户的命令历史:
``` ```
# logout # logout
@ -105,9 +105,9 @@ $ sudo -i
# > /fc28/root/.bash_history # > /fc28/root/.bash_history
``` ```
### 安装和配置 PAM Mount ### 安装和配置 PAM 挂载
我们希望客户端登入后自动挂载它的 home 目录。为实现这个目的,我们将要使用 “pam_mount” 模块。安装和配置 pam_mount 我们希望客户端登入后自动挂载用户家目录。为实现这个目的,我们将要使用 `pam_mount` 模块。安装和配置 `pam_mount`
``` ```
# dnf install -y --installroot=/fc28 pam_mount # dnf install -y --installroot=/fc28 pam_mount
@ -123,7 +123,7 @@ $ sudo -i
END END
``` ```
重新配置 PAM 去使用 pam_mount 重新配置 PAM 去使用 `pam_mount`
``` ```
# dnf install -y patch # dnf install -y patch
@ -131,23 +131,23 @@ END
# echo 'initgroups: files' >> /fc28/etc/authselect/custom/sssd/nsswitch.conf # echo 'initgroups: files' >> /fc28/etc/authselect/custom/sssd/nsswitch.conf
# patch /fc28/etc/authselect/custom/sssd/system-auth << END # patch /fc28/etc/authselect/custom/sssd/system-auth << END
@@ -12 +12,2 @@ @@ -12 +12,2 @@
-auth sufficient pam_sss.so forward_pass -auth sufficient pam_sss.so forward_pass
+auth requisite pam_mount.so {include if "with-pammount"} +auth requisite pam_mount.so {include if "with-pammount"}
+auth sufficient pam_sss.so {if "with-pammount":use_first_pass|forward_pass} +auth sufficient pam_sss.so {if "with-pammount":use_first_pass|forward_pass}
@@ -35,2 +36,3 @@ @@ -35,2 +36,3 @@
session required pam_unix.so session required pam_unix.so
+session optional pam_mount.so {include if "with-pammount"} +session optional pam_mount.so {include if "with-pammount"}
session optional pam_sss.so session optional pam_sss.so
END END
# patch /fc28/etc/authselect/custom/sssd/password-auth << END # patch /fc28/etc/authselect/custom/sssd/password-auth << END
@@ -9 +9,2 @@ @@ -9 +9,2 @@
-auth sufficient pam_sss.so forward_pass -auth sufficient pam_sss.so forward_pass
+auth requisite pam_mount.so {include if "with-pammount"} +auth requisite pam_mount.so {include if "with-pammount"}
+auth sufficient pam_sss.so {if "with-pammount":use_first_pass|forward_pass} +auth sufficient pam_sss.so {if "with-pammount":use_first_pass|forward_pass}
@@ -32,2 +33,3 @@ @@ -32,2 +33,3 @@
session required pam_unix.so session required pam_unix.so
+session optional pam_mount.so {include if "with-pammount"} +session optional pam_mount.so {include if "with-pammount"}
session optional pam_sss.so session optional pam_sss.so
END END
# chroot /fc28 authselect select custom/sssd with-pammount --force # chroot /fc28 authselect select custom/sssd with-pammount --force
``` ```
@ -159,17 +159,17 @@ END
# echo "$MY_IP $MY_HOSTNAME ${MY_HOSTNAME%%.*}" >> /fc28/etc/hosts # echo "$MY_IP $MY_HOSTNAME ${MY_HOSTNAME%%.*}" >> /fc28/etc/hosts
``` ```
可选,允许所有用户去使用 sudo 可选,允许所有用户可以使用 `sudo`
``` ```
# echo '%users ALL=(ALL) NOPASSWD: ALL' > /fc28/etc/sudoers.d/users # echo '%users ALL=(ALL) NOPASSWD: ALL' > /fc28/etc/sudoers.d/users
``` ```
### 转换 NFS Root 到一个 iSCSI 背后的存储 ### 转换 NFS 根目录到一个 iSCSI 后备存储器
在一个 nfsroot 连接建立之后,目前版本的 nfs-utils 可能很难为 home 目录维护一个从客户端到 NFS 服务器的二次连接。当尝试去访问 home 目录时客户端将被挂住。因此为了网络引导镜像可共享使用我们将使用一个不同的协议iSCSI来解决这个问题。 在一个 nfsroot 连接建立之后,目前版本的 nfs-utils 可能很难为家目录建立一个从客户端到 NFS 服务器的第二个连接。当尝试去访问家目录时客户端将被挂起。因此为了共享网络引导镜像我们将使用一个不同的协议iSCSI来规避这个问题。
首先 chroot 到镜像中,去重新配置它的 initramfs让它从一个 iSCSI root 中去引导: 首先 `chroot` 到镜像中,重新配置它的 `initramfs`,让它从一个 iSCSI 根目录中去引导:
``` ```
# for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc28/$i; done # for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc28/$i; done
@ -186,16 +186,16 @@ END
# > /fc28/root/.bash_history # > /fc28/root/.bash_history
``` ```
在测试时qedi 驱动会破坏 iscsi,因此我们将它禁用。 在测试时qedi 驱动会破坏 iSCSI,因此我们将它禁用。
接着,创建一个 fc28.img 的 [稀疏文件][4]。这个稀疏文件代表 iSCSI 目标的后存储: 接着,创建一个 `fc28.img` [稀疏文件][4]。这个稀疏文件代表 iSCSI 目标的后存储
``` ```
# FC28_SIZE=$(du -ms /fc28 | cut -f 1) # FC28_SIZE=$(du -ms /fc28 | cut -f 1)
# dd if=/dev/zero of=/fc28.img bs=1MiB count=0 seek=$(($FC28_SIZE*2)) # dd if=/dev/zero of=/fc28.img bs=1MiB count=0 seek=$(($FC28_SIZE*2))
``` ```
(如果你有一个可使用的稀疏文件、一个单独的分区或磁盘驱动器,就可以代替它了,不用再去创建这个稀疏文件了。) (如果你有一个可使用的独立分区或磁盘驱动器,也可以用它,而不用再去创建这个稀疏文件了。)
接着,使用一个文件系统去格式化镜像、挂载它、然后将网络引导镜像复制进去: 接着,使用一个文件系统去格式化镜像、挂载它、然后将网络引导镜像复制进去:
@ -207,31 +207,31 @@ END
# umount $TEMP_MNT # umount $TEMP_MNT
``` ```
在使用 SquashFS 测试时,客户端偶尔会出现小状况。似乎是因为 SquashFS 在多处理器客户端上没法执行一个随机 I/O。更多内容见 [squashfs 读取卡顿的奇怪案例][5])。如果你希望使用一个压缩文件系统来提升吞吐性能,[ZFS][6] 或许是个很好的选择。 在使用 SquashFS 测试时,客户端偶尔会出现小状况。似乎是因为 SquashFS 在多处理器客户端上没法执行随机 I/O。更多内容见 [squashfs 读取卡顿的奇怪案例][5])。如果你希望使用文件系统压缩来提升吞吐性能,[ZFS][6] 或许是个很好的选择。
如果你对 iSCSI 服务器的吞吐性能要求非常高(比如,成百上千的客户端要连接它),可能需要使用带 [负载均衡][7] 的 [Ceph][8] 集群了。更多相关内容,请查看 [使用 HAProxy 和 Keepalived 负载均衡的 Ceph 对象网关][9]。 如果你对 iSCSI 服务器的吞吐性能要求非常高(比如,成百上千的客户端要连接它),可能需要使用带 [负载均衡][7] 的 [Ceph][8] 集群了。更多相关内容,请查看 [使用 HAProxy 和 Keepalived 负载均衡的 Ceph 对象网关][9]。
### 安装和配置 iSCSI ### 安装和配置 iSCSI
为了给我们的客户端提供网络引导镜像,安装 scsi-target-utils 包: 为了给我们的客户端提供网络引导镜像,安装 `scsi-target-utils` 包:
``` ```
# dnf install -y scsi-target-utils # dnf install -y scsi-target-utils
``` ```
配置 iSCSI 守护程序去提供 fc28.img 文件: 配置 iSCSI 守护程序去提供 `fc28.img` 文件:
``` ```
# MY_REVERSE_HOSTNAME=$(echo $MY_HOSTNAME | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_HOSTNAME}) # MY_REVERSE_HOSTNAME=$(echo $MY_HOSTNAME | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_HOSTNAME})
# cat << END > /etc/tgt/conf.d/fc28.conf # cat << END > /etc/tgt/conf.d/fc28.conf
<target iqn.$MY_REVERSE_HOSTNAME:fc28> <target iqn.$MY_REVERSE_HOSTNAME:fc28>
backing-store /fc28.img backing-store /fc28.img
readonly 1 readonly 1
</target> </target>
END END
``` ```
通过 /usr/lib/dracut/modules.d/40network/net-lib.sh 来指示预期的 iqn 开头的 `iqn.``/usr/lib/dracut/modules.d/40network/net-lib.sh` 所需要的
添加一个防火墙例外,并启用和启动这个服务: 添加一个防火墙例外,并启用和启动这个服务:
@ -242,7 +242,7 @@ END
# systemctl start tgtd.service # systemctl start tgtd.service
``` ```
你现在应该能够使用 tatadm 命令看到这个共享后的镜像 你现在应该能够使用 `tatadm` 命令看到这个镜像共享了
``` ```
# tgtadm --mode target --op show # tgtadm --mode target --op show
@ -252,42 +252,42 @@ END
``` ```
Target 1: iqn.edu.example.server-01:fc28 Target 1: iqn.edu.example.server-01:fc28
System information: System information:
Driver: iscsi Driver: iscsi
State: ready State: ready
I_T nexus information: I_T nexus information:
LUN information: LUN information:
LUN: 0 LUN: 0
Type: controller Type: controller
SCSI ID: IET 00010000 SCSI ID: IET 00010000
SCSI SN: beaf10 SCSI SN: beaf10
Size: 0 MB, Block size: 1 Size: 0 MB, Block size: 1
Online: Yes Online: Yes
Removable media: No Removable media: No
Prevent removal: No Prevent removal: No
Readonly: No Readonly: No
SWP: No SWP: No
Thin-provisioning: No Thin-provisioning: No
Backing store type: null Backing store type: null
Backing store path: None Backing store path: None
Backing store flags: Backing store flags:
  LUN: 1 LUN: 1
Type: disk Type: disk
SCSI ID: IET 00010001 SCSI ID: IET 00010001
SCSI SN: beaf11 SCSI SN: beaf11
Size: 10488 MB, Block size: 512 Size: 10488 MB, Block size: 512
Online: Yes Online: Yes
Removable media: No Removable media: No
Prevent removal: No Prevent removal: No
Readonly: Yes Readonly: Yes
SWP: No SWP: No
Thin-provisioning: No Thin-provisioning: No
Backing store type: rdwr Backing store type: rdwr
Backing store path: /fc28.img Backing store path: /fc28.img
Backing store flags: Backing store flags:
Account information: Account information:
ACL information: ACL information:
ALL ALL
``` ```
现在,我们可以去删除本系列文章的第一部分中创建的 NFS 共享了: 现在,我们可以去删除本系列文章的第一部分中创建的 NFS 共享了:
@ -300,11 +300,11 @@ Target 1: iqn.edu.example.server-01:fc28
# sed -i '/^\/fc28 /d' /etc/fstab # sed -i '/^\/fc28 /d' /etc/fstab
``` ```
你也可以删除 /fc28 文件系统,但为了以后进一步更新,你可能需要保留它。 你也可以删除 `/fc28` 文件系统,但为了以后进一步更新,你可能需要保留它。
### 更新 ESP 去使用 iSCSI 内核 ### 更新 ESP 去使用 iSCSI 内核
更新 ESP 去包含启用了 iSCSI 的 initramfs 更新 ESP 去包含启用了 iSCSI 的 `initramfs`
``` ```
$ rm -vf $HOME/esp/linux/*.fc28.* $ rm -vf $HOME/esp/linux/*.fc28.*
@ -313,7 +313,7 @@ $ cp $(find /fc28/lib/modules -maxdepth 2 -name 'vmlinuz' | grep -m 1 $MY_KRNL)
$ cp $(find /fc28/boot -name 'init*' | grep -m 1 $MY_KRNL) $HOME/esp/linux/initramfs-$MY_KRNL.img $ cp $(find /fc28/boot -name 'init*' | grep -m 1 $MY_KRNL) $HOME/esp/linux/initramfs-$MY_KRNL.img
``` ```
更新 boot.cfg 文件去传递新的 root 和 netroot 参数: 更新 `boot.cfg` 文件去传递新的 `root``netroot` 参数:
``` ```
$ MY_NAME=server-01.example.edu $ MY_NAME=server-01.example.edu
@ -322,7 +322,7 @@ $ MY_ADDR=$(host -t A $MY_NAME | awk '{print $4}')
$ sed -i "s! root=[^ ]*! root=/dev/disk/by-path/ip-$MY_ADDR:3260-iscsi-iqn.$MY_EMAN:fc28-lun-1 netroot=iscsi:$MY_ADDR::::iqn.$MY_EMAN:fc28!" $HOME/esp/linux/boot.cfg $ sed -i "s! root=[^ ]*! root=/dev/disk/by-path/ip-$MY_ADDR:3260-iscsi-iqn.$MY_EMAN:fc28-lun-1 netroot=iscsi:$MY_ADDR::::iqn.$MY_EMAN:fc28!" $HOME/esp/linux/boot.cfg
``` ```
现在,你只需要从 $HOME/esp/linux 目录中复制更新后的文件到所有客户端系统的 ESP 中。你应该会看到类似下面屏幕截图的结果: 现在,你只需要从 `$HOME/esp/linux` 目录中复制更新后的文件到所有客户端系统的 ESP 中。你应该会看到类似下面屏幕截图的结果:
![][10] ![][10]
@ -334,7 +334,7 @@ $ sed -i "s! root=[^ ]*! root=/dev/disk/by-path/ip-$MY_ADDR:3260-iscsi-iqn.$MY_E
# cp -a /fc28 /fc29 # cp -a /fc28 /fc29
``` ```
Chroot 进入到镜像的新副本: `chroot` 进入到镜像的新副本:
``` ```
# for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc29/$i; done # for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc29/$i; done
@ -401,7 +401,7 @@ END
# tgt-admin --update ALL # tgt-admin --update ALL
``` ```
添加新内核并 initramfs 到 ESP 添加新内核`initramfs` 到 ESP
``` ```
$ MY_KRNL=$(ls -c /fc29/lib/modules | head -n 1) $ MY_KRNL=$(ls -c /fc29/lib/modules | head -n 1)
@ -409,7 +409,7 @@ $ cp $(find /fc29/lib/modules -maxdepth 2 -name 'vmlinuz' | grep -m 1 $MY_KRNL)
$ cp $(find /fc29/boot -name 'init*' | grep -m 1 $MY_KRNL) $HOME/esp/linux/initramfs-$MY_KRNL.img $ cp $(find /fc29/boot -name 'init*' | grep -m 1 $MY_KRNL) $HOME/esp/linux/initramfs-$MY_KRNL.img
``` ```
更新 ESP 的 boot.cfg 更新 ESP 的 `boot.cfg`
``` ```
$ MY_DNS1=192.0.2.91 $ MY_DNS1=192.0.2.91
@ -426,7 +426,7 @@ boot || exit
END END
``` ```
最后,从我的 $HOME/esp/linux 目录中复制文件到所有客户端系统的 ESP 中去使用它吧! 最后,从我的 `$HOME/esp/linux` 目录中复制文件到所有客户端系统的 ESP 中去使用它吧!
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -435,13 +435,13 @@ via: https://fedoramagazine.org/how-to-build-a-netboot-server-part-2/
作者:[Gregory Bartholomew][a] 作者:[Gregory Bartholomew][a]
选题:[lujun9972][b] 选题:[lujun9972][b]
译者:[qhwdw](https://github.com/qhwdw) 译者:[qhwdw](https://github.com/qhwdw)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/glb/ [a]: https://fedoramagazine.org/author/glb/
[b]: https://github.com/lujun9972 [b]: https://github.com/lujun9972
[1]: https://fedoramagazine.org/how-to-build-a-netboot-server-part-1/ [1]: https://linux.cn/article-10379-1.html
[2]: https://en.wikipedia.org/wiki/Active_Directory [2]: https://en.wikipedia.org/wiki/Active_Directory
[3]: https://fedoramagazine.org/secure-nfs-home-directories-kerberos [3]: https://fedoramagazine.org/secure-nfs-home-directories-kerberos
[4]: https://en.wikipedia.org/wiki/Sparse_file [4]: https://en.wikipedia.org/wiki/Sparse_file