linux snapper/lvm2卷 创建、备份与恢复
全新安装时建议分区
/boot/efi
512MB/boot
512MBlvm
剩余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界面吗?