archlinux使用btrfs文件系统以及休眠

具体怎么使用btrfs安装archlinux这里不细说,大概列一下命令、注意点,也可以看最后的参考文件

使用btrfs安装系统

主要命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mount /dev/sda3 /mnt
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@usr_local
btrfs subvolume create /mnt/@opt
btrfs subvolume create /mnt/@swap
btrfs subvolume create /mnt/@var

# /var 仅用写时复制
chattr +C /mnt/@var
chattr +C /mnt/@swap

umont /mnt

# 挂载
mount /dev/sda3 /mnt -o subvol=@
mkdir /mnt/boot
mkdir /mnt/home
mkdir /mnt/var
mount /dev/sda1 /mnt/boot
mount /dev/sda3 /mnt/home -o subvol=@home
mount /dev/sda3 /mnt/var -o subvol=@var
mount /dev/sda3 /mnt/swap -o subvol=@swap
lsblk # 检查挂载情况

一般安装系统时

1
genfstab -U /mnt >> /mnt/etc/fstab

添加了 compress=zstd,可以支持压缩,节省空间,但是⚠️不建议使用压缩,会导致vscode、idea等出现问题,无法实时显示文件变动等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# <file system> <dir> <type> <options> <dump> <pass>
# /dev/nvme0n1p5
UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 / btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=256,subvol=/@ 0 0

# /dev/nvme0n1p1 LABEL=SYSTEM_DRV
UUID=6E26-4BAA /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2

# /dev/nvme0n1p5
UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 /home btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=257,subvol=/@home 0 0

# /dev/nvme0n1p5
UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 /var btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=258,subvol=/@var 0 0
UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 /swap btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=264,subvol=/@swap 0 0

# /dev/nvme0n1p5
UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 /opt btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=259,subvol=/@opt 0 0

# /dev/nvme0n1p5
UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 /usr/local btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=261,subvol=/@usr_local 0 0

如果手动添加挂载,注意每一条中的 subvolid=264,subvol=/@opt 对应

如下可以看到id

1
sudo btrfs subvolume list /mnt

注意点

  • 修改 mkinitcpio.conf
1
/etc/mkinitcpio.conf

MODULES=() 中添加修改为:

1
MODULES=(btrfs)
  • 内核参数

对于 bootctl 必须要有如下类似代码

1
options root=UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 rw rootflags=subvol=/@  quiet splash

bootctl启动

我使用 bootctl 启动

就是不想要 grub,注意双系统 efi 分区大一些,方便就一个 /bootefi 直接挂载在 /boot

1
sudo bootctl install

配置文件为:

1
2
3
4
5
6
# /boot/loader/entries/arch-boot.conf
title arch-boot
linux vmlinuz-linux
initrd initramfs-linux.img
initrd intel-ucode.img
options root=UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 rw rootflags=subvol=/@ resume=UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 resume_offset=30305772 quiet splash

其中 86f86555-c1c5-4a78-9d77-b0e4b16c7be0 出现两次

  • 启动必需

    root=UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 rw rootflags=subvol=/@

  • 休眠必需

    resume=UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 resume_offset=30305772

而这一串数字,是 btrfs 系统的分区 uuid

可以通过以下查看

1
lsblk -f

再更新即可生效

1
sudo bootctl update

查看效果

1
2
sudo bootctl status
# sudo bootctl list

临时启动另一个系统

1
2
# auto-windows 是在 sudo bootctl list 中找到的 `id`
sudo bootctl set-oneshot auto-windows

启动屏幕

1
sudo pacman -S plymouth
1
2
3
4
5
6
7
# 配置 initramfs
sudo vim /etc/mkinitcpio.conf
# 添加 resume 参数,必须在 filesystems 之后
# 我的如下,仅作参考
HOOKS=(base udev plymouth autodetect modconf kms keyboard keymap consolefont block filesystems resume fsck)
# 生效
sudo mkinitcpio -P

参考

休眠

指的是,断电(关机),也能打开就使用,恢复之前的一切

需要交换空间 swap 也就是上面预留了 /@swap,并且 /etc/fstab 挂载了 /swap

swap文件

注意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
sudo mount /dev/nvme0n1p4 /mnt/

sudo btrfs subvolume create /mnt/@swap

# 放置写时复制
sudo chattr +C /mnt/@swap

# 查看subvolid
sudo btrfs subvolume list /mnt

UUID=你的id /swap btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=你刚才看到的subvolid,subvol=/@swap 0 1

sudo mount -a

# 我内存32g,所以给了36g,有些地方说两倍,但我不想
# 因为官方文件说,即使swap比内存小,成功休眠的可能性仍然很大。
sudo btrfs filesystem mkswapfile --size 36g --uuid clear /swap/swapfile

# 启用
sudo swapon /swap/swapfile

# 配置fstab
echo "/swap/swapfile none swap defaults 0 0" >> /etc/fstab

# 需要 btrfs-progs
sudo pacman -S btrfs-progs

# 检查偏移值,看到一个数字30305772(每个人不一样),
# 也就是用在上方内核参数 `resume_offset=30305772`
sudo btrfs inspect-internal map-swapfile -r /swap/swapfile

# 注意内核参数,参考上方 bootctl配置
# 一般是:resume=UUID=86f86555-c1c5-4a78-9d77-b0e4b16c7be0 resume_offset=30305772

# 配置 initramfs
sudo vim /etc/mkinitcpio.conf
# 添加 resume 参数,必须在 filesystems 之后
# 我的如下,仅作参考
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems resume fsck)
# 生效
sudo mkinitcpio -P

# 因为我不想交换空间被使用,我只想作为休眠
sudo echo "vm.swappiness=10" > /etc/sysctl.d/99-swappiness.conf

修改swap文件大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14

sudo swapoff /swap/swapfile

sudo rm /swap/swapfile

sudo btrfs filesystem mkswapfile --size 36g --uuid clear /swap/swapfile

# 显示偏移量
sudo btrfs inspect-internal map-swapfile -r /swap/swapfile
# 注意更改偏移量
sudo vim /boot/loader/entries/arch-boot.conf

# 修改 resume_offset=34022656

休眠方式

  • 手动
1
systemctl hibernate
  • 电源键

对于 gnome45 在设置-电源,最后有一个,电源按钮行为,选中休眠即可

或者按照下面的

  • 修改 logind.conf
1
sudo vim /etc/systemd/logind.conf

找到 HandleLidSwitch 这几行,取消注释 #,修改为

1
2
HandleLidSwitch=hibernate
HandleLidSwitchExternalPower=hibernate

分别为:没有充电器时合上盖子、插上充电器时合上盖子

点击电源键同理

1
2
HandlePowerKey=hibernate
HandlePowerKeyLongPress=hibernate

注意,还需要

1
sudo systemctl daemon-reload

然后重启才生效

参考


本文作者:yuhldr
本文地址https://yuhldr.github.io/posts/c33d26e5.html
版权声明:转载请注明出处!