首先,chroot 进入加密分区,并创建启动设备挂载点
chroot /mnt/efs mkdir /loader |
然后,创建初始 ramdisk (initrd),后续需要用到
cd dd if=/dev/zero of=initrd bs=1k count=4096 mke2fs -F initrd mkdir ramdisk mount -o loop initrd ramdisk |
如果您正在使用 grsecurity,您可能会收到 "Permission denied" 错误消息;在这种情况下,您必须在 chroot 之外运行 mount 命令。
创建文件系统层次结构并在其中复制所需的文件
mkdir ramdisk/{bin,dev,lib,mnt,sbin} cp /bin/{bash,mount} ramdisk/bin/ ln -s bash ramdisk/bin/sh mknod -m 600 ramdisk/dev/console c 5 1 mknod -m 600 ramdisk/dev/hda2 b 3 2 mknod -m 600 ramdisk/dev/loop0 b 7 0 cp /lib/{ld-linux.so.2,libc.so.6,libdl.so.2} ramdisk/lib/ cp /lib/{libncurses.so.5,libtermcap.so.2} ramdisk/lib/ cp /sbin/{losetup,pivot_root} ramdisk/sbin/ |
如果您看到类似 "/lib/libncurses.so.5: No such file or directory" 或 "/lib/libtermcap.so.2: No such file or directory" 的消息,那没关系;bash 只需要这两个库中的一个。您可以使用以下命令检查实际需要哪一个:
ldd /bin/bash |
编译 sleep 程序,这将防止密码提示被内核消息(例如注册的 usb 设备)淹没。
cat > sleep.c << "EOF" #include <unistd.h> #include <stdlib.h> int main( int argc, char *argv[] ) { if( argc == 2 ) sleep( atoi( argv[1] ) ); return( 0 ); } EOF gcc -s sleep.c -o ramdisk/bin/sleep rm sleep.c |
创建 init 脚本
cat > ramdisk/sbin/init << "EOF" #!/bin/sh /bin/sleep 3 echo -n "Enter seed value: " read SEED /sbin/losetup -e aes256 -S $SEED /dev/loop0 /dev/hda2 /bin/mount -r -n -t ext3 /dev/loop0 /mnt while [ $? -ne 0 ] do /sbin/losetup -d /dev/loop0 /sbin/losetup -e aes256 -S $SEED /dev/loop0 /dev/hda2 /bin/mount -r -n -t ext3 /dev/loop0 /mnt done cd /mnt /sbin/pivot_root . loader exec /usr/sbin/chroot . /sbin/init EOF chmod 755 ramdisk/sbin/init |
卸载回环设备并压缩 initrd
umount -d ramdisk rmdir ramdisk gzip initrd mv initrd.gz /boot/ |
我强烈建议您使用只读介质(例如可引导 CD-ROM)启动系统。
下载并解压 syslinux
wget http://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.07.tar.bz2 tar -xvjf syslinux-3.07.tar.bz2 |
配置 isolinux
mkdir bootcd cp /boot/{vmlinuz,initrd.gz} syslinux-3.07/isolinux.bin bootcd echo "DEFAULT /vmlinuz initrd=initrd.gz ro root=/dev/ram0" \ > bootcd/isolinux.cfg |
创建并刻录可启动的 cd-rom iso 镜像
mkisofs -o bootcd.iso -b isolinux.bin -c boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -J -hide-rr-moved -R bootcd/ cdrecord -dev 0,0,0 -speed 4 -v bootcd.iso rm -rf bootcd{,.iso} |
如果您碰巧丢失了可引导 CD,启动分区可能会派上用场。请记住,hda1 是可写介质,因此不安全;仅在紧急情况下使用!
创建并挂载 ext2 文件系统
dd if=/dev/zero of=/dev/hda1 bs=8192 mke2fs /dev/hda1 mount /dev/hda1 /loader |
复制内核和初始 ramdisk
cp /boot/{vmlinuz,initrd.gz} /loader |
如果您使用 grub
mkdir /loader/boot cp -av /boot/grub /loader/boot/ cat > /loader/boot/grub/menu.lst << EOF default 0 timeout 10 color green/black light-green/black title Linux root (hd0,0) kernel /vmlinuz ro root=/dev/ram0 initrd /initrd.gz EOF grub-install --root-directory=/loader /dev/hda umount /loader |
如果您使用 lilo
mkdir /loader/{boot,dev,etc} cp /boot/boot.b /loader/boot/ mknod -m 600 /loader/dev/hda b 3 0 mknod -m 600 /loader/dev/hda1 b 3 1 mknod -m 600 /loader/dev/hda2 b 3 2 mknod -m 600 /loader/dev/hda3 b 3 3 mknod -m 600 /loader/dev/hda4 b 3 4 mknod -m 600 /loader/dev/ram0 b 1 0 cat > /loader/etc/lilo.conf << EOF lba32 boot=/dev/hda prompt timeout=60 image=/vmlinuz label=Linux initrd=/initrd.gz read-only root=/dev/ram0 EOF lilo -r /loader umount /loader |