红联Linux门户
Linux帮助

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

发布时间:2007-05-29 15:57:13来源:红联作者:firmstre
本文适合有一定Linux经验,熟悉系统安装、grub使用的朋友

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

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

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

第二步:修改initrd文件

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

代码:
title dubuntu
root (hd*,0)
kernel /boot/vmlinuz-2.6.15-23-686 root=/dev/sda1 ro splash
initrd /boot/initrd.img-2.6.15-23-686

也就是说grub通过initrd.img-2.6.15-23-686把系统引导起来,其实这个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 的内容换成如下:

代码:
#!/bin/sh
# set -e

mountpoint=/sys_image
mkdir -p $mountpoint

rootdev=


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

export rootdev


subdevices() {
sysblock=$1
r=""
for dev in "${sysblock}" "${sysblock}"/*; do
if [ -e "${dev}/dev" ]; then
r="${r} ${dev}"
fi
done
echo ${r}
}


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

get_fstype() {
local FSTYPE
local FSSIZE
eval $(fstype < $1)
if [ "$FSTYPE" != "unknown" ]; then
echo $FSTYPE
return 0
fi
/lib/udev/vol_id -t $1 2>/dev/null
}


find_system_partition() {
for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
for dev in $(subdevices "${sysblock}"); do
devname=$(sys2dev "${dev}")
fstype=$(get_fstype "${devname}")
case ${fstype} in
ext2|ext3|reiserfs)
mount -t ${fstype} "${devname}" $mountpoint || continue
if [ -e "$mountpoint/.mobile_system" ]; then
umount $mountpoint
echo "$devname"
return 0
else
umount $mountpoint
fi
;;
esac
done
done
return 1

}


set_usplash_timeout() {
if [ -x /sbin/usplash_write ]; then
/sbin/usplash_write "TIMEOUT 120"
fi
}

mountroot() {
exec 6>&1
exec 7>&2
exec > casper.log
exec 2>&1

set_usplash_timeout
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/casper-premount"
run_scripts /scripts/casper-premount
[ "$quiet" != "y" ] && log_end_msg

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

set_usplash_timeout

log_begin_msg "finding system partition"
for i in 1 2 3 4 5 6; do
sys_partition=$(find_system_partition)
if [ "${sys_partition}" ]; then
break
fi
sleep 2
done
if [ "$?" -gt 0 ]; then
panic "Unable to find a partition containing a system"
fi
log_begin_msg "${sys_partition}"
log_end_msg

rootdev="${sys_partition}"

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


log_end_msg

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

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

exec 1>&6 6>&-
exec 2>&7 7>&-
cp casper.log "${rootmnt}/var/log/"
}


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

代码:
#eject -p -m /cdrom >/dev/null 2>&1

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

#read x < /dev/console

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最后部分可以改一下,不改好像问题也不大

代码:
cat > $FSTAB <# unionfs / unionfs rw 0 0
$rootdev / $(get_fstype "${rootdev}") rw 0 0
tmpfs /tmp tmpfs nosuid,nodev 0 0
EOF

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

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 ,加上如下内容:

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

启动到grub菜单时选它就行。OK!搞定了!洪哥我们动手吧!NO NO NO,别性急,千万别忘了最后一步──

第四步:创建记号文件

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

现在完工了!重启电脑进入BIOS设为从移动硬盘启动,试试能行不。
文章评论

共有 0 条评论