有一台线上服务器(简称S),运行 centOS 6.5 系统,闲置了一段时间,再次启动,开启报告,super block 损坏。
为了修复super block,本想找一个系统镜像做一个U盘启动盘,发现竟然没有可用的U盘。所以只能脑洞大开,使用network booting 了.
先把 network booting 的方法描述一下:
1 有一台现成的ubuntu机器(简称U),把 S 和 U 连上同一个交换机。
2 在U上安装 dhcp server 和 tftp server
apt-get install isc-dhcp-server
apt-get install tftpd
3 配置 dhcp server,配置文件 /etc/dhcp/dhcpd.conf ,内容如下:
allow booting;
allow bootp;
# 定义规则来识别来自于PXE和Etherboot客户端的DHCP请求。
class "pxe" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
}
class "etherboot" {
match if substring (option vendor-class-identifier, 0, 9) = "Etherboot";
}
subnet 10.11.0.0 netmask 255.255.255.0 {
option broadcast-address 10.11.0.255;
pool {
default-lease-time 180; # no long lease time required for booting
max-lease-time 360; # booted system does its own dhcp request
server-name "mybootserver";
next-server 10.11.0.121; # in case your local DNS only handles
# unqualified domains keep trailing '.'
filename "pxelinux.0";
allow members of "pxe";
allow members of "etherboot"; # allow etherboot, too
range 10.11.0.120 10.11.0.122;
}
}
注意上面的配置,已经尽量避免局域网内2台dhcp服务器并存造成不利后果,防止U的dhcp干扰网关的DHCP服务运行。
4 配置tftpd,配置文件没有,新建文件 /etc/xinetd.d/tftpd, 内容如下:
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = hhy
server = /usr/sbin/in.tftpd
server_args = -s /home/hhy/tftpd/ubuntu-boot
#source = 11
cps = 100 2
flags =IPv4
}
注意 /home/hhy/tftpd/ubuntu-boot 目录下的所有文件最好 chmod 777 ,防止因为权限的原因不能读取文件。
5 在机器U上启动 dhcp 服务和 tftp 服务
service isc-dhcp-server start
service xinetd restart
6 制作启动根目录,将 U 上的 /boot 下的 vmlinuz 和 initrd.img 拷贝到 /home/hhy/tftpd/ubuntu-boot 下
将 /usr/lib/syslinux/pxelinux.0 拷贝到 /home/hhy/tftpd/ubuntu-boot 下
在 /home/hhy/tftpd/ubuntu-boot 建立目录 pxelinux.cfg,并在pxelinux.cfg目录下新建一个文件名为default的文件,内容如下:
default linux
prompt 1
timeout 30
# Install Linux
label linux
kernel vmlinuz
append initrd=initrd-full.img splash=silent showopts
上面的操作完成后,/home/hhy/tftpd/ubuntu-boot 下ls得到的结果如下:
initrd.img pxelinux.0 pxelinux.cfg vmlinuz
7 启动机器S,按F10,选择从network boot(注意:我的案例是按F10,别的机器可能不是,注意看开机后bios中的提示)。这时候可以看到,S机器成功的找到U了,并从U机器的 /home/hhy/tftpd/ubuntu-boot 启动了,最终进入 initrd 环境。
8 S机器进入initrd后,发现了一个问题。没有fdisk mke2fs e2fsck 这些常用的文件系统命令。于是重新制作一个 initrd.img.方法如下:
cd /home/hhy/tftpd/ubuntu-boot
mkdir tmp && mv initrd.img tmp/initrd.zip
cd tmp && gunzip initrd.zip
cpio -id < ./initrd
cp /sbin/fdisk /sbin/mke2fs /sbin/e2fsck ./sbin
用ldd命令检查 fdisk mke2fs e2fsck 依赖的so模块是否都在当前目录( /home/hhy/tftpd/ubuntu-boot/tmp/)下,经过检查都有。
find ./ | grep -v initrd | cpio -H newc -o | gzip -v -9 > ./initrd.img
cp initrd.img ../initrd-full.img
修改 /home/hhy/tftpd/ubuntu-boot/pxelinux.cfg/default 下的内容,修改 initrd=initrd.img 为 initrd=initrd-full.img
9 重启机器S并再次 network booting,进入 initrd 后,就可以使用 fdisk mke2fs e2fsck 这些命令了。df 命令显示 S 有2个硬盘 /dev/sda /dev/sdd.再用fdisk命令发现这2个盘竟然各有一个 boot 分区。使用 dumpe2fs 发现所有的文件系统都报告超级块找不到,懵了?后来请服务器厂商检查硬盘,原来是硬盘基本报废了,无法修复。