通过PXE实现NFS Root
前不久做了一个小测试,在一块支持PXE启动的主板上实现了网络NFS启动。主要目的是用来批量测试主板:之前测试主板都要加上DOM卡或者硬盘,频繁的插拔会导致DOM卡或硬盘的损坏,采用网络启动会减少这种硬件损耗。以下为主要的步骤。
1. 将主板接上一块SATA硬盘,连接USB光驱,安装Linux操作系统(以Cent OS为例)。注意安装时要选择开发包。
2. 安装完成后进入Cent OS系统,下载源码(例如linux-2.6.32.tar.gz)包然后解压,在解压生成的目录里,配置.config文件(可以使用make menuconfig或直接vim .config),将以下几项设置为y。
CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_ROOT_NFS=y CONFIG_E1000=y CONFIG_E1000E=y
注意,我测试使用的是Intel千兆网卡,所以上面的配置文件中选定的是Intel千兆网卡的驱动。如果主板使用的其它网卡,就选用对应的驱动。这里很重要,如果没有选择正确的网卡驱动而且没有设置Build-in方式,那么后面启动的时候就会碰到无法找到根目录的情况(我在这里曾经折腾了好长时间,排除防火墙/selinux等原因后发现失败是因为网卡驱动没有正确加载)。
然后编译内核:
# make bzImage # make modules # make modules_install # make install
编译完成后,重启系统,选择从新内核启动。
3. 接下来生成根文件系统。在从新内核启动的系统中,新建一个/rootfs目录,然后将/etc、/bin、/sbin、/usr、/lib、/lib64、/dev和/var目录拷贝到/rootfs目录中,
# cd / # mkdir -p rootfs # chmod -R 777 rootfs # cp -arf /etc /rootfs # cp -arf /bin /rootfs # cp -arf /sbin /rootfs # cp -arf /usr /rootfs # cp -arf /lib /rootfs # cp -arf /lib64 /rootfs # cp -arf /dev /rootfs # cp -arf /var /rootfs # cd /rootfs # mkdir -p proc # rm -rf dev/console # rm -rf dev/null # cd dev # sudo mknod –m 600 console c 5 1 # sudo mknod –m 666 null c 1 3
4. 准备一台服务器(测试时服务器的IP为172.16.30.253)。在服务器上安装dhcp, tftp和syslinux
# yum install xinetd tftp-server tftp # yum install dhcpd # yum install syslinux
5. 配置服务器。首先配置dhcp,
# vim /etc/dhcpd/config allow bootp; allow booting; ddns-update-style interim; next-server 172.16.30.253; filename "/pxelinux.0"; subnet 172.16.30.0 netmask 255.255.255.0 { option routers 172.16.30.253; option subnet-mask 255.255.255.0; option domain-name-servers 172.16.30.253; option time-offset -18000; # Eastern Standard Time range dynamic-bootp 172.16.30.128 172.16.30.254; default-lease-time 21600; max-lease-time 43200; }
配置服务器的tftp:
# cp /usr/lib/syslinux/pxelinux.0 /tftpboot/ # cd /tftpboot # mkdir -p pxelinux.cfg # cd pxelinux.cfg # vim default prompt 0 default linux label linux kernel vmlinuz append init=/sbin/init root=/dev/nfs rw nfsroot=172.16.30.253:/mnt/c ip=dhcp
注意,为了测试方便,以上设定可用single方式来启动。
配置服务器的nfs:
# mkdir -p /mnt/c # chmod -R 777 /mnt/c # vim /etc/exports /mnt/c *(rw,no_all_squash,no_root_squash)
启动各项服务:
# service dhcpd start # service nfs start # service xinetd start
6. 在主板新内核环境中,将第3步中准备好的rootfs复制到服务器的nfs目录下
# mkdir -p /mnt/rootfs # mount 172.16.30.253:/mnt/c /mnt/rootfs # cd /rootfs # cp -rf * /mnt/rootfs # sync
7. 将连接到主板的硬盘拆下,然后检查BIOS中是否已经打开PXE。重启系统,即可以从网络启动。
我写的比较简单。实际过程中,我还参考了这个链接。