PXE引導RamOS內存系統Linux無盤啟動centos7與ubuntu16.04的實現
========================================================================================================================================
說明: 本文基於CENTOS7_x86_64操作系統, 所需的軟件安裝推薦使用yum以簡化安裝流程.關於YUM源的設定請參照本文最后一章的說明. 如使用7.0以上版
本的RHEL/CentOS制作,服務的開啟等通過systemctl命令管理,請自行查找使用方法.Ubuntu使用的是Ubuntu 16.04 desktop,其他版本的ubuntu,自行查找
本文只制作了centos與ubuntu的服務器與客戶端,centos為主。
切記不要將DHCP Server網口連到非本地測試網絡外的其他網絡,會導致其他網絡IP分配異常.
========================================================================================================================================
所需軟件和服務
服務器端:
DHCP: 為客戶端分配IP
TFTP: Tiny FTP, 傳送PXE Menu, Kernel, Initrd等文件
NFS-utils: 網絡文件系統,可供Client掛載,存儲文件等
Rpcbind: NFS的守護進程
Syslinux: 提供PXE啟動引導文件pxelinux.0
客戶端
需要先在本機硬盤內完整安裝一遍Linux操作系統,然后將該操作系統的鏡像稍作修改后拷貝到nfs服務的啟動目錄內,以后相同硬件平台的客戶端機
器都可以從該目錄啟動和掛載根文件系統,實現PXE無盤操作.
========================================================================================================================================
以下為正文,所有操作均使用root用戶權限完成.
第1章 Centos7服務器端軟件的安裝,配置及啟動
關於Ubuntu16.04 desktop作為服務器請參考第6章
1.1 設定本機固定IP:
將要提供PXE啟動服務的網口設定為固定IP 192.168.56.160,並重新啟動網絡, 查看IP是否生效. 此為Linux基本操作,不再詳述.
1.2 DHCP
1.2.1 DHCP安裝
yum install -y dhcp
1.2.2 修改DHCP配置文件
vi /etc/dhcp/dhcpd.conf
#內容如下,注意分號一定不能少
# dhcpd.conf 部分參數說明:
# default-lease-time // 指定確認租賃時長,單位為秒,-1 表示無限制
# max-lease-time // 指定最大租賃時長
# authritative // 拒絕不正確的IP 地址的要求
# subnet netmask {} // 設置dhcp 區域
# range // 提供動態分配IP 的范圍;若所有工作站都是綁定的固定IP,可刪除此配置
# option routers // 設置網關/路由器地址,多個地址用逗號隔開;若不想讓客戶端上網,可刪除此配置
# domain-name-servers // 設置DNS,若不想讓客戶端上網,可刪除此配置;多個地址用逗號隔開
# next-server // 告知工作站TFTP 服務器的地址,TFTP 服務提供啟動引導
# filename // 告知工作站PXE 引導程序名
# host XXX {} // 此處是根據工作站的MAC 地址綁定固定的IP 地址,前提是知道MAC 地址
# hardware ethernet // 工作站的MAC 地址,一定要小寫
# fixed-address // 綁定固定的IP 地址,和range 的不會有沖突,優先以它為主
ddns-update-style none;
ignore client-updates;
default-lease-time -1;
max-lease-time -1;
authritative;
subnet 192.168.56.0 netmask 255.255.255.0 {
range 192.168.56.100 192.168.56.200;
next-server 192.168.56.160;
filename "pxelinux.0";
}
1.2.3 重啟DHCP,並加入開機自動啟動:
service dhcpd restart /systemctl restart dhcpd.service
chkconfig dhcpd on /systemctl enable dhcpd.service
systemctl status dhcpd.service
到此配置基本完成
將DHCP服務器綁定在"ens33"網卡上
在/etc/sysconfig/dhcpd文件末尾添加:
DHCPDARGS="ens33
1.2.4 關閉防火牆,並確認防火牆是否關閉成功
firewall-cmd --state /systemctl status firewalld.service
service firewalld stop/systemctl stop firewalld.service
systemctl disable firewalld.service
徹底關閉防火牆的方法:
vim /etc/selinux/config
將 SELINUX=enforcing 改成:
SELINUX=disabled
重啟系統后生效
getenforce查看是否為Disabled
1.2.5 檢查DHCP server是否工作:可新建虛擬機連接到該server,若能正確分到192.168.56.161~192.168.56.170之間的IP,則說明DHCP工作正常.
1.3 TFTP
1.3.1 建立文件夾
mkdir -p /pxeserver/tftpboot
mkdir -p /pxeserver/models
1.3.2 TFTP安裝
yum install -y tftp-server tftp
1.3.3 修改TFTP配置文件
vim /etc/xinetd.d/tftp
只需修改如下兩處
server_args = -s /pxeserver/tftpboot #改成剛剛新建的地址 修改后沒有成功繼續使用的是/var/lib/tftpboot,所以就沒有修改,直接用這個目錄
disable = no #disable改為no
1.3.5 重啟TFTP,並加入開機自動啟動
systemctl status tftp.service
systemctl starttftp.service
systemctl enable tftp.servicet
1.4 NFS
1.4.1 NFS安裝
yum install -y nfs-utils rpcbind
1.4.2 修改NFS配置文件
vim /etc/exports
添加如下內容:
/pxeserver/models 192.168.1.0/24(rw,async,no_root_squash,insecure) #insecure這個是需要加的
exportfs -rv 更新nfs
1.4.3 重啟rpcbind,nfs,並加入開機自動啟動
systemctl status rpcbind.service
systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl status nfs.service
systemctl start nfs.service
systemctl enable nfs.service
1.4.4 檢查nfs文件夾是否發布成功
exportfs
應該可以看到如下內容:
/pxeserver/models
192.168.56.0/24
1.5 syslinux
1.5.1 syslinux安裝
yum install -y syslinux
1.5.2 拷貝PXE引導文件pxelinux.0到tftpboot
cp /usr/share/syslinux/pxelinux.0 /pxeserver/tftpboot
1.5.3 拷貝內核vmlinuz和啟動鏡像initrd到/pxeserver/tftpboot
從客戶端的本地鏡像/boot下拷貝過來,initrd會在客戶端用dracut生成后再拷貝,后面2.6.2節有詳細介紹
1.5.4 創建配置文件,即PXE啟動時看到的菜單相關的文件 這個啟動文件原本在安裝光盤下 /dev/cdrom/isolinux/isolinux.cfg可參考去修改,可參考3.2節
mkdir -p /pxeserver/tftpboot/pxelinux.cfg
vim /pxeserver/tftpboot/pxelinux.cfg/default
添加如下基本內容:
default auto
label auto
prompt 0
kernel vmlinuz-work
append initrd=initrd-work.img root=nfs:192.168.56.160:/pxeserver/models/work selinux=0 ip=dhcp rw vga=0x314
我的default為:
default vesamenu.c32
display boot.msg
timeout 600
prompt 1
menu background splash.jpg
label centos-7.6.1810
kernel vmlinuz-work
append initrd=initrd-work.img root=nfs:192.168.56.160:/pxeserver/models/work selinux=0 ip=dhcp rw nomodeset vga=0x314
#append 不能換行
#prompt 0 表示工作站立即啟動,1 表示工作站等待選擇
# nomodeset 這個參數是配合后面的vga=參數一起使用,設置分辨率
# vga= 這個參數值是設置分辨率,0x 表示十六進制,0314 表示800*600 16 位色;若無特殊需求,建議刪除這2個參數
#以上kernel file和initrd的文件名中work的最好與/pxeserver/models/work路徑中一致,
#取決於客戶端建立鏡像時使用的名稱,建議以機器型號命名,如本文第2部分使用work
1.6 /pxeserver路徑下的結構如下
/pxeserver
|___models -------------------- 此路徑可存放多個客戶端鏡像路徑,下一級路徑建議以機器型號命名
| |____work -------------------- 存放xxx機器的nfs文件系統
|
|___tftpboot -------------------- 此路徑存放tftp server及PXE啟動相關的文件
|____pxelinux.cfg
| |____default -------- 默認的PXE啟動配置文件
|
|____pxelinux.0 -----------------PXE啟動引導文件
|
|___vmlinuz-work -----------------xxx型號機器的客戶端linux kernel文件
|
|___initrd-work.img ------------ xxx型號機器的客戶端linux 啟動鏡像文件
1.7 服務器端配置完成后重啟一遍,再用service指令查看一下dhcp xinetd nfs是否正常啟動,防火牆是否關閉.
第2章 Centos7客戶端制作文件系統鏡像及啟動文件鏡像
Ubuntu 16.04 desktop 客戶端制作文件系統鏡像及啟動文件鏡像 請參考第5章
2.1 建立/pxeserver/models/xxx路徑
mkdir -p /pxeserver/models/work #此處可以用網卡命名為例建立路徑
mkdir -p /pxeserver/tftpboot
2.2 使用rsync保存整個系統的文件鏡像,注意此時不要掛載CD, U盤的大容量存儲設備,會被一並添加到鏡像,增加鏡像的容量.也可用自行添加
--exclude='掛載目錄'的方式排除外部存儲設備
rsync -av --exclude='/proc' --exclude='/sys' --exclude='/tmp' --exclude='/var/tmp' --exclude='/etc/mtab' \
--exclude='/pxeserver' /* /pxeserver/models/work
rsync -avz --exclude='/pxeserver' --exclude='/proc' --exclude='/sys' --exclude='/tmp' --exclude='/var/tmp' --exclude='/media' \
--exclude='/mnt' --exclude='/etc/mtab' --exclude='/run' --exclude='/opt' --exclude='/dev' /* /pxeserver/models/work
ubuntu 有 --exclude='/lost+found'
#如果客戶端系統中有自建路徑或文件不想加入鏡像的可用 --exclude參數排除
報錯:rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1518) [generator=3.0.9]
使用root登錄在執行這個命令
但是ubuntu可能沒辦法直接用root登錄,所以需要修改ubuntu系統
2.3 在work路徑下自行建立上一步排除的路徑,應該注意到這幾個路徑是fstab內的非本地硬盤掛載點.
cd /pxeserver/models/work
mkdir -p proc sys tmp var/tmp
mkdir -p proc sys tmp var/tmp media mnt opt run dev 針對第二個rsync
如果沒有同步dev,則要使用下面的命令創建設備:
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
2.4 刪除以太網絡配置文件,因為該配置內通常會含有MAC信息,后續其他機器啟動時會自動建立該文件,如不刪除有可能會造成客戶端網卡啟動異常.只留lo
rm -f /pxeserver/models/work/etc/sysconfig/network-script/ifcfg-ens*
2.5 修改文件系統掛載點設定文件 etc/fstab
vim /pxeserver/models/work/etc/fstab
刪除其中本地文件系統相關的條目,換成nfs掛載點.
例如刪除如下3條(取決於安裝操作系統時的分區layout),CENTOS6的本地文件系統一般是ext4
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=b9db4c59-5da9-49d5-a99d-20629aac803c /boot ext4 defaults 1 2
/dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2
換成如下:
192.168.56.160:/pxeserver/models/work / nfs defaults,sync,rw,nolock 0 0
tmpfs /dev/shm tmpfs defauls 1 1
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
2.6 打包壓縮/pxeserver路徑
cd / #確認當前路徑不在/pxeserver內
tar -zcvf work.tar.gz work
將生成的壓縮文件通過優盤,移動硬盤或者通過nfs上傳到服務器端 並解壓
tar -zxvf work.tar.gz
2.7 制作initrd-work.img
將同不好的客戶機文件放到服務器的nfs目錄下
2.7.1 安裝dracut和dracut-network
yum install -y dracut dracut-network
2.7.2 復制內核文件到tftp 服務器上
cp /pxeserver/models/work/boot/vmlinuz-3.10.0-957.el7.x86_64 /var/lib/tftpboot/vmlinuz-work
2.7.2 制作initrd鏡像,拷貝kernel文件
chroot /pxeserver/models/work 切換用戶到客戶機上開始制作鏡像
dracut initrd-`uname -r`.img `uname -r`
exit 退出客戶端
chmod 644 initrd-`uname -r`.img
mv initrd-`uname -r`.img /pxeserver/tftpboot/initrd-work.img
2.7.3 查看鏡像內是否包含nfs
lsinitrd initrd-work.img | grep nfs
2.7.4 dracut制作鏡像的問題
[root@localhost ~]# dracut initrd-`uname -r`.img `uname -r`
Configuration file /etc/systemd/user.conf is marked executable. Please remove executable permission bits. Proceeding anyway.
Configuration file /etc/systemd/user.conf is marked world-writable. Please remove world writability permission bits. Proceeding anyway.
修改文件的權限:chmod 644 /etc/systemd/user.conf
第3章 在服務器端解壓縮鏡像並配置
3.1 PXE啟動過程中常見錯誤及排除方法
網卡報Check cable: 檢查服務器端網絡是否啟動或網線
DHCP進度條一直轉分不到IP: 檢查DHCP Server是否正常啟動
TFTP超時: 檢查TFTP服務是否啟動,防火牆是否關閉,/etc/xinetd.d/tftp內設置是否修改正確
找不到kernel或啟動鏡像: 檢查pxelinux.cfg/default文件配置是否有錯誤 或者kernel initrd文件是否正確的放在了
/pxeserver/tftpboot下,initrd要有644屬性
啟動過程中無法掛載nfs: 檢查nfs是否啟動正常, pxelinux.cfg/default文件中nfs地址是否有錯誤
3.2 服務器端高級pxelinux.cfg/default選單配置
使用安裝盤中的高級選單:
將安裝光盤中 isolinux路徑下的splash.jpg vesamenu.c32 memtest 拷貝到/pxeserver/tftpboot路徑下,
將相同路徑下的 isolinux.cfg拷貝到/pxeserver/tftpboot/pxelinux.cfg路徑下並改名為default
修改default文件內容如下,主要改動在每一個Label下的Kernel file, initrd file的名稱,地址, root掛載點等. Modelname1,2為其他型號機器的范
例,依照本文第2,3兩部分完成客戶端操作系統鏡像制作后,Model1,2改為對應的型號名即可.splash.jpg為PXE啟動菜單選擇界面的背景圖片,可以根據
尺寸要求(640*480像素)個性化定制.
default vesamenu.c32
#prompt 1
timeout 600
display boot.msg
menu background splash.jpg
menu title Please select corresponding boot image-CentOS6.8
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000
label DL360G9
menu label ^DL360G9 PXE boot
menu default
kernel vmlinuz-DL360
append initrd=initrd-DL360G9.img root=nfs:192.168.1.5:/pxeserver/models/DL360G9 selinux=0 ip=dhcp rw nomodeset vga=0x0314
label Modelname1
menu label Modelname^1 PXE boot
menu default
kernel vmlinuz-Modelname1
append initrd=initrd-Modelname1.img root=nfs:192.168.1.5:/pxeserver/models/Modelname1 selinux=0 ip=dhcp rw nomodeset vga=0x0314
label Modelname2
menu label Modelname^2 PXE boot
menu default
kernel vmlinuz-Modelname2
append initrd=initrd-Modelname2.img root=nfs:192.168.1.5:/pxeserver/models/Modelname2 selinux=0 ip=dhcp rw nomodeset vga=0x0314
label local
menu label Boot from ^local drive
localboot 0xffff
label memtest86
menu label ^Memory test
kernel memtest
append -
第4章 其他
4.1 服務器端的設定可以在虛擬機中完成,易於備份和轉移.
4.2 關於YUM源的設定
4.2.1 通過網絡YUM源安裝
如果服務器能夠直接連接到互聯網,那么直接聯網使用yum是最簡便的方式,有時第一次使用yum時會遇到域名不能解析的問題,在
/etc/resolv.conf中添加有效的DNS server地址即可,如加入以下一條
nameserver 114.114.114.114
4.2.2 使用本地CDROM或安裝U盤做YUM源
無法連接到互聯網時,用CDROM或U盤做YUM源也是很方便的. 如下以使用安裝U盤做YUM源為例介紹如何修改media YUM源.
首先掛載U盤,建議直接掛載到/media :
mount /dev/sdxx /media #sdxx 為安裝U盤所在的分區,建議使用FAT32格式,CENTOS6需要額外安裝軟件才能支持NTFS
然后修改/etc/yum.repos.d/下的主配置文件CentOS-Base.repo,將其改名以屏蔽使用主配置:
mv CentOS-Base.repo CentOS-Base.repo.bak
最后修改/etc/yum.repos.d/下的CentOS-Media.repo,以使用本地媒體做YUM源:
baseurl=file:///media/xxx
file:///media/xxx
file:///media/xxx
只需將上述三條中的任意一條映射到正確的掛載點即可,可修改第一條,並修改gpgcheck,enabled以開啟media YUM源.
baseurl=file:///media
file:///media/xxx
file:///media/xxx
gpgcheck=0
enabled=1
第5章 ubuntu的無盤啟動的鏡像制作(針對上面的centos服務器)
5.1制作根目錄
5.1.1安裝工具
前提是ubuntu16.04作為客戶端安裝好了
apt install nfs* initramfs-tools debootstrap
#nfs為客戶端的nfs-client
#initramfs-tools用來制作啟動文件initrd.nfs
#debootstrap 用來制作跟文件系統,但是這個方法不起作用
5.1.2制作根目錄
問題:在使用的rysnc這個同步命令可以試驗一下,制作出來的根目錄可不可以用?,但是根據第二章的制作方法,
ubuntu是找不到etc/sysconfig/network-script/ifcfg-ens*進行刪除的
debootstrap --verbose --arch=amd64 xenial /nfsroot
debootstrap --verbose --arch=amd64 xenial /nfsroot http://mirrors.aliyun.com/ubuntu
制作不出所需要的很目錄
因此采用cp的方式:
cd /
cp -rf bin/ boot/ dev/ home/ etc/ lib/ lib64/ root/ snap/ srv/ var/ /nfsroot/ 其中 var下的tmp要清空
mkdir -p proc sys tmp var/tmp media mnt opt run dev
5.1.3 修改制作的根目錄下的 etc/fstab
vim /pxeserver/models/ubuntu/etc/fstab # 這個文件為空 添加以下內容,(若果etc下有mtab,就刪掉mtab,可以不刪)
在最后面添加一句
dev/nfs / nfs defaults 1 1
5.1.5添加啟動項
Ubuntu在initrd鏡像中不提供網絡啟動支持因此你需要創建一個新的initrd.img文件。首先添加下列行到/etc/initramfs-tools/initramfs.conf
這是在制作鏡像的時候需要的,因此,客戶機上安裝的這個工具要修改,自己制作的根目錄也要修改
vim /etc/initramfs-tools/initramfs.conf
vim /pxeserver/models/ubuntu/etc/initramfs-tools/initramfs.conf 添加修改
BOOT=nfs
MODULES=netboot
#修改后就在也無法啟動了,因此不要中途關機
#不然在重啟ubuntu的時候會一只找 nfsmount: need a path
#連recovery 模式都進不去,只能重裝系統,做好后最好修改回來
5.1.5打包客戶端
打包制作的客戶端根目錄,放到centos服務器內解壓
tar -zcvf ubuntu.tar.gz /nfsroot
5.2制做啟動鏡像
由於是直接cp的根目錄所以無需chroot
mkinitramfs -o initrd-ubuntu.img
mkinitramfs -o initrd-ubuntu.nfs
這兩個應該都可以試一試
將制作的initrd-ubuntu.img復制到centos/ubuntu服務器的tftp下/var/lib/tftpboot
拷貝內核到服務器的/var/lib/tfftpboot/
ls /boot/vmlinuz-`uname -r`
5.3制作ubuntu root用戶登錄(這個可能不需要去做,因為我習慣root登錄去做系統,所以就這樣做了)
5.3.1設置root密碼
passwd root
5.3.2修改啟動登錄界面
sudo gedit usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
在最后一行添加greeter-show-manual-login=true
如果要去掉guest用戶添加allow-guest=false
5.4.編寫 ubuntu的啟動參數
5.4.1修改/var/lib/tftpboot/pxelinux.cfg/default
vim /var/lib/tftpboot/pxelinux.cfg/default
添加lable內容:
label Ubuntu-16.04
kernel vmlinuz-ubuntu
append root=/dev/nfs initrd=initrd-ubuntu.img nfsroot=192.168.56.160:/pxeserver/models/ubuntu ip=dhcp rw
5.4.2注意pxelinux.0的使用
問題: 在ubuntu下使用apt install syslinux 時,無論是 /usr/lib/syslinux下 還是/usr/share/syslinux下都沒有pxelinux.0的啟動文件
方法:那是因為ubuntu安裝的syslinux的版本6.03過高造成的,因此需要下載老的版本去找pxelinux.0
wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-4.05.tar.bz2 #參考centos7.6 安裝的為4.05
tar xvf syslinux-4.05.tar.bz2
cd syslinux-4.05/core #pxelinux.0就在這個下面
第6章 ubuntu作為無盤啟動的服務器的方法
6.1參考網址
這個過程與第一章的內容相似,但略有不同
6.1.兩個網址
http://xmodulo.com/diskless-boot-linux-machine.html
https://blog.csdn.net/politefish/article/details/4444417
#這兩個都比較老,僅供參考
6.2環境
所使用的環境是ubuntu16.05 desktop版
安裝依賴庫:
apt install isc-dhcp* tftpd-hpa syslinux nfs* initramfs-tools
apt update
apt upgrade
6.3配置DHCP服務器
6.3.1配置DHCP
vim /etc/dhcp/dhcpd.conf
添加:
allow booting;
allow bootp;
subnet 192.168.56.0 netmask 255.255.255.0 {
range 192.168.56.173 192.168.56.183;
option broadcast-address 192.168.56.255;
option routers 192.168.56.1;
filename "pxelinux.0";
}
注意pxelinux.0參考5.4.2
6.3.2重啟服務器
systemctl status isc-dhcp-server
systemctl start isc-dhcp-server
systemctl enablet isc-dhcp-server
6.4配置tftp服務器
6.4.1修改配置文件
vim etc/default/tftpd-hpa
添加兩行:
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot/"
6.4.2重啟tftp,並修改權限
systemctl status tftpd-hpa.service
systemctl restart tftpd-hpa.service
systemctl enable tftpd-hpa.service
6.4.3添加啟動必須文件到/var/lib/tftpboot/
cp pxelinux.0 /var/lib/tftpboot/ # 復制引導程序,關於pxelinux.0參考5.4.2
cd /var/lib/tftpboot/
mkdir pxelinux.cfg
vim pxelinux.cfg/default
添加:
default Ubuntu
prompt 0
label Ubuntu
kernel vmlinuz
append root=/dev/nfs initrd=initrd.img nfsroot=192.168.56.172:/nfsroot ip=dhcp rw
#拷貝內核鏡像
cp /boot/vmlinuz-`uname -r` /var/lib/tfftpboot/vmlinuz
#拷貝第五章制作的根目錄鏡像
cp initrd.img /var/lib/tfftpboot/
chmod -R 777 /var/lib/tftpboot/
6.4.4/var/lib/tftpboot/下的文件
目錄文件同1.6節的tftpboot
6.5配置NFS服務器
6.5.1創建虛擬根目錄
sudo mkdir /nfsroot
根據第五章將根目錄拷貝到此目錄下5.1.2
6.5.2 配置nfs
vim /etc/exportfs
添加:
/nfsroot *(rw,no_root_squash,async,insecure,no_subtree_check)
sudo exportfs -rv # 刷新nfs
6.5.3重啟nfs
systemctl status nfs-server.service
systemctl restarts nfs-server.service
systemctl enable nfs-server.service
chmod -R 777 /nfsroot
致此ubuntu服務器配置完畢,建議服務器使用固定ip地址
