在NTFS分区上安装Linux

使用Ventoy和ntfs3实现的对Windows系统全透明的Linux文件系统布局

Posted by wszqkzqk on May 4, 2023
本文字数:3382

前言

本文主要讨论在NTFS分区上安装Linux的方法 笔者实现了完全在Windows可以直接访问的分区上安装完整的Arch Linux操作系统 仅使用FAT与NTFS文件系统实现Linux的文件系统布局

笔者在Linux下使用NTFS时无意中发现现在的ntfs3似乎已经支持了较为完整的Linux权限,也支持软链接等特性:

#~/img/ventoy/ntfs-usermod.webp

因此意识到:现在在NTFS分区上是不是已经可以直接安装Linux了🤔🤔🤔。笔者尝试了一下,发现确实可以😋😋😋。

  • 警告:本文的方法混乱邪恶,仅供学习交流,不建议用于生产环境
  • Linux中有许多文件系统(例如Btrfs、XFS等)性能、功能都毫不逊色甚至远远强于NTFS,完全没有必要将Linux安装到NTFS中
  • 本文纯粹在笔者好奇心驱使下写出,不一定具有应用上的意义

准备

以Arch Linux环境为例。

首先需要制作一个Ventoy启动盘,可以参考使用Ventoy直接引导本地安装的Linux的启动盘制作部分

Ventoy启动盘默认会分为两个分区,第一个是我们的数据分区,第二个为约16 MB的FAT引导分区,不要对引导分区进行任何操作。数据分区的默认格式为exfat,我们需要手动将其格式化为NTFS,可以使用sudo mkfs.ntfs /dev/sdXn命令,其中/dev/sdXn是分区设备名。(需要安装ntfs-3g

安装

指定以ntfs3为挂载类型,挂载数据分区:

sudo mount -t ntfs3 /dev/sdXn /mnt

参考Arch Linux官方的安装指南进行安装。

先安装较基本的软件包,这里需要用到pacstrap命令,如果提示找不到该命令,可能是相关软件包没有安装,需要先在主系统中安装arch-install-scripts

sudo pacman -S --needed arch-install-scripts

然后执行

sudo pacstrap -c -K /mnt --needed \
        base base-devel linux linux-firmware \
        amd-ucode intel-ucode \
        btrfs-progs xfsprogs f2fs-tools nilfs-utils dosfstools exfatprogs ntfs-3g lvm2 \
        sof-firmware networkmanager network-manager-applet nm-connection-editor \
        nano vim man-db man-pages texinfo \
        noto-fonts-cjk noto-fonts-emoji

然后再选择一个DM安装,以在不同桌面环境间较通用LightDM为例:

sudo pacstrap -c -K /mnt --needed lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings

再选择一个桌面环境,以Xfce为例:

sudo pacstrap -c -K /mnt --needed xfce4 xfce4-goodies

安装完成后,使用genfstab生成fstab文件:

sudo su
genfstab -U /mnt >> /mnt/etc/fstab

fstab在自动生成后可能还需要手动编辑,例如可以加入noatiome挂载选项等。

使用arch-chroot进入新系统:

sudo arch-chroot /mnt

设置时区:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc

设置本地化:

sed -i 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/#zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf

设置主机名:

echo 主机名 > /etc/hostname

设置root密码:

passwd

启用lightdm与网络管理器:

systemctl enable lightdm.service
systemctl enable NetworkManager.service

创建非root账户:

useradd -m 用户名

设定用户密码:

passwd 用户名

将用户加入wheel用户组,以便支持sudo权限:

usermod -aG wheel 用户名

编辑sudo配置,为wheel组加入sudo使用权限:

EDITOR=nano visudo

在编辑时取消%wheel ALL=(ALL): ALL一行的注释即可。

这里安装其实已经完成,但是由于Linux下没有NTFS的fsck支持,我们还需要编辑/etc/mkinitcpio.conf,在HOOKS中去掉fsck

如果需要更混乱邪恶地将这个设备整体放到QEMU下作为虚拟机启动,还需要在/etc/mkinitcpio.conf中添加几个内核模块:

MODULES=(ntfs3 virtio virtio_blk virtio_pci virtio_net)

如果还要在USB设备中启动,则还需要添加usbhidxhci_hcd

MODULES=(ntfs3 virtio virtio_blk virtio_pci virtio_net usbhid xhci_hcd)

然后再执行mkinitcpio -P,以生成新的initramfs。

Ventoy引导配置

Ventoy引导配置文件位于ventoy/grub.cfg。我们需要在其中添加一个新的菜单项,以引导我们的新系统。

首先在数据分区的根目录下创建好ventoy文件夹和ventoy/grub.cfg配置文件,然后在ventoy/grub.cfg中添加以下内容:

menuentry 'Arch Linux on NTFS' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-XXXXXXXXXXXXXXXX' {
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod ntfs
        search --no-floppy --fs-uuid --set=root XXXXXXXXXXXXXXXX
        echo    'Loading Linux kernel...'
        linux   /boot/vmlinuz-linux rootfstype=ntfs3 root=UUID=XXXXXXXXXXXXXXXX rw
        echo    'Loading initramfs...'
        initrd  /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-linux.img
} 

menuentry '<-- Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
    echo 'Return ...'
}

注意将$vtoydev,gptX中的X替换为实际的编号,将XXXXXXXXXXXXXXXX替换为实际的NTFS分区UUID。该配置的关键在于:

  • 使用insmod ntfs加载ntfs模块
    • 使得gurb能够进入NTFS分区访问vmlinuzinitramfs镜像
  • 指定rootfstype=ntfs3
    • 否则在启动时会出现根分区的挂载错误

Ventoy镜像搜索配置

将完整的操作系统安装进Ventoy的数据分区以后,Ventoy仍然会将分区下的每个文件扫描一遍,以确定是不是镜像,这会导致启动时的镜像搜索时间过长。为了解决这个问题,我们可以在Ventoy的配置文件中指定需要扫描文件夹。

例如,如果我们仅需要搜索ISOs目录下的文件,可以创建ventoy/ventoy.json并添加以下内容:

{
    "control":[
        { "VTOY_DEFAULT_SEARCH_ROOT": "/ISOs" }
    ]
}

这样,Ventoy就只会搜索ISOs目录下的文件,而不会搜索其他文件,加快启动速率。

测试及效果

安装完成后,重启进入Ventoy,按F6,选择新添加的菜单项,即可进入新系统。

目前看来系统功能均可以正常使用,未发现明显问题。

#~/img/ventoy/linux-on-ntfs.webp