作者czm (czm)
看板Linux
标题Re: [心得] 闲聊+双系统另种选择 loopdevice
时间Tue Jul 4 07:25:06 2017
继上次完全使用loopfiles boot起来後
後续发现有些不明情况 会看不到放loopfiles的partition
如今可成功使用 mount --move 的方式改进
又顺便修改成参数化的方式设定
所以原本只新增3行到linuxrc 变成新增3部份
part1: 参数读取
part2: 解析UUID=, LABEL=; mount and losetup.
part3: mount --move
在grub.cfg内的用法: ( 因过长 实为为同一行)
linux vmlinuz loops_dev=LABEL=LOOPS loops_mnt=/loops loop_file=loop.ext4
root=LABEL=ROOT rootfstype=ext4 ro
ROOT起来後 可以在//ROOT/loops/ 内再挂其他loopfiles 到/usr, /var, /home ...
以下为执行diff比较 原与新的差异结果
====================================
49a50,59
> # zm 1: for boot from loop file
> loops_dev=*)
> LOOPS_DEV=${x#*=}
> ;;
> loops_mnt=*)
> LOOPS_MNT=${x#*=}
> ;;
> loop_file=*)
> LOOP_FILE=${x#*=}
> ;; #
485a496,543
> # zm 2: find the device which contains loop files, mount and losetup.
> if [ -n "${LOOP_FILE}" ]; then
>
> if [ -z "${LOOPS_MNT}" ]; then
> LOOPS_MNT='/loops'
> fi
>
> MNT_DEV=""
> while [ "${MNT_DEV}" = '' ]
> do
> case "${LOOPS_DEV}" in
> LABEL=*|UUID=*)
>
> retval=1
>
> if [ ${retval} -ne 0 ]; then
> MNT_DEV=$(findfs "${LOOPS_DEV}" )
> # MNT_DEV=$(findfs "${LOOPS_DEV}" 2>/dev/null)
> retval=$?
> fi
>
> if [ ${retval} -ne 0 ]; then
> MNT_DEV=$(busybox findfs "${LOOPS_DEV}" )
> # MNT_DEV=$(busybox findfs "${LOOPS_DEV}" 2>/dev/null)
> retval=$?
> fi
>
> if [ ${retval} -ne 0 ]; then
> MNT_DEV=$(blkid -o device -l -t "${LOOPS_DEV}")
> retval=$?
> fi
>
> if [ ${retval} -eq 0 ] && [ -n "${MNT_DEV}" ]; then
> good_msg "Detected loops_dev=${MNT_DEV}"
> else
> prompt_user "MNT_DEV" "block device"
> continue
> fi
> ;;
>
> esac
> done;
>
> mkdir -p ${LOOPS_MNT}
> mount ${MNT_DEV} ${LOOPS_MNT}
> losetup /dev/loop0 "${LOOPS_MNT}/${LOOP_FILE}"
> fi # zm
>
521a580
>
995a1055
> #
1006a1067,1075
>
> # zm 3: move LOOPS_MNT from initramfs to real root
> if [ -n "${LOOP_FILE}" ]; then
> if [ ! -e "${CHROOT}${LOOPS_MNT}" ]; then
> mkdir -p "${CHROOT}${LOOPS_MNT}"
> fi
> mount --move "${LOOPS_MNT}" "${CHROOT}${LOOPS_MNT}"
> good_msg "Remounting loop_dev=${LOOPS_DEV} to ${CHROOT}${LOOPS_MNT}"
> fi #
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.161.40.10
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1499124308.A.EDB.html
1F:推 kenduest: 推~ 07/04 12:12
2F:→ OrzOGC: 这是不是就像是LIVECD的做法? 07/04 12:31
这是比较像vitualbox, qemu的方式 不同的地方是让实机来跑
不过想让让虚拟机跑也是可以喔
要多编虚拟机的用到的driver到kernel 上一篇有成功
LiveCD是比较复杂点的作法 例如有的是用 SquashFS + OverlayFS
目前正在实验中 想参考LiveCD 结合squashfs, overlayfs, loop_device, ramdisk 做出
1.唯读的SquashFS image 挂到/dev/loop0 在initram中设为Overlay 的lowerdir
2.一个ssd上的 ext4 image 挂到/dev/loop1 在initram中设为upperdir与workdir
upperdir 可以当snapshot
3.用ramdisk当 overlay 的mergedir
4.以mergedir 当root 用来boot
5.隔周或一段期间可将upper回存lower後 备份lower 再重置overlay
把loop_device和ramdisk拿掉 就是liveCD的方法了
好像没必要硬要用loop_device ?
当初动机是管理档案比管理partition容易太多了 而且虚拟机也可用 方便做实验
而用ramdisk是觉得设成这样很像cache, 开机後设是可行的 还没试过用来boot
※ 编辑: czm (1.163.144.75), 07/06/2017 04:46:23