45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:启动Hiweed硬盘的步骤

启动Hiweed硬盘的步骤

2016-08-30 05:02:15 来源:www.45fan.com 【

启动Hiweed硬盘的步骤

 

1. Hiweed 简介

Hiweed 是 www.hiweed.com 的成员根据 Linux 的发行版 xubuntu 专为中国用户修改的一个 Linux 版本。在其中加入了 LumaQQ、Gaim、Firefox 中文版,并且删除了一些不常用的软件。Hiweed 启动速度快,运行时占用资源少。其宗旨是“解除新手的痛苦,节省老手的时间”。

2. 起因

首先从 http://www.hiweed.com/ 下载了 Hiweed 的 ISO 文件,但是我又没有 CD 刻录机,所以只能想为法从硬盘来启动它。
根据 http://www.hiweed.com/node/96 的文档说明,Hiweed 确实可以从硬盘来启动。虽然也可以起动 Hiweed,但是毕竟里面提供的那个启动文件是对于 Ubuntu 的。而且,在上面的那个网址中下载的文件,用它们在我的电脑上从硬盘启动 Hiweed 之后,分辨率只能是 640x480 (我是在我的 845GVSR 主板的台式机上试验的)。是否能用 Hiweed 的 ISO 里面提供的文件来实现硬盘启动呢?

3. 分析

将 ISO 中的 casper 目录及内容复制到硬盘的某个盘的根目录下(分区的格式最好是 FAT32)。casper 目录中有个 600MB 左右的 filesystem.squashfs 文件,这就是整个 LiveCD 的主体文件(注1)。 其中还有一个 initrd.gz 文件和一个 vmlinuz 文件,这两个是启动时需要的关键文件(注2)。
要从硬盘启动,还需要 Grub(注3)。在 Grub 的 menu.lst 里面添加如下说明(我将 casper 目录放在 D 盘,Grub 里面是 (hd0,4) 表示):

title Hiweed
kernel (hd0,4)/casper/vmlinuz boot=casper ramdisk_size=1048576 root=/dev/ram rw quiet splash --
initrd (hd0,4)/casper/initrd.gz

从光盘复制出来的这两个文件本来是为 Hiweed 从光盘启动而制做的,所以直接想用来实现硬盘启动是不行的。这样从硬盘启动,到达 "Mounting root file system..." 时,由于找不到放在光盘中的 casper 目录,所以无法继续启动。其实我们只要把启动脚本中从光盘寻找 casper 目录改成让它从硬盘寻找就行了。

4. 实现

initrd.gz 在 WinXP 中用 WinRAR 就可以解开它。解开后得到一个 15MB 左右的 initrd 文件,这是一个 cpio 打包的文件(注4)。其中含有 Linux 启动时最基本的配置脚本和一些基本的可执行文件。
cpio 打包的文件在 Linux 下用以下命令解压:

cpio -idvm < initrd

“initrd”是要解压的文件的名称。在解压后的所有文件中有个 scripts 目录,其下有个 casper 文件。这个就是启动时首先读取的脚本。我们需要修改的内容也在这里面。用文本编辑器打开它,找到 “find_cd()”这里,有如下代码:

find_cd() {
mounted=
for sysblock in $(echo /sys/block/* | tr ' ' '/n' | grep -v loop | grep -v ram); do
devname=$(sys2dev "${sysblock}")
fstype=$(get_fstype "${devname}")
if /lib/udev/cdrom_id ${devname} > /dev/null; then
mount -t ${fstype} -o ro "$devname" $mountpoint || continue
if casper_path $mountpoint; then
echo $(casper_path $mountpoint)
return
else
umount $mountpoint
fi
elif is_usb_device "$sysblock"; then

for dev in $(subdevices "${sysblock}"); do
devname=$(sys2dev "${dev}")
fstype=$(get_fstype "${devname}")
case ${fstype} in
vfat|iso9660|udf)
mount -t ${fstype} -o ro "${devname}" $mountpoint || continue
if casper_path $mountpoint; then
echo $(casper_path $mountpoint)
return
else
umount $mountpoint
fi
;;
esac
done

elif [ "${fstype}" = "squashfs" ]; then

# This is an ugly hack situation, the block device has
# a squashfs image directly on it. It's hopefully
# casper, so take it and run with it.

ln -s "${devname}" "${devname}.${fstype}"
echo "${devname}.${fstype}"
return
fi

done
}

从上面的代码来看,其实红色字的部分应该也可以实现从硬盘启动的,不知道为什么不行。没关系,我们只要它从硬盘开始搜索 casper 目录的位置的代码就行了。把这些上面这些代码的蓝色部分都注释掉(在此行代码最前面加上 # 号,就像上面绿色部分一样)。完成之后保存。然后再用 cpio 打包回去就行了。
但是,要用 cpio 解开又打包,那就得装有 Linux 才行。其实在 WinXP 下同样也可以完成这样的修改。
这个经过 cpio 打包的 initrd 文件且没有被压缩,所以可以直接编辑它的内容。在 cpio 打包好的文件中,各各内含在里面的文件有一定的上下文关系,如果增加或减少了里面的内容,就会导致修改位置后面的一些文件与原来标记的位置不符,所以无法被正常读龋但是只要能保持原来在里面的文件的位置关系,还是可以修改某些内容的。
在 WinXP 下用 UltraEdit 之类的编辑器打开,搜索到 find_cd() 代码的位置。修改时不能增加或减少字节,同时又要使相应的行被注释。每行代码前面都有很多空格,只要选其中一个空格,把它改成“#”,就可以达到目的了。完成之后用 zip 压缩,改名为 initrd.gz 替换掉原来那个就可以从硬盘启动了。启动时的引导界面和用光盘启动的一模一样。

5. 疑问

上面 find_cd() 的代码中,红色的部分应该也可以让程序搜索硬盘从而从硬盘启动的。

if /lib/udev/cdrom_id ${devname} > /dev/null; then # 如果设备是光驱,就加载这个设备看看是否有相关文件

elif is_usb_device "$sysblock"; then # 如果设备不是 USB 设备,就加载这个设备看看是否有相关文件

为什么代码中只保留红色部分时可以从硬盘启动,而代码全部保留时就不能?即使简单的把 is_usb_device() 的返回值都改成 1 也不行。

 

6. 参考文献

注1 http://squashfs.sourceforge.net/
注2 http://soft.yesky.com/os/lin/217/2145217.shtml
注3 http://dreammengjian.blog.hexun.com/3961110_d.html
注4 http://www.gnu.org/software/cpio/

 

 

本文地址:http://www.45fan.com/a/question/69561.html
Tags: 简单 启动 Hiweed
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部