作者czm (czm)
看板Linux
标题Re: [分享] 自制LiveCD 简要过程
时间Sat Jul 29 11:52:42 2017
以下介绍让livecd多些便利性的改进
LiveCD中的grub/custom.cfg 可以利用grub 的search指令
加入类似如下数行 可以找到另一颗hd上的*.cfg 在那里做变化 可以增加未来弹性
如multiboot 或挂载hd上的OverlayFS 做为增修用cd 上的 squash用
可以等到稳定後 再将整个OverlayFS 存成新的squash 做成新的cd
=============
# hooks.cfg
device_label=overlayfs_rw
hook=boot/grub/grub_hook.cfg # 未来可以在这里放multiboot, overlay 等等
search --label --set=HOOK_DEV $device_label
if [ -f ($HOOK_DEV)/$hook ]; then
source ($HOOK_DEV)/$hook
fi
=============
如果有用squashfs, grub也可用loopback这个指令 从里面挖到vmlinuz,initrd
这样就不用copy出来了 (以前不知道浪费好多时间)
配合前小段search的方法 假设找到boot device 为($BOOT_DEV)
=============
#inside some boot menu of the grub.cfg
insmod squash4
set loop_file=livecd.squashfs # your file name here
loopback some_name ($BOOT_DEV)/$loop_file
linux (some_name)/boot/vmlinuz-xxx.xxx.xx
initrd (some_name)/boot/initrd-xxx.xxx.xx
=============
然後 我想要grub也能从 OverlayFS中 挖到正确的新的vmlinuz与initrd 用来boot
因为之前要挂载overlayfs时 已经都参数化 由grub传给initrd/linuxrc了
所以grub也能由这些参数挖到vmlinuz与initrd来boot
方法就是前两小段的search+loopback指令
就是做些苦工把可能的地方 依照优先顺序去找
找到後 存在$VMLINUX, $INITRD 这两个变数中
先举例用法, grub scripts 後列
set vmlinuz=vmlinuz-x.x.xx # 要用的版本
set initrd=initrd-x.x.xx
export vmlinuz
export initrd
set ovl_dev0=LIVECD # 假设grub能看得到device 只是要告诉它label name
set ovl_mnt0=/loops # 挂载点
set ovl_loopfile0=livecd.squashfs #cd 里面的loopfile
set ovl_mnt0_sub=/lower # squash 挂载点
set ovl_dev1=overlay_rw # hd partition label
set ovl_mnt1=/rw # hd 挂载点
set ovl_loopfile1= # rw 也可以是hd 上的 loopfile
set ovl_mnt1_sub= # rw loopfile 挂载点
#参数设好後 用下面的function找
get_vmlinux_initrd "$ovl_dev0" "$ovl_mnt0" \
"$ovl_loopfile0" "$ovl_mnt0_sub" \
"$ovl_dev1" "$ovl_mnt1" \
"$ovl_loopfile1" "$ovl_mnt1_sub"
echo "vmlinux: $VMLINUX" # 找到後存在这
echo "initrd : $INITRD"
sleep 2
echo 'Loading vmLinux...'
linux $VMLINUX rootfstype=overlay \
ovl_dev0=LABEL=$ovl_dev0 ovl_mnt0=$ovl_mnt0 \
ovl_loopfile0=$ovl_mnt0/$ovl_loopfile0 \
ovl_mnt0_sub=/$ovl_mnt0_sub \
ovl_dev1=LABEL=$ovl_dev1 ovl_mnt1=$ovl_mnt1 \
root=overlay ro # mount_move init_opts=1
echo 'Loading initrd...'
initrd $INITRD # 用找到的地方boot, 其他一长串参数 请参看之前
# boot loop device 的po 文
以下是 get_vmlinux_initrd 函式列表
===========================
### BEGIN functions ###
set VMLINUX=''
set INITRD=''
function is_there {
echo is_there "${1}"
if [ -d "${1}" ]; then
if [ -z "$VMLINUX" -a -e "${1}/$vmlinuz" ]; then
set VMLINUX="${1}/$vmlinuz"
echo VMLINUX "${VMLINUX}"
export VMLINUX
fi
if [ -z "$INITRD" -a -e "${1}/$initrd" ]; then
set INITRD="${1}/$initrd"
echo INITRD "${INITRD}"
export INITRD
fi
echo
fi
sleep 1
}
#${1}
#ovl_dev0
#ovl_mnt0=/loops
#ovl_loopfile0=g-squash_mini/g-squash_mini.xz.squashfs
#ovl_mnt0_sub=/loops/g-squash_mini/lower
#ovl_dev1
#ovl_mnt1=/loops
#ovl_loopfile1=g-squash_mini/g-squash_mini.rw.ext2
#ovl_mnt1_sub=/loops/g-squash_mini/rw
function get_vmlinux_initrd_ovl {
echo
echo 'get_vmlinux_initrd_ovl'
echo "${1}, ${2}, ${3}, ${4}, ${5}, ${6}, ${7}, ${8}."
while [ -z "$VMLINUX" -o -z "$INITRD" ]; do
if [ -n "${5}" ]; then
search --no-floppy --label --set=OVL_DEV1 "${5}"
echo ovl_dev1 "$OVL_DEV1"
fi
if [ -n "$OVL_DEV1" ]; then
if [ -f "($OVL_DEV1)/${7}" ]; then
echo loopback loop1 "($OVL_DEV1)/${7}"
loopback loop1 "($OVL_DEV1)/${7}"
is_there "(loop1)/upper/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
else
if [ -z "$VMLINUX" -a -z "$INITRD" ]; then
loopback -d loop1
fi
fi
fi
if [ -n "${8}" ]; then
is_there '("$OVL_DEV1")/"${8}"/upper/boot'
fi
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
is_there "($OVL_DEV1)/upper/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
fi
if [ -n "${1}" -a "${1}" != '(LOOP_ENTRY)' ]; then
search --no-floppy --label --set=OVL_DEV0 "${1}"
echo ovl_dev0 "$OVL_DEV0"
fi
if [ -n "$OVL_DEV0" ]; then
if [ -f "($OVL_DEV0)/${7}" ]; then
echo loopback loop1 "($OVL_DEV0)/${7}"
loopback loop1 "($OVL_DEV0)/${7}"
is_there "(loop1)/upper/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
else
if [ -z "$VMLINUX" -a -z "$INITRD" ]; then
loopback -d loop1
fi
fi
fi
if [ -n "${8}" ]; then
is_there "($OVL_DEV0)/${8}/upper/boot"
fi
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
is_there "($OVL_DEV0)/upper/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
if [ -f "($OVL_DEV0)/${3}" ]; then
echo loopback loop0 "($OVL_DEV0)/${3}"
loopback loop0 "($OVL_DEV0)/${3}"
is_there "(loop0)/boot"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
elif [ -n "${4}" -a -d "(loop0)/boot/${4}" ]; then
is_there "(loop0)/boot/${4}"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
else
is_there "(loop0)"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
if [ -z "$VMLINUX" -a -z "$INITRD" ]; then
loopback -d loop0
fi
fi
elif [ -n "${4}" ]; then
is_there "($OVL_DEV0)/${4}/lower/boot"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
is_there "($OVL_DEV0)/${4}/boot"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
is_there "($OVL_DEV0)/${4}"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
else
is_there "($OVL_DEV0)/lower/boot"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
is_there "($OVL_DEV0)/boot"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
is_there "($OVL_DEV0)"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
fi #[ -f "($OVL_DEV0)/${3}" ]
fi # [ -n "$OVL_DEV0" ]
if [ -f "${1}/${3}" ]; then
echo loopback loop_lower "${1}/${3}"
loopback loop_lower "${1}/${3}"
is_there "(loop_lower)/boot"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
elif [ -n "${4}" -a -d "(loop_lower)/boot/${4}" ]; then
is_there "(loop_lower)/boot/${4}"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
elif [ -z "$VMLINUX" -o -z "$INIDRD" ]; then
is_there "(loop_lower)"
if [ -n "$VMLINUX" -a -n "$INIDRD" ]; then
break;
fi
if [ -z "$VMLINUX" -a -z "$INITRD" ]; then
loopback -d loop_lower
fi
fi
fi
break
done
sleep 1
# play 240 440 1 524 1
}
#${1}
#loop_dev
#loop_dev_mnt
#loop_file
#loop_file_mnt
#ovl_dev0
#ovl_mnt0=/loops
#ovl_loopfile0=g-squash_mini/g-squash_mini.xz.squashfs
#ovl_mnt0_sub=/loops/g-squash_mini/lower
#ovl_dev1
#ovl_mnt1=/loops
#ovl_loopfile1=g-squash_mini/g-squash_mini.rw.ext2
#ovl_mnt1_sub=/loops/g-squash_mini/rw
function get_vmlinux_initrd {
echo
echo 'get_vmlinux_initrd'
echo "${1},${2},${3},${4}, ${5},${6},${7},${8}, ${9},${10},${11},${12}."
while [ -z "$VMLINUX" -o -z "$INITRD" ]; do
if [ -n "${1}" ]; then
search --no-floppy --label --set=LOOP_DEV "${1}"
echo loop_dev "$LOOP_DEV"
fi
if [ -n "$LOOP_DEV" ]; then
if [ -f "($LOOP_DEV)/${3}" ]; then
echo loopback LOOP_ENTRY "($LOOP_DEV)/${3}"
loopback LOOP_ENTRY "($LOOP_DEV)/${3}"
set _ovl_dev1="${9}"
if [ "$_ovl_dev1" = 'tmpfs' ]; then
_ovl_dev1=''
fi
get_vmlinux_initrd_ovl \
(LOOP_ENTRY) "${6}" "${7}" "${8}" \
"$_ovl_dev1" "${10}" "${11}" "${12}"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
elif [ -n "${4}" ]; then
is_there "(LOOP_ENTRY)/boot/${4}"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
is_there "(LOOP_ENTRY)/${4}/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
is_there "(LOOP_ENTRY)/${4}"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
fi
is_there "(LOOP_ENTRY)/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
else
if [ -z "$VMLINUX" -a -z "$INITRD" ]; then
loopback -d LOOP_ENTRY
fi
fi
elif [ -n "${4}" ]; then
is_there "(LOOP_DEV)/${4}/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
is_there "(LOOP_DEV)/${4}"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
is_there "(LOOP_DEV)/boot/${4}"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
elif [ -z "$VMLINUX" -o -z "$INITRD" ]; then
is_there "(LOOP_DEV)/boot"
if [ -n "$VMLINUX" -a -n "$INITRD" ]; then
break;
fi
fi
fi
break
done
sleep 1
}
### END functions ###
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.161.49.93
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1501300365.A.8B9.html
1F:推 ddtsatan: 推 07/29 20:03
2F:推 Debian: 推荐文章。 07/30 03:03
3F:推 mgdesigner: 这要给赞 07/30 03:04