LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1948|回复: 7

把dubuntu安装至移动硬盘、并可在不同电脑上启动、运行的方法

[复制链接]
发表于 2006-9-19 18:28:54 | 显示全部楼层 |阅读模式
很早就有这样的想法,也学习了sir论坛savagePig兄的帖子“最简单的制作从USB启动的系统的方法”,获益良多,但发现用某些版本的内核时

,在有sata硬盘的机子上,会把移动硬盘认成sdb,而没有sata硬盘时就会认成sda,这样在不同的机子上有可能需要修改GRUB菜单中的

“root=/dev/sd**”项才能启动;另外为了应对不同的显卡,要用VESA驱动,不但性能低(看片不大爽),而且在某些显卡上(如i810)只能

用640*480的分辨率,这样一来还得手动修改显卡配置文件。不是很完美。
于是想到live cd能很好地识别硬件,能否利用一下呢?苦于不知如何下手。这时无意中看到了ubuntu中文论坛上gnix_oag兄的帖子,受到启发

,便拿dubuntu来试验,从中学习了gnix_oag兄和lvjinhua兄的脚本,几经摸索,终于感觉比较成熟了,拿出来请sir坛高人们指教(不是故作

谦虚,我可不谦虚,只是sir坛上的高人实在太多了,怕怕……呵呵)。

(本文适合有一定linux经验,熟悉系统安装、grub使用的朋友)

第一步:把dubuntu安装到移动硬盘上

1.到www.dubuntu.com下载dubuntu的 ... -livecd-i386.iso。
2.光盘里有个hd_boot-686文件夹,按照里面的readme说明,可以把iso从硬盘直接引导起来,不用刻盘。
3.引导起来后,运行桌面上的“DUBUNTU简易安装程序”,按照提示安装到移动硬盘(假设安装到第一分区,下文均按此假设来描述;当然也可

以先安装到本地硬盘上,等做好设置后再拷到移动硬盘上)。

第二步:修改initrd文件

这里是关键了。我们知道此时系统的grub菜单里会有类似下面的内容:


  1. title   dubuntu
  2. root    (hd*,0)
  3. kernel  /boot/vmlinuz-2.6.15-23-686 root=/dev/sda1 ro splash
  4. initrd  /boot/initrd.img-2.6.15-23-686
复制代码


也就是说grub通过initrd.img-2.6.15-23-686把系统引导起来(原理参看 “ LinuxSir.Org > Linux 综合讨论区 —— LinuxSir.Org > Linux

基础建设讨论专版 > initrd 有什麼用?[附原理详解] ”)。
其实这个initrd.img-2.6.15-23-686文件里包含有3种启动方式:live cd启动方式、本地启动、网络启动。启动时选用哪一种,是由grub菜单

和initrd.img-2.6.15-23-686里面的脚本来控制的。上面的写法就是指定了由本地启动。而我们的目的是要用live cd方式启动,这样就可以检

测硬件;不过以live cd方式启动后,对系统所作的设置是无法保存的,重启后又恢复了最初的样子,所以我们要对initrd.img-2.6.15-23-686

作些修改。  

启动到刚才装好的系统里(在其它合适的系统里操作也可以,而我自己是在dubuntu里做的,所以就这样来描述了),将/boot/initrd.img-

2.6.15-23-686复制一份到桌面,改名为initrd.img-2.6.15-23-686.gz,双击,将会自动由解压软件打开,里面是一个cpio格式的包文件,将

它解压缩到某文件夹如:/home/dubuntu/123。
打开终端,进入该目录 cd /home/dubuntu/123 ,运行命令 cpio -iF initrd.img-2.6.15-23-686,解出包里的内容;打开/home/dubuntu/123

文件夹,删除initrd.img-2.6.15-23-686,并修改以下文件:


1. ……/123/scripts/casper 的内容换成如下:


  1. #!/bin/sh
  2. # set -e

  3. mountpoint=/sys_image
  4. mkdir -p $mountpoint

  5. rootdev=


  6. [ -f /etc/casper.conf ] && . /etc/casper.conf

  7. export  rootdev


  8. subdevices() {
  9.     sysblock=$1
  10.     r=""
  11.     for dev in "${sysblock}" "${sysblock}"/*; do
  12.         if [ -e "${dev}/dev" ]; then
  13.             r="${r} ${dev}"
  14.         fi
  15.     done
  16.     echo ${r}
  17. }


  18. sys2dev() {
  19.     sysdev=${1#/sys}
  20.     echo "/dev/$(udevinfo -q name -p ${sysdev} 2>/dev/null|| echo ${sysdev##*/})"
  21. }

  22. get_fstype() {
  23.     local FSTYPE
  24.     local FSSIZE
  25.     eval $(fstype < $1)
  26.     if [ "$FSTYPE" != "unknown" ]; then
  27.         echo $FSTYPE
  28.         return 0
  29.     fi
  30.     /lib/udev/vol_id -t $1 2>/dev/null
  31. }


  32. find_system_partition() {
  33.         for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
  34.                 for dev in $(subdevices "${sysblock}"); do
  35.                     devname=$(sys2dev "${dev}")
  36.                     fstype=$(get_fstype "${devname}")
  37.                     case ${fstype} in
  38.                         ext2|ext3|reiserfs)
  39.                             mount -t ${fstype} "${devname}" $mountpoint || continue
  40.                       if [ -e "$mountpoint/.mobile_system" ]; then
  41.                          umount $mountpoint
  42.                          echo "$devname"
  43.                          return 0
  44.                      else
  45.                          umount $mountpoint
  46.                      fi
  47.                                                 ;;
  48.                     esac
  49.                 done
  50.         done
  51.         return 1

  52. }   


  53. set_usplash_timeout() {
  54.     if [ -x /sbin/usplash_write ]; then
  55.         /sbin/usplash_write "TIMEOUT 120"
  56.     fi
  57. }

  58. mountroot() {
  59.     exec 6>&1
  60.     exec 7>&2
  61.     exec > casper.log
  62.     exec 2>&1

  63.     set_usplash_timeout
  64.     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/casper-premount"
  65.     run_scripts /scripts/casper-premount
  66.     [ "$quiet" != "y" ] && log_end_msg

  67.     # Needed here too because some things (*cough* udev *cough*)
  68.     # changes the timeout

  69.     set_usplash_timeout

  70. log_begin_msg "finding system partition"
  71.     for i in 1 2 3 4 5 6; do
  72.         sys_partition=$(find_system_partition)
  73.         if [ "${sys_partition}" ]; then
  74.             break
  75.         fi
  76.         sleep 2
  77.     done
  78.     if [ "$?" -gt 0 ]; then
  79.         panic "Unable to find a partition containing a system"
  80.     fi
  81. log_begin_msg "${sys_partition}"
  82. log_end_msg

  83.     rootdev="${sys_partition}"

  84.     mount -t $(get_fstype "${sys_partition}") "$sys_partition" "$rootmnt"


  85.     log_end_msg

  86.     maybe_break casper-bottom
  87.     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/casper-bottom"

  88.     PATH=/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:$PATH run_scripts /scripts/casper-bottom
  89.     [ "$quiet" != "y" ] && log_end_msg

  90.     exec 1>&6 6>&-
  91.     exec 2>&7 7>&-
  92.     cp casper.log "${rootmnt}/var/log/"
  93. }
复制代码





2. ……123/lib/casper/shutdown 后面一部分内容注释掉或删除


  1. #eject -p -m /cdrom >/dev/null 2>&1

  2. # XXX - i18n
  3. #echo -n "Please remove the disc, close the tray (if any) and press ENTER: "
  4. #if [ -x /sbin/usplash_write ]; then
  5. #    /sbin/usplash_write "TIMEOUT 0"
  6. #    /sbin/usplash_write "TEXT Please remove the disc, close the tray (if any)"
  7. #    /sbin/usplash_write "TEXT and press ENTER to continue"
  8. #fi

  9. #read x < /dev/console

  10. exit 0
复制代码


注意最后一句 exit 0 得留着!


3. 删除  ……123/scripts/casper-bottom 中无用的脚本,改12fstab

这里的脚本就是用来检测、配置硬件的,经试验,留下8个即可:
12fstab  20xconfig           23networking     31disable_update_notifier
13swap   22gnome_panel_data  30accessibility  32disable_hibernation

为了完美起见,12fstab最后部分可以改一下,不改好像问题也不大

  1. cat > $FSTAB <<EOF  
  2. # unionfs / unionfs rw 0 0
  3. $rootdev / $(get_fstype "${rootdev}") rw 0 0
  4. tmpfs /tmp tmpfs nosuid,nodev 0 0
  5. EOF

  6. rm -f /root/etc/rcS.d/S10checkroot.sh

  7. log_end_msg
复制代码


OK!这样就改好了,可以攒起来了。还是打开终端进入 /home/dubuntu/123 目录,运行命令

find . | cpio -L -o -H newc | gzip -9 > ../initrd.686m.gz

等命令执行完,在/home/dubuntu 文件夹里就会出现我们需要的 initrd.686m.gz 文件! 把它拷到 /boot 里备用。



第三布:修改GRUB菜单

以移动硬盘第一分区作为root,把grub安装到移动硬盘上;然后修改grub菜单  /boot/grub/menu.lst ,加上如下内容:

  1. title   Dubuntu 686m
  2. kernel  (hd0,0)/boot/vmlinuz-2.6.15-23-686 boot=casper ramdisk_size=1048576 root=/dev/ram rw splash
  3. initrd  (hd0,0)/boot/initrd.686m.gz
复制代码

启动到grub菜单时选它就行。

OK!搞定了!洪哥我们动手吧!NO NO,别性急,千万别忘了最后一步──


第四步:创建记号文件

在移动硬盘第一分区──也就是系统所在的分区──的根目录下创建一个文件,命名为  .mobile_system ,用它来标记系统所在的分区。

现在完工了!重启电脑进入BIOS设为从移动硬盘启动,试试能行不?
发表于 2006-10-5 23:21:39 | 显示全部楼层
皮同学,我顶你.....
回复 支持 反对

使用道具 举报

发表于 2006-10-7 14:56:43 | 显示全部楼层
support yixia!But i do now know whether my ubuntu 6.06  LTS can be installed on the Eternal USB Hard Disk like using LiveCD
回复 支持 反对

使用道具 举报

发表于 2006-10-7 20:25:47 | 显示全部楼层
你怎么知道 hd0,0 是目标计算机上移动硬盘的序号?这个序号是怎样确定的呢?

另外,USB 移动硬盘上的程序运行起来太慢了,还是需要固定 IDE 上的 SWAP 分区
回复 支持 反对

使用道具 举报

发表于 2006-10-7 22:27:12 | 显示全部楼层
Post by stephenwong
你怎么知道 hd0,0 是目标计算机上移动硬盘的序号?这个序号是怎样确定的呢?


linux系统中,hd*或sd*是按照IDE口,主从顺序命名的. 但在grub引导时,将自身所在的盘(启动盘)默认为hd0.两者顺序略有不同
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-15 10:46:16 | 显示全部楼层
哈哈,拖鞋正解.从哪个盘启动,哪个盘就是HD0

拖鞋是陈同学??

顺便补充一下,这个方案还有待改进,只是现在抽不出时间,等春节吧,再与大家仔细探讨!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-15 11:13:12 | 显示全部楼层
to kongling123: 可以的,应该 :)
TO STEHPENWONG:
1、USB2.0 可以达到20MB/S,够了。以后有了E-SATA,HOHO,就爽了。
2、移动硬盘上也可以划出交换分区嘛

我的理想是每个人拿个移动硬盘,走到哪里都可以用自己的系统……
回复 支持 反对

使用道具 举报

发表于 2006-10-19 23:29:00 | 显示全部楼层
Post by ptptptptptpt


拖鞋是陈同学??



靠,这么帅的名字,除了我还有谁?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表