歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 將Arch GNU/Linux 安裝到磁盤文件(loop)

將Arch GNU/Linux 安裝到磁盤文件(loop)

日期:2017/2/28 16:19:51   编辑:Linux教程

用途:

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/install4、修改相關配置
sudo mkdir /tmp/install/sys

修改fstab (/tmp/install/etc/fstab),將掛載/的那行改為

/dev/loop0 / reiserfs defaults 0 15、修改啟動內核和loop設備的系統

這個就是重中之重了, 因為目前Arch 官方的啟動腳本不支持。 這裡就添加一個hook來實現掛在loop設備

1) 新建 /tm/install/lib/initcpio/hooks/automount 內容:

run_hook ()
{
# 啟動參數指定 real_root=loop=/dev/sda1 loopfile=Arch/archlive.disk
case ${real_root} in loop\=*)
loop=${real_root/loop=}
if [ -e $loop ]; then
fstype=$(blkid -u filesystem -o value -s TYPE -p "${loop}")
if [ "${readwrite}" = "no" ]; then rwopt="ro"; else rwopt="rw"; fi
mount -t $fstype -o $rwopt $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
mount -t $fstype -o $rwopt $loopfile $UNION
mkdir -p $UNION$HOST
mkdir -p $UNION$loop
mount -o bind $HOST $UNION$loop
MOUNTED=1
fi
fi
;;
esac
}隨便寫的, 快速實現需要的功能就可以了

2) 新建文件 /tmp/install/lib/initcpio/install/automount 內容如下:

install ()
{
BINARIES="blkid"
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 在hooks 最後加入 automount

HOOKS="base udev autodetect pata scsi sata filesystems automount"4) 修改 /tmp/install/lib/initcpio/init

在 # set default mount handler 前面加入

export HOST="/host"
export UNION="/new_root"
mkdir -p $HOST
# 掛載根成功後 MOUNTED=1
export MOUNTED="0"
將 ${mount_handler} /new_root 改成

# 如果hook已經完成root 則跳過Arch 默認的root偵測
if [ "$MOUNTED" = "0" ]; then ${mount_handler} $UNION; fi
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 設備項內容:

menuentry "Arch i686 (on loop 虛擬盤)" {
insmod part_msdos
insmod reiserfs
insmod loopback
loopback loop0 (hd0,msdos9)/Arch/Arch-i686.img
set root=(loop0)
linux /boot/vmlinuz26 real_root=loop=/dev/sda9 loopfile=Arch/Arch-i686.img quiet
initrd /boot/kernel26-fallback.img
}
重新啟動即可。


後話:

1、 啟動腳本automount 稍作變化, 可以擴展出更多更強的功能, 比如從squashfs 啟動, 再掛載可寫分區保存。。。 或者直接掛載內存做成類似PE的rom系統。。。

2、。。。

Copyright © Linux教程網 All Rights Reserved