设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
Linux 发行版讨论区 —— LinuxSir.cn
›
Archlinux讨论区
›
将Arch GNU/Linux 安装到磁盘文件(loop)
1
2
3
4
5
6
7
8
/ 8 页
下一页
返回列表
查看:
7575
|
回复:
78
将Arch GNU/Linux 安装到磁盘文件(loop)
[复制链接]
carbonjiao
carbonjiao
当前离线
积分
915
IP卡
狗仔卡
发表于 2011-2-25 12:04:40
|
显示全部楼层
|
阅读模式
修订记录:
1. 2011-03-18 木仓花axlrose的指点下,响应修改,功能加强。。。
用途:
1、多系统爱好者(比如俺),不希望磁盘分区太复杂,但又想使用多系统;
2、为测试系统方便;
3、方便删除系统(删除一个文件,修改启动配置);
4、可以做成类似PE的ROM系统;
。。。
还可以发展更多。。。
背景:
1、GRUB2 bootloader 已经支持loop设备启动(不知道其他的支持得如何);
2、 Arch GNU/Linux 官方的启动脚本无法从loop设备启动
实现的效果:
启动文件中存放的Arch GNU/Linux
实现步骤:
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、修改启动内核和loop设备的系统
这个就是重中之重了, 因为目前Arch 官方的启动脚本不支持。 这里就添加一个hook来实现挂在loop设备
1) 新建 /tm/install/lib/initcpio/hooks/automount 内容:
-----------2011-03-22--- 更新 官方模式,可以不用修改init
------------2011-03-18-- 在木仓花的建议下修改, 功能更强大
run_hook ()
{
if [ "x$loopfile" != "x" ]; then
mount_handler="loop_mount_handler"
fi
}
# $1 /new_root
loop_mount_handler ()
{
# 启动参数指定 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"
if [ "x$1" = "x" ]; then
UNION="/new_root"
else
UNION="$1"
fi
# 保险点, 根据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
case ${real_root} in loop\=*)
loop=${real_root/loop=}
case $loop in *by-uuid*)
if [ ! -e $loop ]; then
loop_lowercase="$(dirname $loop)/$(echo $(basename $loop) | tr [:upper:] [:lower:])"
loop_uppercase="$(dirname $loop)/$(echo $(basename $loop) | tr [:lower:] [:upper:])"
if [ -e ${loop_lowercase} ]; then
loop="${loop_lowercase}"
elif [ -e ${loop_uppercase} ]; then
loop="${loop_uppercase}"
fi
fi
;;
esac
if [ -e $loop ]; then
fstype=$(blkid -u filesystem -o value -s TYPE -p "${loop}")
fsopt="-t $fstype"
MOUNT="mount"
if [ "${readwrite}" = "no" ]; then rwopt="ro"; else rwopt="rw"; fi
case $fstype in
ntfs) MOUNT="mount.ntfs-3g"
rwopt="rw"
fsopt=""
;;
vfat) rwopt="rw"
;;
squashfs|iso9660|udf) rwopt="ro"
;;
esac
if [ "x$mountopts" != "x" ]; then
mountopts="-o $mountopts,$rwopt"
else
mountopts="-o $rwopt"
fi
$MOUNT $fsopt $mountopts $loop $HOST
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
#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")"
MODULES=$(echo ${MODULES}) #trim whitespace
if [ -n "${MODULES}" ]; then
MODULES="${MODULES} usb_storage sd_mod sr_mod"
MODULES="${MODULES} $(checked_modules "drivers/usb/storage/ums-*")"
fi
MODULES="${MODULES} nls_utf8 cp936"
BINARIES="blkid mount.ntfs-3g tr"
FILES=""
SCRIPT="automount"
}
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) ----2011-03-22 新automount脚本不需要改init 。。。
5) 重新创建内核镜像
sudo mount -o bind /sys /tmp/install/sys
sudo chroot /tmp/install mkinitcpio -p kernel26
复制代码
到现在为止,磁盘文件准备完成
6、 配置启动
有几种方式:
1) 直接grub2 启动
2) ntldr --> g2ldr 来启动
3) grub --> grub2 启动
。。。 还有好几种
我用的方法2),需要制作g2ldr (不赘述,有相关文档介绍)
grub2 启动配置文件 grub.cfg 启动loop 设备项内容:
--------------2011-03-18---木仓花修改、加强如下, 可以自动搜索。。。 使用卷标、UUID。。。
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、。。。
在此抛砖引玉了, 欢迎探讨。。。
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
carbonjiao
carbonjiao
当前离线
积分
915
IP卡
狗仔卡
楼主
|
发表于 2011-2-25 12:11:29
|
显示全部楼层
$ df
文件系统 1K-块 已用 可用 已用% 挂载点
udev 10240 260 9980 3% /dev
/dev/loop0 3583884 1814712 1769172 51% /
/dev/sda9 10240 260 9980 3% /dev/sda9
shm 509940 388 509552 1% /dev/shm
/dev/sda6 25205252 8516996 15407880 36% /mnt/sda6
/dev/sda9 81920884 9064008 72856876 12% /mnt/sda9
/dev/sda10 84453672 38227280 46226392 46% /mnt/sda10
/dev/loop1 1535948 702852 833096 46% /mnt/cxoffice
/dev/sda7 25205252 2133768 21791108 9% /mnt/sda7
/dev/sda1 15751700 11893804 3857896 76% /mnt/sda1
复制代码
回复
支持
反对
使用道具
举报
显身卡
alpha.gu
alpha.gu
当前离线
积分
677
IP卡
狗仔卡
发表于 2011-2-25 12:14:34
|
显示全部楼层
这个文章有技术性,也是我一直想要学习的,我以前就想过有没有办法实现类似于Wubi的效果,留个脚印。
回复
支持
反对
使用道具
举报
显身卡
carbonjiao
carbonjiao
当前离线
积分
915
IP卡
狗仔卡
楼主
|
发表于 2011-2-25 12:30:35
|
显示全部楼层
前几天看了wubi的代码, 功能很多arch 用不上,希望高手修改。。。
回复
支持
反对
使用道具
举报
显身卡
axlrose
axlrose
当前离线
积分
1466
IP卡
狗仔卡
发表于 2011-2-25 13:01:15
|
显示全部楼层
太棒了,准备试试
到时弄好了的境像直接拷到其他机子的C盘上去,就不用老是用liveusb启动了
回复
支持
反对
使用道具
举报
显身卡
jarryson
jarryson
当前离线
积分
5928
IP卡
狗仔卡
发表于 2011-2-25 14:09:45
|
显示全部楼层
如果这个img文件放在ntfs分区上会是什么效果?读写速度怎么样?ntfs都写速度可是非常非常慢。
回复
支持
反对
使用道具
举报
显身卡
carbonjiao
carbonjiao
当前离线
积分
915
IP卡
狗仔卡
楼主
|
发表于 2011-2-25 14:18:18
|
显示全部楼层
放在ntfs山也可以, 没太大差别, ntfs-3g 挂载速度还可以
我最开始就是放在ntfs 分区上的
但有点, 如果出现强行关机,下次就可能无法启动了,提示需要windows CKDSK。。。 (不过我只测试了内核中默认支持的ntfs挂载)
如果用fuse ntfs-3g 可能会不同
(wubi安装的deepin linux 就在ntfs分区, 用起来很不错的)
回复
支持
反对
使用道具
举报
显身卡
nohappiness
nohappiness
当前离线
积分
72
IP卡
狗仔卡
发表于 2011-2-25 15:57:33
|
显示全部楼层
mark一下
说不定什么时候用得上
回复
支持
反对
使用道具
举报
显身卡
crazyrain
crazyrain
当前离线
积分
223
IP卡
狗仔卡
发表于 2011-2-25 17:28:57
|
显示全部楼层
技术贴啊,支持一下,以后可能用的到。
回复
支持
反对
使用道具
举报
显身卡
黄色蚂蚁
黄色蚂蚁
当前离线
积分
138
IP卡
狗仔卡
发表于 2011-2-25 19:59:26
|
显示全部楼层
收藏了,非常好的技术贴
回复
支持
反对
使用道具
举报
显身卡
下一页 »
1
2
3
4
5
6
7
8
/ 8 页
下一页
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表