linux snapper/lvm2卷 创建、备份与恢复

全新安装时建议分区

  • /boot/efi 512MB
  • /boot 512MB
  • lvm 剩余500GB
    • / 50GB
    • 无分区 剩余15GB故意不分区,因为快照是要建卷的,不是文件;快照只记录改动前的文件,没有改动,就不会增加大小。
    • /home 400GB

更多分区

lvm快照卷不能排除单个目录,如果你喜欢折腾,可以按照下面的备份策略来分区

需备份:

  • home 是数据目录(/home分区)
  • /etc /usr /root /boot 与系统强关联,少了它们无法启动系统 (/boot/efi, /boot, /root分区)

无须备份:

  • /var /opt 与系统弱关联,少了它们系统仍能启动,但无法运行一些功能 (/var分区-软链接)
  • /srv /tmp /run 是临时性的目录,系统退出时会清空它们 (/var分区)
  • /sys /proc /dev /mnt /media /afs 是硬件抽象的虚拟目录 (/var分区)

分区探讨:https://www.reddit.com/r/debian/comments/jlh5un/advantages_of_creating_separate_var_partition_for/

查看存储信息

有人吐槽btrfs不稳定,所以还是老办法吧:lvm2-ext4
建议现在虚拟机内练习一下,再上实机。
u盘用ventoy烧录(多系统支持),进入linux的iso镜像,打开控制台

liveuser@localhost-live:/$ lsblk # 显示所有挂载的存储设备

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    2G  1 loop # 文件挂载成文件系统,比如swapfile
loop1         7:1    0    8G  1 loop 
├─live-rw   253:0    0    8G  0 dm   / #挂载在根的device mapper,通用的抽象虚拟层,可能是LVM或加密设备
└─live-base 253:1    0    8G  1 dm   
loop2         7:2    0   32G  0 loop 
└─live-rw   253:0    0    8G  0 dm   /
sr0          11:0    1  2.1G  0 rom  /run/initramfs/live # 只读,可以是CD-rom, dvd-rom……
zram0       251:0    0  1.9G  0 disk [SWAP] # 用作SWAP的磁盘(虚拟内存-分区版)
vda         252:0    0    1G  0 disk # 可读写磁盘

vda是我们要操作的硬盘

创建lvm2:pv,vg,lvcreate

pv物理卷→vg卷组→lv逻辑卷

sudo -i #如果执行这条语句,后面则无须再用sudo
sudo pvcreate /dev/vda
sudo vgcreate -s 4M myvg /dev/vda # -s最小分配单元为4M,即后期扩容、收缩至少4M(-s的默认值也是4M)
sudo lvcreate -l 90%FREE -n mylv myvg

sudo mkfs.ext4 /dev/myvg/mylv # 别忘格式化

-l 90%FREE 所有可用空间的90%
-l 80%VG 该卷组的80%
-l 70%PVS 所有物理卷的70%
-l 1000 1000块最小分配单元(PE: physical extent)

挂载

sudo mkdir /mnt/mylv # 创建挂载点
sudo mount /dev/myvg/mylv /mnt/mylv # 临时挂载,重启失效

nano /etc/fstab # 永久挂载
# fstab内添加新行,按ctrl+s保存,Ctrl+x退出:
/dev/myvg/mylv /mnt/mylv ext4 defaults 0 0

sudo mount -a # 挂载所有在/etc/fstab文件中定义的文件系统

收缩lvm

硬盘用几年了的,最好先备份一下。

sudo umount /mnt/mylv #卸载
sudo e2fsck -f /dev/myvg/mylv #检查文件系统的一致性

df -h /dev/myvg/mylv #查看实际占用大小Used

#收缩文件系统
sudo resize2fs /dev/myvg/mylv 300M #调整大小到300M
sudo resize2fs -M -p /dev/myvg/mylv #缩到尽可能小-M, -p to show progress bar
sudo resize2fs /dev/myvg/mylv #扩大到最大,上限为lv逻辑卷大小

sudo lvreduce -L 300M /dev/myvg/mylv #收缩逻辑卷
sudo mount /dev/myvg/mylv /mnt/mylv #重新挂载
更多注解

df --output=source,size /dev/myvg/mylv显示文件系统的大小。
tail -n +2删除df命令的标题行,从第二行开始输出。
awk '{printf "%dM\n", $2/1024}'将大小从Kb(Kb=1K-blocks=1000)转换为。

umount: /mnt/mylv: target is busy.

sudo lsof /mnt/mylv #列举占用的进程
sudo lsof /mnt/mylv | awk 'NR>1 {print $2}' | xargs -r kill #懒

一些关键程序会拒绝被kill,就得使用kill -9杀死

mount: /mnt/l: unknown filesystem type 'LVM2_member'.

exec failed at mount /dev/nvme0n1p3 /mnt/mylv because e2fsck failed too.

e2fsck: Not a directory while trying to open /dev/nvme0n1p3/
The superblock could not be read or does not describe a valid ext2/ext3/ext4
filesystem.

Solution: https://www.cnblogs.com/ddbear/p/7485857.html

lvdisplay
e2fsck -f /dev/l/fedora
lvdisplay output
  --- Logical volume ---
  LV Path                /dev/l/data
  LV Name                data
   
  --- Logical volume ---
  LV Path                /dev/l/fedora
  LV Name                fedora

e2fsck non-contiguous

https://bashcommandnotfound.cn/article/linux-e2fsck-command
没坏,只是碎片化存储

备份lvm

先加一份文本,验证lvm备份/恢复是否正确

# 下面2种方式2选一
sudo chmod 777 /mnt/mylv #权限代码
sudo chown $USER:$USER /mnt/mylv #更改拥有权

cd /mnt/mylv && echo "before" > a.txt
权限代码 & 用户组

&&表示前面执行成功,才会执行后面的语句
>表示将"before"覆盖写入到a.txt;>>则是追加写入

权限代码

7的二进制为111,3位数分别:读/写/执行,r/w/x(eXecute)
777,3位数分别:所有者/组/其他用户,owner/group/others

常用用户组

chown myuser:mygroup myfile

  • root:系统管理员组。
  • wheel:通常用于拥有sudo权限的用户组。

  • daemon:运行守护进程的用户组。
  • adm:通常用于系统监控任务的用户组。
  • sys:通常用于拥有系统相关文件和目录的用户组。
  • bin:拥有许多可执行文件的用户组。

  • tty:拥有终端设备的用户组。
  • disk:拥有磁盘设备的用户组。
  • lp:拥有打印设备的用户组。
  • cdrom:拥有CD-ROM设备的用户组。
  • audio:拥有音频设备的用户组。
  • video:拥有视频设备的用户组。
  • plugdev:允许用户访问插入的设备(如USB键盘,鼠标等)的用户组。
  • mail:用于邮件系统的用户组。
sudo lvcreate --size 100M --snapshot --name mysnapshot /dev/myvg/mylv # 快照=新建卷
sudo lvremove /dev/myvg/mysnapshot # 当你觉得这份快照没必要时

请注意,当快照的空间用完时,快照将自动被删除。因此,你需要确保你的快照有足够的空间来存储你打算进行的所有修改。

恢复lvm

先修改文本echo "after" >> a.txt

sudo umount /mnt/mylv #卸载
sudo lvconvert --merge /dev/myvg/mysnapshot #恢复
sudo mount /dev/myvg/mylv /mnt/mylv #重新挂载

看一看a.txt的内容吧

thick to thin lvm volume

dd: https://opensource.com/article/18/7/how-use-dd-linux
dd with gzip: https://blog.csdn.net/Wang20122013/article/details/123008277
thin-pool教程:https://cn.linux-console.net/?p=2079
起因:我不道啊,所以需要重新分区(但又不能动数据)

#backup, recommend to shrink first
dd if=/dev/sda status=progress bs=32M | gzip -c > sda.img.gz #bs speedUp
#recover
gzip -dc sda.img.gz | dd status=progress of=/dev/sda bs=4M
#dd if=/dev/myvg/mylv of=mylv.img #raw way
#cat /dev/myvg/mylv > mylv.img #same result but better use dd

sudo lvcreate --type thin-pool --size 100G myvg -n thinpool
sudo lvcreate --type thin --virtualsize 400G --name thinvol myvg/thinpool #thinpool是个抽象层
mkfs.ext4 /dev/myvg/thinpool # remember to format first

sudo vgdisplay myvg | grep PE #先看PE Size块大小,同理也有pvdisplay, lvdisplay
sudo dd if=/dev/myvg/mylv of=/dev/l/thinpool/thinvol bs=4M #复制,if输入文件,of输出文件,bs=pe=块大小=4MB

sudo lvremove /dev/myvg/mylv #删除mylv
#of course you may want to keep it and reboot to see if it worked
#so we need to change the original,old one volume's uuid
tune2fs /dev/sda -U random

#lvextend --poolmetadatasize 4M myvg/thinpool # set to 4M
#lvextend --poolmetadatasize +4M myvg/thinpool #or just add 4M
sudo lvs #pvs,vgs,lvs查看相关状态

--virtualsize一般大于thin-pool --size,由于多了thinpool这个抽象层,仅在写入thinvol时才动态拓展其空间,上限为thin-pool --size的实际大小。

Warning:

root@localhost-live:/# lvextend --poolmetadatasize 400G l/pool
  Reached maximum pool metadata size <15.88 GiB (4065 extents).
  Thin pool will use metadata without cropping.
  Size of logical volume l/pool_tmeta changed from 32.00 MiB (8 extents) to <15.88 GiB (4065 extents).
  WARNING: Sum of all thin volume sizes (464.75 GiB) exceeds the size of thin pool l/pool and the amount of free space in volume group (<376.20 GiB).
  WARNING: You have not turned on protection against thin pools running out of space.
  WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
  Logical volume l/pool successfully resized.

调整分区

向后/向前调整

gpart中,在分区尾部调整(收缩/扩容)很快,但移动分区/空出头部会很慢。
注意用gpart调整lvm块时,先要取消激活deactivate,取消挂载在/dev/mapper上。
dev/nvme0n1p3 🔑,有钥匙代表是激活的,需要取消激活。
因为会自动挂载,所以报错的话,就再取消激活就行了。

/boot/efi /boot lvm 鼠标放我身上
256MB 512MB 400.5GB🔗 🔗400.5GB
256MB 512MB 400GB
256MB 512MB →400GB
256MB 1024MB🔗 🔗1024MB →400GB

快照

开机自启备份root

https://github.com/AClon314/profiles/blob/main/utils/lvm_shot.sh

lvm增量快照脚本

git clone https://github.com/intentionally-left-nil/lvm-autosnap.git &&
sudo mv lvm-autosnap /usr/share/lvm-autosnap &&
cd /usr/share/lvm-autosnap &&
sudo ./install-hook.sh &&
echo 'add_dracutmodules+=" /usr/lib/systemd/system/lvm-autosnap "' | sudo tee /etc/dracut.conf.d/lvm-autosnap-hooks.conf &&
sudo dracut -f &&
sudo systemctl enable lvm-autosnap.timer

思路参考:https://github.com/intentionally-left-nil/lvm-autosnap?tab=readme-ov-file#how-it-works

btrfs: timeshift

是的,Timeshift 支持 LVM。Timeshift 是一个 Linux 系统恢复工具,它可以创建系统的快照,并在需要时恢复系统到之前的状态。Timeshift 支持两种快照类型:RSYNC 和 BTRFS。
对于 RSYNC 快照,Timeshift 可以在任何文件系统上创建快照,包括 LVM 卷。然而,这种快照类型需要更多的磁盘空间,并且创建和恢复快照的速度较慢。
对于 BTRFS 快照,Timeshift 必须在 BTRFS 文件系统上创建快照。这种快照类型使用的磁盘空间较少,并且创建和恢复快照的速度较快。然而,BTRFS 快照不能在 LVM 卷上创建。
所以,如果你的系统使用 LVM,并且你想使用 Timeshift,你应该选择 RSYNC 快照类型。

snapper

需要thin精简lvm卷,但大多linux发行版创建的lvm-ext4都是厚lvm卷,而非thin。

⚠️⚠️⚠️
thin-lvm精简瘦lvm卷不支持收缩!所以桌面发行版才不采用瘦的,采用thick厚卷

在全新安装前,需要自己创建&格式化分区。sh脚本

snapper下载
博客:https://tomoku-dm.github.io/2018/06/17/2-snapper/
文档:https://documentation.suse.com/zh-cn/sles/12-SP5/html/SLES-all/cha-snapper.html
博客里没说要单独分区给snapper的备份文件
可以用自带的gnome-disk-gui设置挂载选项(不用自己写/etc/fstab),参见

为什么没有GUI?

假设你要远程ssl连接一台服务器去扩容,你觉得有gui界面吗?

posted @ 2024-05-05 17:20  Nolca  阅读(34)  评论(0编辑  收藏  举报