科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道从USB移动硬盘上引导Portable Linux详解(2)

从USB移动硬盘上引导Portable Linux详解(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

从USB移动硬盘上引导Portable Linux详解

作者:sadman 来源:赛迪网 2007年9月27日

关键字: usb portable Linux 操作系统

  • 评论
  • 分享微博
  • 分享邮件
 

#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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章