扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
#cd ..(回到newinitrd目录下)
#vi init 开始修改:
以下是我的init文件,请不要直抄而是按你的init的当前情况修改:
#!/bin/nash
mount -t proc /proc /proc (这里是第一个关键,有可能有些版本的mkinitrd会把这个mount放在后面,这样usb模块的加载有可能就不能正常工作)
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading jbd.ko module" (从这里开始,依次先加载jdb和ext3,文件系统支持)
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading scsi_mod.ko module" (再加载scsi支持,其实前面我漏了一个,scsi_mod.ko的复制,要真完只是抄,估计不一定能做成功)
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
echo "Loading BusLogic.ko module" (这是VMWare虚拟机要用的BusLogic驱动,如果不是为了同一个内核也启动在VMWare里,那这个删了或没有或省去都不重要)
insmod /lib/BusLogic.ko
insmod /lib/usbcore.ko (从这里依次加载usb核心模块、1.1总线支持、2.0总线支持、最后加载usb-storage)
echo "Loading USB 1.1 Host Driver"
insmod /lib/uhci-hcd.ko
echo "Waiting for Device Ready"
echo "Loading USB 2.0 Host Driver"
insmod /lib/ehci-hcd.ko
echo "Waiting for Device Ready"
echo "Loading USB-Storage Driver"
insmod /lib/usb-storage.ko
(关键在这里,加载完usb-storage后不能马上继续引导,要等数秒钟让设备就序)
sleep 10
insmod /lib/ub.ko
(我这里是启动了一个ash来等着调试,实际使用完全不需要)
busybox ash
mkblkdevs
resume LABEL=SWAP-sda6
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro sda5
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot
这里是2.6核心的,相对来说,2.6带的usb驱动适应能力也比2.4的强了一些,在2.4版下,我试过需要先加载usbcore,再加载usb-storage(己经支持存储设备而没有发现设备),再加载uhci-hcd,让设备进入1.0总线,并等待10秒,再加载ehci-hcd,让设备离开1.0总线进入2.0总线,并等待10秒,最后才加载scsi-sd,得到scsi硬盘设备,还得再用sfdisk -R /dev/sda强制重新读取硬盘分区。
第十步也是最后一步,把整个newinitrd目录重新新成initrd.img文件并放回boot目录下,向grub.conf增加一个2.6.21从usb引导的选择项。并重启测试其正常情况:
保持在newinitrd目录下:
#findall . | cpio --quiet -c -o > ../usbboot
#cd ..
#gzip -9 usbboot
#cp usbboot.gz /boot/initrd-2.6.21.1-usb.img
这个时候,/boot下就有一个可用于从USB硬盘上引导的initrd镜像了。
最后就是修改grub.conf了:
cat /etc/grub.conf
title Fedora Core (2.6.21.1)
root (hd0,0)
kernel /vmlinuz-2.6.21.1 ro root=LABEL=/
initrd /initrd-2.6.21.1.img
title Fedora Core USB Boot(2.6.21.1)
root (hd0,0)
kernel /vmlinuz-2.6.21.1 ro root=LABEL=/
initrd /initrd-2.6.21.1-usb.img
我只是复制了原来的一个引导项,相应地把initrd这一行改成了新的文件名,把title加上了USB Boot字样,其它的原样照搬。
到这里就可以shutdown虚拟机里的操作系统,关闭虚拟机,重启电脑,选择从移动硬盘上启动,顺利的话,你的移动硬盘上的linux就引导起来了。
后话:
其实我认为完全可以通过修补mkinitrd就能做直接编译完内核后make install生成支持从USB移动硬盘上引导的内核来,估计已经有linux爱好者和开发者完成了这项工作,不过玩和用linux的其中一个乐趣就是通过动手来了解系统的原理,因此我也没有动手去改mkinitrd。
如果成功地从移动硬盘上引导了Linux后,再装上VMWare For Linux或是再用qemu,又可以从虚拟机里引导出宿主机盘上的windws来了,只不过,我的本本上装的是OEM版的XP,引导后由于硬件环境改变,该死的M$要求我激活它(想想我也没有违反最终用户许可协议吧,在不同时使用的情况下有权在另一台机器上安装同样的副本以作备用,而且....我用的是同一台机器呀。)怀念使用盗版Windows 2K的时候。
在Linux下的虚拟机中引导出原来宿主机上的Windows来的时候,这样的系统,什么时候谁是谁的宿主,谁是谁的寄生虚拟?
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者