Professional Documents
Culture Documents
2011年5月11日
3:32
用途:
1、多系统爱好者(比如俺),不希望磁盘分区太复杂,但又想使用多系统;
2、为测试系统方便;
3、方便删除系统(删除一个文件,修改启动配置);
。。。
还可以发展更多。。。
背景:
1、GRUB2 bootloader 已经支持loop设备启动(不知道其他的支持得如何);
2、 Arch GNU/Linux 官方的启动脚本无法从loop设备启动
实现步骤:
1、 创建loop文件
dd if=/dev/zero of=/mnt/sda9/Arch/Arch-i686.img bs=1M count=3500
创建一个3.5GB大小的磁盘文件Arch-i686.img 存放到 /mnt/sda9/Arch 目录下
2、 建立文件系统
mkfs.reiserfs /mnt/sda9/Arch/Arch-i686.img
这里只用reiserfs, 要看bootloader的支持程度, 本打算用btrfs的,结果用grub2-btrfs测试启动不
成功
ext2 ext3 ext4 reiserfs 应该是支持的, 很盼望将来grub2-btrfs能完美支持btrfs的loop设备
3、安装(移植)系统到磁盘文件
sudo mount /mnt/sda9/Arch/Arch-i686.img /tmp/install
安装: 不赘述, 很多文档介绍
移植现有Arch GNU/Linux 系统:
sudo tar cvpf - / --exclude=/mnt --exclude=/media --exclude=/sys --exclude=/proc \
--exclude=/var/abs --exclude=/var/cache/pacman/pkg \
--exclude=/var/lib/pacman/sync | sudo tar xvpf - -C /tmp/install
4、修改相关配置
sudo mkdir /tmp/install/sys
修改fstab (/tmp/install/etc/fstab),将挂载/的那行改为
/dev/loop0 / reiserfs defaults 0 1
5、修改启动内核
这个就是重中之重了, 因为目前Arch 官方的启动脚本不支持。 这里就添加一个hook来实现挂在
loop设备
1) 新建 /tm/install/lib/initcpio/hooks/automount 内容:
run_hook ()
{
if [ "x$loopfile" != "x" ]; then
mount_handler="loop_mount_handler"
fi
}
# $1 /new_root
loop_mount_handler ()
{
分区 arch 的第 1 页
{
# 启动参数指定 real_root=loop=/dev/sda1 loopfile=Arch/archlive.disk
# 或者指定 real_root=loop=/dev/disk/by-label/C loopfile=Arch/archlive.disk (label有中文得时候会出
错)
# 或者指定 real_root=loop=/dev/disk/by-uuid/047C-F52A loopfile=Arch/archlive.disk
# 上面的例子中"sda1" "C" "047C-F52A" 根据具体情况对应替代,或者用枪花建议得grub2
自动探测
#echo "run automount hook begin"
# 保险点, 根据Arch目前风格,再检测、创建目录
if [ "x$HOST" = "x" ]; then HOST="/host"; fi
if [ ! -d $HOST ]; then mkdir -p $HOST; fi
if [ ! -d $UNION ]; then mkdir -p $UNION; fi
if [ -f $HOST/$loopfile ]; then
loopfile="$HOST/$loopfile"
fstype=$(blkid -u filesystem -o value -s TYPE -p "${loopfile}")
if [ "${fstype}" = "squashfs" ]; then rwopt="ro"; fi
分区 arch 的第 2 页
if [ "${fstype}" = "squashfs" ]; then rwopt="ro"; fi
#echo "mount -t $fstype -o loop,$rwopt $loopfile $UNION"
mount -t $fstype -o loop,$rwopt $loopfile $UNION
if [ $? -eq 0 ] ; then
echo "mkdir -p $UNION$HOST"
mkdir -p $UNION$HOST
# 将存放loop的分区挂载到目标系统的/host目录下,跟wubi的处理方式相同
#echo "mount -o bind $HOST $UNION$HOST"
mount -o bind $HOST $UNION$HOST
MOUNTED=1
else
echo " mount -t $fstype -o loop,$rwopt $loopfile $UNION error"
fi
else
echo "$HOST/$loopfile is not file"
fi
else
echo "${loop} not exist!"
fi
;;
esac
#echo "run automount hook end"
}
随便写的, 快速实现需要的功能就可以了
2) 新建文件 /tmp/install/lib/initcpio/install/automount 内容如下:
install ()
{
MODULES=" $(checked_modules "/usb/host" | grep -ve "_cs" -e "sl811-hcd" -e "isp116x-hcd")"
help ()
{
cat<<HELPEOF
This hook auto mount the root device base on cmdline.
Can support:
1. Boot from normal harddisk or USB disk;
2. Boot from CD-ROM or DVD-ROM;
3. Boot from loop device file (made by dd or other tools);
4. Boot from squashfs files;
...
HELPEOF
}
3) 修改 /tmp/install/etc/mkinitcpio.conf
在MODULES 中加入 loop
在hooks 最后加入 automount
HOOKS="base udev autodetect pata scsi sata filesystems automount"
4) 重新创建内核镜像
分区 arch 的第 3 页
4) 重新创建内核镜像
sudo mount -o bind /sys /tmp/install/sys
sudo chroot /tmp/install mkinitcpio -p kernel26
到现在为止,磁盘文件准备完成
6、 制作启动
grub2 或者 grub24dos 启动, grub.cfg 相关项如下:
menuentry "Arch i686 (on loop 虚拟盘)" { insmod part_msdos insmod reiserfs insmod loopback #set
img_label=winxp #指定分区卷标label时使用 set img_file=Arch/Arch-i686.img #设定查找标的 search --
file --no-floppy --set=img_root /$img_file #直接搜索loop文件 #search --label --no-floppy --set=img_root
$img_label #查找指定分区卷标label方式 #loopback loop0 (hd0,msdos9)/$img_file #直接指定loop文件
位置 probe $img_root -l --set=img_label #探测分区卷标label ,目标label 不能有中文等无法识别的字符
#probe $img_root -u --set=img_root_uuid #探测uuid 但测试发现因为大小写问题导致linux的by-uuid值
不匹配 loopback loop0 ($img_root)/$img_file set root=(loop0) linux /boot/vmlinuz26
real_root=loop=/dev/disk/by-label/$img_label loopfile=$img_file quiet #linux /boot/vmlinuz26
real_root=loop=/dev/disk/by-uuid/$img_root_uuid loopfile=$img_file quiet # 此处还可以用if等判断,
来灵活使用label或者uuid, 欢迎高手指导 initrd /boot/kernel26-fallback.img }
重新启动即可。
后话:
1、 启动脚本automount 稍作变化, 可以扩展出更多更强的功能, 比如从squashfs 启动, 再挂载
可写分区保存。。。 或者直接挂载内存做成类似PE的rom系统。。。
2、。。。
阅读全文
类别:Arch Linux 查看评论
查看文章...
分区 arch 的第 4 页