2020年Arch Linux与Windows 10双系统LVM安装实战指南
1. 为什么2020年还要折腾双系统加LVM先把时间线拉回到2020年年中。那会儿我手头的主力机是一台2017款的轻薄本配置是i5-7200U加8GB内存原装一块256GB的固态。日常写代码、跑虚拟机、偶尔剪点小视频Windows 10用着其实还行但有几个场景实在忍不了一是编译大型项目时Windows下的文件系统性能拖后腿同样的代码在Linux下编译能快将近三分之一二是做服务端开发时Docker在Windows上的体验总隔着一层WSL2那时候刚出来不久稳定性还差点意思三是我想把开发环境和日常娱乐彻底分开避免哪天系统崩了连个救急的都没有。于是双系统的念头就冒出来了。但真正让我决定上LVM的是另一件事。之前我试过传统分区方案装双系统结果有一次手贱调整分区大小把引导搞挂了折腾了大半天才恢复。那次之后我就想能不能有一种方案让分区调整这件事变得灵活一点不用每次都提心吊胆。LVM逻辑卷管理就是答案。它把物理磁盘抽象成卷组再在卷组上划分逻辑卷扩容缩容都方便得多而且支持快照做系统备份和回滚的时候特别省心。这篇文章要聊的就是怎么在一台机器上同时装Arch Linux和Windows 10并且在Arch这边用LVM管理磁盘。我会把整个流程拆开从分区规划、引导方式选择到LVM的具体配置、系统安装、引导器设置再到装完之后可能遇到的各种坑都过一遍。适合有一定Linux基础、想认真折腾一次双系统的朋友参考。如果你是完全的新手建议先拿虚拟机练练手别直接上真机。提示本文基于2020年7月左右的Arch Linux安装镜像和当时的软件版本撰写部分命令和包名可能随版本更新有变化操作时请以官方Wiki为准。2. 装之前先把这些事想清楚2.1 引导方式UEFI还是Legacy这是第一个要做的决定而且一旦定了后面很难改。2020年的机器基本都支持UEFIWindows 10也早就默认用UEFI引导了。我的建议是只要你的机器支持UEFI就果断选UEFI别碰Legacy BIOS。原因有几个UEFI启动更快支持GPT分区表大容量磁盘必须而且引导管理更规范不容易出现引导互相覆盖的问题。具体怎么判断进BIOS设置界面看有没有“UEFI Boot”或者“Boot Mode”之类的选项。如果有选UEFI。另外Windows 10的安装盘也要用UEFI模式启动否则装出来的Windows是Legacy引导的跟Arch的UEFI引导混在一起会很麻烦。注意有些机器默认开启了Secure Boot装Arch之前需要先关掉。Arch的引导器虽然也支持Secure Boot但配置起来比较繁琐第一次装建议先关掉装完再考虑要不要开。2.2 分区方案给LVM留足空间分区规划是双系统里最容易翻车的地方。我的思路是这样的Windows 10单独占一块区域用NTFS文件系统Arch Linux这边用LVM把根分区、home分区、swap都放在逻辑卷里。这样两边的文件系统互不干扰Windows那边出问题不会影响Arch反过来也一样。具体分区表大概长这样假设磁盘是512GB分区大小类型用途/dev/sda1100MBEFI SystemEFI引导分区两个系统共用/dev/sda216MBMicrosoft ReservedWindows保留分区/dev/sda3200GBNTFSWindows系统盘/dev/sda4剩余空间Linux LVMArch的LVM物理卷EFI分区共用是UEFI双系统的标准做法两个系统的引导文件都放在这个分区的不同目录下互不冲突。Windows保留分区是Windows自动创建的不用管它。关键是最后那个LVM分区我把剩下的所有空间都给它然后在里面划分逻辑卷。为什么这么分因为LVM的好处就是灵活。比如我一开始给根分区分了50GB后来发现不够用可以直接在线扩容不用重启也不用担心数据丢失。home分区和swap也是同理想调多大调多大。传统分区方案就没这么方便了调整分区大小得用Live USB启动还有数据丢失的风险。2.3 安装顺序先Windows后Arch这个顺序很重要。Windows的安装程序有个坏习惯它会自动覆盖EFI分区里的引导项如果你先装Arch再装WindowsWindows会把Arch的引导覆盖掉你得重新配置。反过来先装Windows再装ArchArch的引导器比如GRUB能自动识别Windows的引导项省事很多。所以流程是先用Windows安装盘装好Windows 10确认能正常启动然后再用Arch的安装盘装Arch。装Arch的时候GRUB会自动扫描EFI分区找到Windows的引导文件把它加到启动菜单里。2.4 备份备份还是备份我知道这话听起来像废话但我还是要说。装双系统涉及分区操作一旦手滑选错磁盘整个盘的数据就没了。我自己的做法是装之前把重要数据全部拷到移动硬盘上然后用另一台电脑确认备份能正常读取。别嫌麻烦真出事的时候你会感谢自己。另外如果你现在的机器上已经有Windows并且不想重装那分区的时候要特别小心别动到Windows所在的分区。可以用Windows自带的磁盘管理工具压缩出空间或者用GParted之类的工具调整分区大小。但记住调整分区大小有风险操作前一定要备份。3. 一步步把系统装进LVM里3.1 制作安装盘和启动Arch的安装盘制作很简单从官网下载ISO文件然后用dd命令写入U盘dd ifarchlinux-2020.07.01-x86_64.iso of/dev/sdX bs4M statusprogress注意把/dev/sdX换成你的U盘设备名别写错了写错就把别的盘格了。写完以后重启机器进BIOS设置U盘启动记得选UEFI模式。启动后你会看到一个命令行界面这就是Arch的Live环境。先确认一下网络能不能用ping -c 3 archlinux.org如果通就可以继续。如果不通有线网一般插上就能用无线网需要用iwctl连接iwctl station wlan0 scan station wlan0 get-networks station wlan0 connect 你的WiFi名称 exit3.2 分区和LVM配置先用lsblk看看磁盘情况lsblk确认目标磁盘是/dev/sda还是/dev/nvme0n1。然后用cfdisk或者parted分区。我习惯用cfdisk界面直观cfdisk /dev/sda按照前面说的方案创建四个分区EFI分区100MBMicrosoft Reserved 16MBWindows NTFS分区200GB剩下的给Linux LVM。注意把LVM分区的类型设为“Linux LVM”在cfdisk里对应的代码是8e。分完区后创建LVM结构pvcreate /dev/sda4 vgcreate vg0 /dev/sda4 lvcreate -L 50G vg0 -n root lvcreate -L 8G vg0 -n swap lvcreate -l 100%FREE vg0 -n home这几条命令的意思是先把/dev/sda4初始化为物理卷PV然后创建一个叫vg0的卷组VG接着在vg0上创建三个逻辑卷LVroot给50GBswap给8GB剩下的全给home。为什么swap给8GB因为我的机器内存是8GBswap一般设成跟内存一样大或者略大方便休眠。如果你内存更大比如16GBswap可以设小一点比如4GB到8GB就够了。home分区给剩余所有空间因为用户数据通常最多。格式化这些逻辑卷mkfs.ext4 /dev/vg0/root mkfs.ext4 /dev/vg0/home mkswap /dev/vg0/swap swapon /dev/vg0/swapEFI分区也要格式化注意用FAT32mkfs.fat -F32 /dev/sda13.3 挂载和安装基本系统挂载逻辑卷mount /dev/vg0/root /mnt mkdir /mnt/home mount /dev/vg0/home /mnt/home mkdir /mnt/boot mount /dev/sda1 /mnt/boot然后安装基本系统pacstrap /mnt base linux linux-firmware vim这里我加了vim因为后面要编辑配置文件vi用不惯的话可以换成nano。如果你需要其他文件系统工具比如btrfs-progs或者xfsprogs也可以在这里一起装上。生成fstabgenfstab -U /mnt /mnt/etc/fstab这一步很重要它会把当前挂载的配置写入fstab系统启动时靠这个文件知道该挂载哪些分区。生成后建议cat一下看看内容对不对cat /mnt/etc/fstab3.4 chroot进去做基础配置arch-chroot /mnt设置时区ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime hwclock --systohc设置locale编辑/etc/locale.gen取消en_US.UTF-8和zh_CN.UTF-8前面的注释然后运行locale-gen echo LANGen_US.UTF-8 /etc/locale.conf设置主机名echo archlinux /etc/hostname编辑/etc/hosts加上127.0.0.1 localhost ::1 localhost 127.0.1.1 archlinux.localdomain archlinux设置root密码passwd3.5 安装引导器GRUB先装必要的包pacman -S grub efibootmgr os-prober然后安装GRUB到EFI分区grub-install --targetx86_64-efi --efi-directory/boot --bootloader-idGRUB生成GRUB配置文件grub-mkconfig -o /boot/grub/grub.cfg如果os-prober能识别到Windows你会在输出里看到“Found Windows Boot Manager”之类的字样。如果没有检查一下Windows的EFI分区是否挂载了或者手动运行os-prober看看。提示有些情况下os-prober默认是关闭的需要在/etc/default/grub里加上GRUB_DISABLE_OS_PROBERfalse然后重新生成配置。3.6 收尾和重启退出chroot卸载分区重启exit umount -R /mnt reboot重启后应该能看到GRUB菜单里面有Arch和Windows两个选项。选Arch进去用root登录然后创建普通用户、装桌面环境、配置网络这些就是常规的Arch配置流程了不在本文重点范围内。4. 装完之后可能遇到的坑4.1 GRUB找不到Windows引导这是最常见的问题。原因通常是os-prober没有正确识别Windows的EFI文件。排查步骤先确认Windows的EFI分区挂载了没有Windows的引导文件一般在EFI分区的/EFI/Microsoft/Boot/bootmgfw.efi。如果这个文件存在但os-prober还是找不到可以手动在/etc/grub.d/40_custom里添加启动项menuentry Windows 10 { insmod part_gpt insmod fat search --no-floppy --fs-uuid --setroot XXXX-XXXX chainloader /EFI/Microsoft/Boot/bootmgfw.efi }XXXX-XXXX是EFI分区的UUID用blkid命令可以查到。改完以后重新运行grub-mkconfig。4.2 时间不同步Windows和Linux对硬件时钟的理解不一样。Windows默认把硬件时钟当本地时间Linux默认当UTC。双系统下会出现时间差8小时的问题。解决办法有两种一是让Linux也用本地时间编辑/etc/adjtime把UTC改成LOCAL二是让Windows用UTC需要改注册表。我一般选第一种改Linux这边简单一点。4.3 LVM逻辑卷扩容用了一段时间发现根分区不够了怎么办LVM的好处就在这里。假设卷组vg0还有剩余空间直接扩容lvextend -L 10G /dev/vg0/root resize2fs /dev/vg0/root如果是xfs文件系统第二条命令换成xfs_growfs /。整个过程可以在线操作不用重启也不影响正在运行的服务。4.4 快照备份和回滚LVM的快照功能是我最喜欢的功能之一。装系统之前先做个快照万一装崩了可以直接回滚lvcreate -L 10G -s -n root-snapshot /dev/vg0/root回滚的时候lvconvert --merge /dev/vg0/root-snapshot重启后系统就恢复到快照时的状态了。注意快照空间要留够如果快照满了会失效。4.5 常见问题速查表问题可能原因解决方法GRUB菜单没有Windowsos-prober未启用或未识别检查EFI分区挂载手动添加启动项时间差8小时硬件时钟解释不一致改/etc/adjtime为LOCAL或改Windows注册表根分区空间不足初始分配太小lvextend扩容resize2fs调整文件系统快照失效快照空间用完删除旧快照重新创建时留足空间无法启动Arch引导器配置错误用Live USB启动chroot进去重新配置GRUBWindows更新后引导丢失Windows覆盖了EFI引导项用Arch安装盘修复GRUB或调整启动顺序5. 几个让我少走弯路的实操心得第一个心得是关于分区大小的。我一开始给根分区分了50GB觉得足够了。结果装完桌面环境和常用开发工具后只剩不到10GB。后来我重新调整根分区至少给80GB如果你要装很多大型软件或者Docker镜像建议给100GB以上。home分区反而不用太大因为大部分数据可以放在外置硬盘或者NAS上。第二个心得是关于swap的。我一开始按内存大小给了8GB swap后来发现根本用不完。如果你不打算用休眠功能swap给2GB到4GB就够了省下来的空间给根分区更实在。但如果你要用休眠swap必须大于等于内存大小否则休眠会失败。第三个心得是关于EFI分区大小的。100MB在2020年勉强够用但如果你以后要装多个系统或者多个内核可能会不够。我现在建议EFI分区至少给256MB512MB更保险。反正现在磁盘大这点空间不算什么。第四个心得是关于备份的。LVM快照虽然方便但它不是真正的备份。快照和原卷在同一块物理磁盘上如果磁盘坏了快照也跟着完蛋。真正的备份要放在另一块磁盘或者远程存储上。我现在的做法是每周用rsync把home分区同步到移动硬盘重要数据再额外传一份到云存储。第五个心得是关于文档的。装系统的时候会遇到各种问题解决之后一定要记下来。我习惯用Markdown写一个安装笔记把分区方案、命令、遇到的问题和解决方法都记下来。下次再装的时候直接翻笔记省时省力。而且写笔记的过程本身也是梳理思路的过程能帮你发现一些当时没注意到的细节。最后说一个关于心态的。装双系统这件事第一次可能会花好几个小时中间可能遇到各种报错这都很正常。别急遇到问题先看错误信息然后查Arch Wiki大部分问题上面都有答案。实在搞不定就去论坛提问但提问的时候要把你的操作步骤、错误信息、已经尝试过的解决方法都写清楚这样别人才好帮你。装系统这件事折腾本身就是学习的过程每解决一个问题你对系统的理解就深一层。