作者czm (czm)
看板Linux
标题[心得] 闲聊+双系统另种选择 loopdevice
时间Fri Dec 9 22:18:59 2016
近几年随着MS 从XP推到了win10 如此肥大 感到$与心有点累 就弃坑了
之前有玩过Ubuntu12.04 就由14.04开始用到16.04
版本变化也是很快 =="
後来由於要自编kernel 支援hifi codec 与更多mmc partitions, loopdevices 数
想说乾脆找source base的distro 更透明 而且rolling change的
参考板上这两篇
#1NQ38WOA #1NnCjETB 所提 将Arch 与Gentoo列入选择
首先从人多的Arch着手
但Arch似乎 / 与 /usr 必需在同个partition
google到回应多是质疑为何会有分开不同partittion的需求 (arch distro user 的傲慢?)
再来就开始试用gentoo 目前还蛮满意的
有趣的是gentoo user也有一种傲慢
质疑为何要将driver 编成 module, 为何需要dkms... 就像distros嘲讽M$ 一样?
因为virtualbox 常常会坏掉啊 ╮(╯_╰)╭
有关双系统 除了
1. 正规安装 然後用boot loader选取 保有效能 但需另备档案系统FS
2. 安装於虚拟机上 保有原FS 牺牲效能
还有标题所提的 安装於loopdevice (imagefile) 的另种选择
必要条件是boot loader 认识原FS 例如grub认识vfat ntfs
就能牺牲更少效能 而且只需另备bootloader
以gentoo而言 只需准备32~64MB boot partition 放grub,vmlinuz,initramfs
如果是efi主机板 或安装grub4dos 或同种OS 则可沿用原FS
目前个人可由
a. Grub boots gentoo@loop_device
b. Grub boots Win10 loader to boot Win10 on imagefile
c. Win10 loader boots Win10 on imagefile
以下介绍a在gentoo 举例做法
1, 制作或新安装gento 於ImageFile /dev/sda41/loop_live.ext4上 并改好其/etc/fstab
以下面fstab为例 除了/ 以外其余都用原旧OS 这样只需512M
本例 / 是copy 原旧gentoo 然後修改/etc/fstab,/etc/host,/etc/conf.d/hostname
非新安装
#====/etc/fstab====
/dev/sda41 /mnt/loops ext2 noatime 0 0
LABEL=loop_live / ext4 loop,noatime 0 1
/mnt/loops /boot ext2
bind,noatime 0 0
LABEL=g_usr /usr ext2
ro,noatime 0 2
LABEL=g_share /usr/share ext2
ro,noatime 0 2
LABEL=g_fonts /usr/share/fonts ext2
ro,noatime 0 2
LABEL=g_portage /usr/portage ext2
ro,noatime 0 2
LABEL=g_distfiles /usr/portage/distfiles ext2
ro,noatime 0 0
LABEL=ssd_swap none swap sw 0 0
tmpfs /var/tmp tmpfs size=2048m,mode=1777 0 0
/mnt/loops/G64_EFI.vfat /boot/efi vfat
loop,noatime 0 0
/mnt/loops/g64_src.ext2 /usr/src ext2
loop 0 0
#====/etc/fstab====
如果不共用 全靠下载与自编 不装X 不含swap,/var/tmp,/boot/efi 共预留5GiB
( 因为目录与小档案极多 mkfs 要下-b 1024 -N 1048576 不然保险点是8GiB )
如果不共用 全靠下载与自编 要装X 不含swap,/var/tmp,/boot/efi 共预留8GiB
( 同上 不然保险点是16GiB)
要自编firefox 必须/var/tmp > 4096M
2, kernel必须加入支援 loop device driver及其载体的FS 如ext*/vfat/ntfs (optional).
3, 修改 /etc/initramfs.mounts 加入一行
/mnt/loops
4, 另制initramfs
4-1, 抽出原initramfs/init
在# Determine root device 这行前放入下面3行 存成myinit
mkdir -p /mnt
mount
/dev/sda41 /mnt
losetup
/dev/loop0 /mnt/loop_live.ext4
4-2, genkernel
--linuxrc=myinit --install initramfs
5, 修改 /boot/grub/grub.cfg 举例
search --no-floppy --label --set=root loop_test
echo 'Loading Linux 4.4.26-gentoo ...'
linux /vmlinuz root=
/dev/loop0 rootfstype=ext4 ro
echo 'Loading initial ramdisk ...'
initrd /initramfs
6, reboot
========
这样如果全系统都放在loop devices
Ubuntu distro user 说disk效能减少10%
其他效能 我想应该极接近实机 优於虚拟机 尤其是需要GPU时
其他虚拟机的好处也兼备
不过snapshot就得靠自己了
google到 可以安装openSUSE:Snapper 它有支援ext4
BUT BUT BUT
如果imagefile loop_live.ext4 多加个文档loop_live.
vmdk与1MB的
mbr
在partition table划好後 可让虚拟机读
重编kernel 增加支援vm 硬体的driver 应该可让虚拟机跑 我还没试
若成 觉得这真的是超赞的选择方案 自夸一下 呵
做好的vmdk 内含gentoo kernel 4.4.26 已实验:
在Ubuntu16.04+VituralBox5.0.24上跑 OK
在Gentoo同版本+VituralBox4.3.28 跑到textmode login画面 能输入passwd但进不去
在Gentoo同版本+VituralBox4.3.28+adminCD 20161020+chroot+su=illegal instruction
举例
==== loop_live.vmdk ====
# Disk DescriptorFile
version=1
CID=c2871f16
parentCID=ffffffff
createType="monolithicFlat"
# Extent description
RW 2048 FLAT
"loop_live.mbr" 0
RW 1048576 FLAT
"loop_live.ext4" 0
# The disk Data Base
#DDB
ddb.virtualHWVersion = "4"
ddb.adapterType="ide"
ddb.uuid.image="8c14b2f3-440d-4410-b6b4-aa026ab7c966"
ddb.uuid.parent="00000000-0000-0000-0000-000000000000"
ddb.uuid.modification="c1fce25a-f344-44ee-9089-d41b84f8a5f9"
ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000"
ddb.geometry.cylinders="4104"
ddb.geometry.heads="16"
ddb.geometry.sectors="16"
ddb.geometry.biosCylinders="4104"
ddb.geometry.biosHeads="16"
ddb.geometry.biosSectors="16"
======================
延伸运用此法
/usr/portage/distfiles 与 /usr/src 都只要一份image放原FS上就够了
不管有多少实机 虚拟机
※ 编辑: czm (118.161.50.147), 12/09/2016 22:48:34
1F:推 Gold740716: 所以是装在光碟或随身碟上,要用才插入? 12/10 00:37
2F:→ noonee: 我个人觉得这种很危险 12/10 03:38
3F:→ noonee: 危险的不是软体 而是硬体 长期使用後接口会松掉 12/10 03:39
4F:→ noonee: 然後就是接触不良导致的记忆体错误 12/10 03:39
5F:→ noonee: 或许你会说 不要那麽长拔插就好了 真那样的话为何不直接 12/10 03:40
6F:→ noonee: 用笔电或平板就好? 12/10 03:41
已经成功将ImageFiles放在原来的OS 硬碟的档案系统上
只要硬碟有足够的连续空间
Grub4dos 可以放ntfs,fat上
grub boot partion 也可以与原OS efi 放一起 或在硬碟腾出64M来放
所以可避掉插拔动作
※ 编辑: czm (118.161.50.147), 12/10/2016 10:24:32
7F:推 Adama: 其实就是wubi的做法 12/10 13:26
感谢资讯
8F:→ s8321414: /跟/usr要放在同一个分割区好像是因为systemd? 12/10 17:57
坏处是/usr 不能随时mount ro/rw , 如果boot from net 要等超久?
还好前阵子装的arch 231 已经有支援可分离/ 与/usr了
9F:推 neutrino: 请教一下关於 boot Windows 10 on imagefile, 12/11 02:53
10F:推 neutrino: 是step1. grub boot Win10 loader step2. Win10 loader 12/11 02:57
11F:→ neutrino: boots windows on vhd 这样吗? 12/11 02:58
12F:推 neutrino: 还是说, 不是用vhd? 12/11 03:12
对的 是用vhd 靠grub chainload winboot.efi
但win10 loader 都会多restart 1次
如果grub能直接boot win10 img 就更好了
※ 编辑: czm (118.161.46.179), 12/11/2016 09:18:52
13F:→ danny8376: 哪来/usr必须跟/同part 只是要让/挂上/usr也马上跟着挂 12/11 09:00
14F:→ danny8376: 这是因为/sbin跟/bin都是/usr/bin的symlink 12/11 09:00
15F:→ danny8376: /起来但/usr没马上挂的话 你就等着没bin可用了XD 12/11 09:01
wiki上确实写着/usr可和/分开 是後来才支援的
我试过把/bin /sbin /lib 的link都弄成 hardcopy 发现...
那些bin files不是用static lib连结做成的 links就单纯等效於设PATH 根本是做好玩的
再试更暴力把 /usr/bin,/usr/sbin 整个搬到 /bin 与/sbin; /usr/lib搬到/lib
又有PATH设定的问题 想想即使如此累人地解决了 就只是一道87%的排骨酥汤
失去/bin 与/usr/bin分开的本意
於是换到gentoo
※ 编辑: czm (1.163.160.180), 12/12/2016 12:40:20