前言
本文主要讨论在NTFS分区上安装Linux的方法 笔者实现了完全在Windows可以直接访问的分区上安装完整的Arch Linux操作系统 仅使用FAT与NTFS文件系统实现Linux的文件系统布局
笔者在Linux下使用NTFS时无意中发现现在的ntfs3似乎已经支持了较为完整的Linux权限,也支持软/硬链接等特性,还有ACL、透明压缩支持:
因此意识到:现在在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
为挂载类型,挂载数据分区;注意不要添加windows_names
挂载选项,否则会导致文件名大小写不敏感且文件名不可包含<>|:?*\
等字符,这会导致某些不符合Windows文件名要求的软件包无法写入到文件系统内(NTFS设计上是大小写敏感的,但是Windows大小写不敏感,windows_names
挂载选项是考虑与Windows的兼容性设计的)。
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设备中启动,则还需要添加usbhid
和xhci_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分区访问
vmlinuz
与initramfs
镜像
- 使得gurb能够进入NTFS分区访问
- 指定
rootfstype=ntfs3
- 否则在启动时会出现根分区的挂载错误
Ventoy镜像搜索配置
将完整的操作系统安装进Ventoy的数据分区以后,Ventoy仍然会将分区下的每个文件扫描一遍,以确定是不是镜像,这会导致启动时的镜像搜索时间过长。为了解决这个问题,我们可以在Ventoy的配置文件中指定需要扫描文件夹。
例如,如果我们仅需要搜索ISOs
目录下的文件,可以创建ventoy/ventoy.json
并添加以下内容:
{
"control":[
{ "VTOY_DEFAULT_SEARCH_ROOT": "/ISOs" }
]
}
这样,Ventoy就只会搜索ISOs
目录下的文件,而不会搜索其他文件,加快启动速率。
测试及效果
安装完成后,重启进入Ventoy,按F6
,选择新添加的菜单项,即可进入新系统。
目前看来系统功能均可以正常使用,未发现明显问题。
踩坑
fsck
目前Linux下的ntfs3
软件并没有用户空间程序,包括fsck
。而ntfs3
挂载的文件系统如果遇到突然断电、强制关机等情况,可能会将文件系统标记为脏,导致下次启动时按照默认参数无法挂载。此外,Linux下支持的ntfs-3g
的fsck
程序也无法修正标记为脏的ntfs3
文件系统。
因此,如果遇到这种情况,可能需要在Windows下使用chkdsk
命令修复文件系统。然而,由于Windows下的文件名有诸多限制,不得包含<>|:?*\
等字符,对于Linux下写入的含这些字符的文件,Windows的修复策略是直接删除。十分不巧的是,Arch Linux的pacman包管理器将:
用作手动处理的包版本的分隔符,因此在Windows下修复文件系统时可能会导致pacman丢失某些已经安装的包的信息,在更新系统或者安装新的软件包时,由于包管理器不知道已经安装了这些包,会提示文件冲突的错误。此时只能手动向包管理器的cli传递--overwrite '*'
参数,以强制覆盖文件。总的来说,比较麻烦。
更正
笔者发现,ntfs-3g
的ntfsfix
程序可以修复ntfs3
文件系统的标记为脏的问题。因此,如果遇到这种情况,可以在Linux下使用ntfsfix
命令修复文件系统。要修复标记为脏的ntfs3
文件系统,可以使用-d
参数:
sudo ntfsfix -d /dev/sdXn
修复完成后,再次尝试挂载文件系统即可。结合这一方法,只要不在Windows下使用chkdsk
命令,就不会出现上述问题,该安装于NTFS分区的Linux系统完全可以正常使用。
权限的跨平台性
目前NTFS在Windows下与Linux下均有权限支持,但是两者的权限系统并不一致,某些在Windows下普通用户创建的文件在Linux下可能仅有root用户才能写入,反之亦然。这一问题笔者暂时没有发现稳定复现的方法,但是在实际使用中时不时会遇到。