|
|

楼主 |
发表于 2006-6-15 11:47:14
|
显示全部楼层
今天总结了一下我制作u盘linux的心得和体会,也总结了这个文档,希望能对没有作过的朋友有所帮助,在这里要感谢d00m3d和终极幻想两位大大的帮助和鼓励,还要特别感谢springwind426的帮助。文档写的比较仓促,如果有错误还请大家多多指正,完善。
如何制作U盘FC5系统
硬件,OS配置:
1。512M可启动U盘一个。注意有些u盘不支持启动。
2。宿主机一台,其上的OS为最小化安装的FC5(为了防止不必要的麻烦,请不要使用selinux)。因为我暂时没想裁减FC5,
而是想通过直接拷贝的方式把宿主机的FC5拷贝到U盘中,所以只有最小化安装FC5了。
3。Kernel Version:2.6.15
步骤:
一。插入U盘,分区,格式化。假设U盘设备为/dev/sda
# fdisk /dev/sda
我分了2个区sda1和sda2,sda1准备用来挂载根分区,sda2用来挂载swap。
sda1分了大概440M,其他的分给了swap。也不知道这样合理不,还望指正。
# mkfs.ext3 /dev/sda1
# mkswap /dev/sda2
二。用拷贝(cp)或系统传送(rsync)方式把宿主机的FC5拷贝到U盘的第一个分区。这里我用的是cp直接拷贝。
a)首先挂载sda1,假设挂载点为/mnt/sda1
# mount /dev/sda1 /mnt/sda1
b)拷贝文件(连同文件属性,注意cp的参数),注意不要拷贝/sys /proc目录,因为这是系统启动时要自动挂载的与系统相关的信息。
# cp -aRpf /bin /dev /home /root /var /boot /etc /lib /opt /sbin /srv /usr /mnt/sda1
# cd /mnt/sda1
# mkdir proc sys mnt tmp selinux media
三。修改/mnt/sda1/etc/fstab来对应你U盘的正确分区信息。
我的fstab内容如下:
/dev/sda1 / ext3 defaults 1 1
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/sda2 swap swap defaults 0 0
清空/mnt/sda1/etc/mtab的内容:
echo > /mnt/sda1/etc/mtab
四。生成合适的initrd.img内核镜像文件,这步是最重要的,也是问题最多的地方。
因为要想成功启动U盘中的linux系统,首先要让内核支持U盘,这里我还不想通过编译内核来支持,
就通过修改生成合适的initrd.img内核镜像文件来达到目的。如果你还不清楚内核镜像文件的用处,请参考我上面提到的帖子。
法一:
a) 制作usbinitrd.img:
# mkinitrd --fstab=/mnt/sda1/etc/fstab --preload=ehci-hcd --preload=usb-storage --preload=scsi_mod --preload=sd_mod /mnt/sda1/boot/usbinitrd.img `uname -r`
这样就在/mnt/sda1/boot下生成了usbinitrd.img内核镜像文件。
法二:
合适的内核镜像文件需要在你的U盘系统中生成,但是现在不能启动你的U盘系统,所以我们要通过chroot,并挂载/sys /proc来达到这个目的。
a)挂载sys proc到/mnt/sda1/sys和/mnt/sda1/proc
# mount -t proc /proc /mnt/sda1/proc
# mount -t sysfs /sys /mnt/sda1/sys
# chroot /mnt/sda1/
# mkinitrd --preload=ehci-hcd --preload=usb-storage --preload=scsi_mod --preload=sd_mod /mnt/sda1/boot/usbinitrd.img `uname -r`
注意这个mkinitrd的参数--preload就是在initrd.img中加入识别U盘所需要的内核模块,并延时几秒让U盘初始化完毕。
这和你手动修改init文件或者linuxrc文件加入相关模块是一个效果。
b)卸载proc,sys
# umount proc
# umount sys
b)回到以前的根目录
# exit
c)这样就在/mnt/sda1/boot下生成了usbinitrd.img内核镜像文件。
注意:
1。不同的发行版可能内核镜像文件的制作过程可能不一样,但就是想达到一个目的,让内核识别U盘,并成功挂载根文件系统。
上面的那个mkinitrd命令其实就是在initrd.img中的init文件中加入了对U盘的模块支持,并延时8秒,让U盘初始化完毕,
这样就可以找到根文件系统,要不然可能会产生kernel panic的经典错误。
2。你也可以打开你制作的usbinitrd.img镜像文件,来修改init文件,达到你特定的目的。具体的命令如下:
# gunzip -S .img usbinitrd.img
# cpio -icvdumBI usbinitrd
这样就在当前目录下解开了usbinitrd.img,你可以查看和修改init文件来达到你的目的。
在修改init完毕后,可通过下列命令生成新的img:
在当前目录下(你的镜像文件解开的所在地)
# find . | cpio -c -o > ../newusbinitrd.img
# gzip ../newusbinitrd.img
3。其实刚才chroot的目的就是想生成和你U盘分区对应的usbinitrd.img文件,你也可以不chroot,
而在mkinitrd命令中使用参数--fstab来指定你的fstab所在,具体用法请man mkinitrd。
4。由于所用的发行版不同,initrd.img文件的制作有可能不同。
而内核镜像文件可以有好几种不同的格式,这里使用的是cpio文件格式。
五。修改/mnt/sda1/boot/grub/grub.conf和/mnt/sda1/boot/grub/device.map文件,并安装grub到u盘的MBR
1。我的grub.conf内容如下:
default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.15-FromUsb)
root (hd0,0)
kernel /boot/vmlinuz-2.6.15 selinux=0 ro root=/dev/sda1
initrd /boot/usbinitrd.img
注意:
a)如果你对grub硬件的排序方式不了解,请参见d00m3d大大的相关文章。
b)请关闭selinux,因为他可能会在你启动阶段给你带来莫名奇妙的错误,
我就是因为忽视了selinux而用了一整天的时间才把u盘系统启动起来。
2。我的device.map内容如下:
(hd0) /dev/sda
3。安装grub到u盘的MBR
#grub
grub> root (hd1,0)
grub> setup (hd1)
grub> quit
注意,这里的hd1是你的u盘。
4。卸载u盘
# umount /mnt/sda1
六。重启系统,调整BIOS启动顺序
# reboot
把第一启动项改为usb-hdd,如果你的主板不支持u盘启动,那就换一台支持的来试试吧。
参考文档和相关帖子:
http://www.vigla.eclipse.co.uk/usb_install.pdf
http://simonf.com/usb
http://www.linuxsir.cn/bbs/showthread.php?t=211021
http://www.linuxsir.cn/bbs/showthread.php?t=229784
http://www.linuxsir.cn/bbs/showthread.php?t=189080
http://www.linuxsir.cn/bbs/showthread.php?t=184629
http://www.linuxsir.cn/bbs/showthread.php?t=113586
http://52cg.com/Training/system/Linux/200606/54898.html
还有我想问一下阿,我按照http://www.vigla.eclipse.co.uk/usb_install.pdf
文档所说的方法,像直接用fc5安装光盘把fc5装入u盘,可是怎么还是不行呢?还是找不见u盘,只能识别本地硬盘/dev/hda |
|