我有一个包含以下层的磁盘:sata 磁盘、luks、zpool、ext4
使用以下命令创建 ext4 fs:
cryptsetup -v luksFormat /dev/sdb
cryptsetup luksOpen /dev/sda store02
zpool create zstore02 /dev/mapper/store02
zfs create -V 1600G zstore02/dsk02
mkfs.ext4 -L dsk02 /dev/zstore02/dsk02
系统是 Ubuntu 20.04.1 LTS。此池后来被导入另一个 20.04.1 系统。
我想创建一个读/写快照并挂载它。但它告诉我“空间不足”:
root@computer:~# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zstore02 1,81T 1,50T 320G - - 7% 82% 1.00x ONLINE -
root@computer:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zstore02 1,61T 148G 24K /zstore02
zstore02/dsk02 1,61T 262G 1,50T -
root@computer:~# zfs snapshot zstore02/dsk02@test
cannot create snapshot 'zstore02/dsk02@test': out of space
root@computer:~# zfs get reservation zstore02/dsk02
NAME PROPERTY VALUE SOURCE
zstore02/dsk02 reservation none local
root@computer:~# zfs set reservation=10G zstore02
root@computer:~# zfs set reservation=10G zstore02/dsk02
root@computer:~# zfs snapshot zstore02/dsk02@test
cannot create snapshot 'zstore02/dsk02@test': out of space
root@computer:~#
它不适用于reserved=none 和reserved=10G。
显然,“zpool list”报告有 300G 可用空间,“zfs list”报告有 262G 可用空间。但不知为何我无法创建快照。为什么?
更新
如果我尝试创建一个新的卷,那么它就可以工作(抱歉,匈牙利语言环境):
root@computer:~# zfs create -V 1G zstore02/test
root@computer:~# mkfs.ext4 -L test /dev/zstore02/test
mke2fs 1.45.5 (07-Jan-2020)
Eszközblokkok eldobása: kész
Fájlrendszer létrehozása 262144 4 blokkal és 65536 inode-dal
Fájlrendszer UUID: 14e07b33-5d25-465a-aeb8-7fbfe2499dfd
Tartalék szuperblokkok tárolva a blokkokon:
32768, 98304, 163840, 229376
Csoporttáblák foglalása: kész
Inode táblák írásakor: kész
Napló létrehozása (8192 blokk): kész
Szuperblokkok és fájlrendszer-könyvelési információk írása: kész
root@computer:~# zfs snapshot zstore02/test@snap1
root@computer:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zstore02/test@snap1 0B - 32,7M -
root@computer:~#
它适用于我创建的任何卷,除了 zstore02/dsk02。
但为什么?
答案1
您的 zvol 上有一refreservation
组文件,它为该数据集或 zvol 保留磁盘空间,而不考虑快照或克隆。为了制作快照,必须有足够的毫无保留数据集中剩余的空间用于容纳其引用空间,在本例中为 1.50T。由于您的refreservation
空间(很可能)为 1.61T,因此您基本上无法做任何事情,因为所有可用空间都为该 zvol 保留(它永远不会使用它)。
要修复此问题,请取消重新预订。
zfs set refreservation=none zstore02/dsk02
为了避免将来出现此问题,请使用-s
(sparse) 标志创建 zvol,这也会精简配置它们:
zfs create -s -V 1600G zstore02/dsk02
如果需要厚配置卷,请创建该卷,然后设置refreservation=auto
。
zfs set refreservation=auto zstore02/dsk02