在windows ntfs 分区安装 archlinux

发布: 2014-04-20 14:11

在windows ntfs 分区安装 archlinux

现有电脑,不想重新分区,希望能像ubuntu的wubi那样,直接在windows上安装启动linux系统。
至于为什么不直接使用ubuntu呢,主要是ubuntu使用的少,经常使用的系统是arch linux。
当然,在安装这个之前,使用的是wubi安装的ubuntu系统。
如果使用arch linux的安装介质,安装过程会更简单些。
使用全在安装的过程中,也参考了wubi的启动过程。

这种安装方式,需要当前有linux系统。安装完成后,这个arch linux系统是可以在不同机器上迁移的。
不需要在每台机器上都安装一遍。

分区信息:
/dev/sda2 ntfs C:
/dev/sda3 ntfs D:
/dev/sda4 ntfs E:

用wubi安装的ubuntu放在/dev/sda2分区,目录结构为,C:/ubuntu/disk/root.disk
arch linux准备安装在E:/ntfspage.img。

进入ubuntu系统,挂载/dev/sda4到/mnt/sda4。
创建一个30G的磁盘文件,/mnt/sda4/ntfspage.img:
dd if=/dev/zero of=/mnt/sda4/ntfspage.img ibs=10M count=300
mkfs.ext4 /mnt/sda4/ntfspage.img
mount /mnt/sda4/ntfspage.img /mnt/archusb
在这个虚拟硬盘上安装arch linux,使用pacstrap工具,在些不详细说明。

安装完成后,现在需要重做initramfs.img,使其在启动过程能正确加载root分区并启动。

修改/lib/initcpio/init文件,
把"$mount_handler" /new_root一行扩展为,
[code type="bash"]
mkdir /ntfs_root
"$mount_handler" /ntfs_root
# mkdir /new_root # 在其他的mkinitcpio的hooks中创建了,这里不需要再创建
mount -t ext4 /ntfs_root/ntfspage.img /new_root
mount --bind /ntfs_root /new_root/ahost
mount --bind /ntfs_root /new_root/mnt/sda4
[/code]

然后pacman -S linux重做initramfs.img启动文件。
两行mount --bind是把已经mount上的windows分区整个再挂载到linux系统上,
在linux系统上依旧能访问其分区上的其他数据。

接下来修改wubi ubuntu的grub.cfg文件,添加一菜单项,
enuentry 'archusb' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7b816857-1930-402b-b897-23b657e91566' {
gfxmode $linux_gfx_mode
insmod gzio
insmod ntfs
set root='hd0,msdos4'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos4 --hint-efi=hd0,msdos4 --hint-baremetal=ahci0,msdos4 189C084C9C0826BA
else
search --no-floppy --fs-uuid --set=root 189C084C9C0826BA
fi
loopback loop1 /ntfspage.img
set root=(loop1)
linux /boot/vmlinuz-linux root=UUID=189C084C9C0826BA rootimg=/ntfspage.img rootfstype=ext4 logfile=/initramfs.log rw
initrd /boot/initramfs-linux.img
}

修改/etc/mkinitcpio.conf,添加一个hook
MODULES="loop fuse"
BINARIES="/usr/bin/ntfs-3g /usr/bin/mount.ntfs"
HOOKS="...... rootntfsimg ..."

接下来重启动机器,进入新的菜单项,就进入了新的系统。
现在的这个设置目录还有几处理报错,但不会影响系统的正常使用。
问题在于现在使用的写死的路径,还需要细化,能否把这些路径信息以参数的形式传递进来。
另一个不足之处是现在还依赖wubi的grub.cfg启动,或者也许换用grub4dos后应该正常使用。
之后优化完成再来补充,目前已经得到了一个从ntfs正常启动的全新系统了。

这个磁盘镜像文件还可以拷贝到其他机器,加个启动菜单即可正常启动系统。

用到的一些命令,
pacstrap
pacman
dd
mkfs.ext4
mount.ntfs
ntfs-3g

更新:
还有一种更清晰的方式,使用hook机制,插入代码,
涉及3个文件,不需要修改现有的文件,系统更新不受影响,
添加/lib/initcpio/hooks/rootntfsimg文件,内容为:
[code type="bash"]
#!/usr/bin/ash

# need kernel command line param
# rootimg /path/to/rootdisk.img
# root the ntfs partition dev, like /dev/sda4
# logfile the initramfs run log, like /var/log/initramfs.log
# rootfstype disk img's file system type, such as ext3/ext4/btrfs/reiserfs/reiser4
# slowdown=5
run_latehook() {
umount /new_root
mkdir /ntfs_root
"$mount_handler" /ntfs_root
rootdevname=$(echo $root | sed s/dev/mnt/g)
fsck.ext4 -n /ntfs_root/ntfspage.img > /fsck.log 2>&1
mount -t ext4 /ntfs_root/ntfspage.img /new_root
mount --bind /ntfs_root /new_root/ahost
mount --bind /ntfs_root /new_root/mnt/sda4
}
[/code]

添加/lib/initcpio/install/rootntfsimg文件,内容为,
[code type="bash"]
#!/bin/bash

build() {
echo "install rootntfsimg..."

add_module loop
add_module fuse
add_module ntfs

add_binary /usr/bin/tee
add_binary /usr/bin/date
add_binary /usr/bin/gcc
add_binary /usr/bin/clang

add_file /usr/include/stdlib.h
add_file /usr/include/stdio.h
echo "install run script"
SCRIPT="rootntfsimg"
add_runscript $SCRIPT
}

help() {
cat < < HELPEOF
for run linux installed on ntfs partitions somedisk.img.
HELPEOF
}
[/code]
修改/etc/mkinitcpio.conf,添加一个hook
MODULES="loop fuse"
BINARIES="/usr/bin/ntfs-3g /usr/bin/mount.ntfs"
HOOKS="...... rootntfsimg ..."

添加的hooks文件都是shell脚本,里面还可以插入调试信息,甚至记录日志到文件。


2014-04-20 补充:
btrfs的优点是非常容易的动态调整分区的大小。
在这种使用方式下,即使使用的是文件磁盘镜像,仍旧能非常好的支持整个分区的大小。
需要把btrfs的挂载点unmount。
首先,使用qemu-img 调整磁盘镜像的大小
qemu-img resize +10G rawbtrfs2.img
然后,使用btrfs命令调整分区大小,在此,使用了一个扩展到最大的方式,
btrfs filesystem resize 4:max /mnt/merge
4:max指的是devid为4的device扩展空间到最大,因为rawbtrfs2.img挂载在devid:4的位置。
再mount之后,可以看到整个btrfs空间已经变大了。


原文: http://qtchina.tk/?q=node/747

Powered by zexport