ZFS修复,移除,镜像
zpool status -v
zpool scrub ZFS
zpool export ZFS
但是因为docker退出不了
systemctl stop docker.service
就好了。。。
囧
docker 后续启动会应为默认的zfs是原来的池导致无法识别到容器
目前的玄学决绝办法是
docker info
先看下是否对应的zfs变成了别的pool
然后
systemctl stop docker.service
再运行下
docker info
就能自动回到原来的ZFS池并读取相关的容器。。。就很玄学。。。大概应为当年我直接挂载替换掉docker对应的var/lib目录而不是在/etc/docker中设置的祸根
再zpool export ZFS
zpool list -vP
其实下面显示sdX更好看些。。。P对应的应该是硬盘的序列号?反正是ID之类的
zpool list -vL
查看分区
然后还有就是zpool版本太老了
zpool upgrade ZFS
对的我的zpool名字叫。。。ZFS。。。
FreeBSD下ZFS mirror升降级、硬盘替换和在线/离线扩容实践
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
ZFS 1.07T 1.96G 1.07T - - 0% 0% 1.00x ONLINE -
mirror-0 548G 1.04G 547G - - 0% 0.19% - ONLINE
sda4 550G - - - - - - - ONLINE
sdc4 550G - - - - - - - ONLINE
mirror-1 548G 942M 547G - - 0% 0.16% - ONLINE
sdb4 550G - - - - - - - ONLINE
sdd4 550G - - - - - - - ONLINE
rpool 14.5G 6.99G 7.51G - - 43% 48% 1.00x ONLINE -
mirror-0 14.5G 6.99G 7.51G - - 43% 48.2% - ONLINE
sda3 15.0G - - - - - - - ONLINE
sdc3 15.0G - - - - - - - ONLINE
sdb3 15.0G - - - - - - - ONLINE
sdd3 15.0G - - - - - - - ONLINE
zp1 24T 1.22T 22.8T - - 0% 5% 1.00x ONLINE -
raidz1-0 24T 1.22T 22.8T - - 0% 5.06% - ONLINE
sda6 6.00T - - - - - - - ONLINE
sdc6 6.00T - - - - - - - ONLINE
sdb6 6.00T - - - - - - - ONLINE
sdd6 6.00T - - - - - - - ONLINE
ZFS 1.07T 1.96G 1.07T - - 0% 0% 1.00x ONLINE -
mirror-0 548G 1.04G 547G - - 0% 0.19% - ONLINE
wwn-0x5000c5007443bc03-part4 550G - - - - - - - ONLINE
wwn-0x5000c500e5b3cdf2-part4 550G - - - - - - - ONLINE
mirror-1 548G 942M 547G - - 0% 0.16% - ONLINE
wwn-0x5000c5007443c139-part4 550G - - - - - - - ONLINE
wwn-0x5000c5007443bec6-part4 550G - - - - - - - ONLINE
rpool 14.5G 7.00G 7.50G - - 43% 48% 1.00x ONLINE -
mirror-0 14.5G 7.00G 7.50G - - 43% 48.3% - ONLINE
ata-ST16000NM000J-2TW103_ZR5D4L00-part3 15.0G - - - - - - - ONLINE
ata-ST16000NM000J-2TW103_ZR5CNPR7-part3 15.0G - - - - - - - ONLINE
ata-ST16000NM000J-2TW103_ZR5D4DSN-part3 15.0G - - - - - - - ONLINE
ata-ST16000NM000J-2TW103_ZR5D4LJ2-part3 15.0G - - - - - - - ONLINE
zp1 24T 1.22T 22.8T - - 0% 5% 1.00x ONLINE -
raidz1-0 24T 1.22T 22.8T - - 0% 5.06% - ONLINE
wwn-0x5000c5007443bc03-part6 6.00T - - - - - - - ONLINE
wwn-0x5000c500e5b3cdf2-part6 6.00T - - - - - - - ONLINE
wwn-0x5000c5007443c139-part6 6.00T - - - - - - - ONLINE
wwn-0x5000c5007443bec6-part6 6.00T - - - - - - - ONLINE
zpool detach rpool xxx
rpool挂的硬盘有4个。我现在想只留sdc
所以我应该
ata-ST16000NM000J-2TW103_ZR5D4L00-part3
ata-ST16000NM000J-2TW103_ZR5D4DSN-part3
ata-ST16000NM000J-2TW103_ZR5D4LJ2-part3
把这几个移除
zpool detach rpool ata-ST16000NM000J-2TW103_ZR5D4L00-part3 ata-ST16000NM000J-2TW103_ZR5D4DSN-part3 ata-ST16000NM000J-2TW103_ZR5D4LJ2-part3
zpool detach rpool /dev/sda3 /dev/sdb3 /dev/sdd3
当年想的是PVE+总过只要16G就行了,ZFS放着做虚拟机和docker的分区,zp1做数据分区
zpool status ZFS
zpool status ZFS -L
所以分别做了全镜像,类似于10的,还有raidz1的,实际上当年只是想着做镜像镜像再条带会快点。。。实际上因为是Intel N3150毛的区别都没有。。。还有就是下面的叫sdX的办法也不行,也许是因为当年怕硬盘顺序颠倒直接用了硬盘ID。。。也许因为最新版的zfs出于安全考虑?
两个结合起来看也行
zpool detach ZFS wwn-0x5000c500e5b3cdf2-part4
zpool detach ZFS wwn-0x5000c5007443bec6-part4
zpool detach ZFS wwn-0x5000c500e5b3cdf2-part4 wwn-0x5000c5007443bec6-part4
就把原来的sdc sdd的4号分区弹出去了
呃。。。PVE的zfs还不能一次弹多个。。。
ls -l /dev/disk/by-id/
我觉得还是先再sdb上做出来,然后sdc上扩容下导入下rpool...
zpool attach rpool ata-ST16000NM000J-2TW103_ZR5CNPR7-part3 ata-ST16000NM000J-2TW103_ZR5D4DSN-part3
zpool status rpool
输出:
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Apr 14 21:34:11 2025
6.98G / 6.98G scanned, 4.00G / 6.98G issued at 102M/s
4.11G resilvered, 57.35% done, 00:00:29 to go
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-ST16000NM000J-2TW103_ZR5CNPR7-part3 ONLINE 0 0 0
ata-ST16000NM000J-2TW103_ZR5D4DSN-part3 ONLINE 0 0 0 (resilvering)
errors: No known data errors
最神奇的是没有启动docker就重启了,导致docker找不到容器。。。试了几次都不行。。。直到systemctl stop docker
然后运行docker info就神奇的好了
我的docker是直接把ZFS/docker的mountpoint设置成/var/lib/docker的
接着把zp1中的zp1/docker_config zp1/pve 还有 zp1/deleted 发送到新建的zp2中涉及到的占用有docker还有smb
先把原来的第三块盘的第三个分区删除第四分区删除,然后新建个60G的分区
fdisk /dev/sdc
p
看列表
Device Start End Sectors Size Type
/dev/sdc1 2048 616423 614376 300M EFI System
/dev/sdc2 616448 649215 32768 16M Microsoft reserved
/dev/sdc3 649216 32104448 31455233 15G Solaris /usr & Apple ZFS
/dev/sdc4 32104449 1185549927 1153445479 550G Solaris /usr & Apple ZFS
/dev/sdc5 1185549928 18365419111 17179869184 8T Microsoft basic data
/dev/sdc6 18365419520 31251757055 12886337536 6T Solaris /usr & Apple ZFS
sdc1 2 3 4 分区都删了吧
因为zp1还在第6个分区里面,而第五分区里面有windows上的备份。。。其实都可以删掉。。。但是有的时候没有windows挺麻烦的。。。
d 选择1
d 选择2
d 选择3
d 选择4
把1234分区都删了
n新建个分区 编号 1 起始位置 默认 结束位置 +1G (放个PE都好的)
Y确认 t 改变类型 编号 1 类型 1
n再新建个分区 编号 默认2 起始位置 默认 结束位置 +60G
t 改变类型 编号 默认2 类型 157
n 把2到5分区之间的空间分配给3号分区,全部默认就可以了
t 改变成类型157
systemctl stop docker
systemctl stop smb
摧毁快照
zfs destroy zp1/docker_config@20241014
zpool create zp2 ata-ST16000NM000J-2TW103_ZR5CNPR7-part3
umount -l zp1
zfs send zp1 | zfs recv -F zp2
umount zp1/deleted
zfs send zp1/deleted | zfs recv zp2/deleted
umount zp1/docker_config
zfs send zp1/docker_config | zfs recv zp2/docker_config
umount zp1/pve
zfs send zp1/pve | zfs recv zp2/pve
umount zp1/NAS
zfs send zp1/NAS | zfs recv zp2/NAS
一晚上终于移动完成了
zpool destroy zp1
摧毁旧的,把zp2改成zp1
zpool export zp2
zpool import zp2 zp1
把昨晚的60G跟原来15G的rpool镜像起来
zpool attach rpool ata-ST16000NM000J-2TW103_ZR5D4DSN-part3 ata-ST16000NM000J-2TW103_ZR5CNPR7-part2
等resilvering结束
把原来的15G弹出
zpool detach rpool ata-ST16000NM000J-2TW103_ZR5D4DSN-part3
zpool set autoexpand=on rpool
囧其实系统挂载的sdc是我标记的三号盘。。。
还好有windows。。。还好之前的引导是4个分区都有的。。。把efi分区的文件备份过来就好了
zpool list -vL 看下现在的分区数据
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
ZFS 1.07T 1.97G 1.07T - - 0% 0% 1.00x ONLINE -
sda4 550G 1.04G 547G - - 0% 0.19% - ONLINE
sdb4 550G 943M 547G - - 0% 0.16% - ONLINE
rpool 59.5G 7.00G 52.5G - - 11% 11% 1.00x ONLINE -
sdc2 60G 7.00G 52.5G - - 11% 11.8% - ONLINE
zp1 504G 429G 75.0G - - 0% 85% 1.00x ONLINE -
sdc3 504G 429G 75.0G - - 0% 85.1% - ONLINE
下面就是把ZFS 移动到sdb最后的分区
因为现在sdb上的分区是
efi|原来的sdb2,sdb3删掉腾出来的15G|sdb4,550G|NFTS300G|剩下的空间
但是为了未来把剩下的空间能沾满还是现在sdc上的做一个sdc4把ZFS这个池移过去。。。
先fdisk /dev/sdc
n 新建一个分区,全部默认,t 4分区成为 157
zpool create ZFS1 ata-ST16000NM000J-2TW103_ZR5CNPR7-part4
zfs list -t all| grep docker|grep 20241014|awk -F' ' '{print $1}'|xargs -n 1 zfs destroy
删除我2024年的快照。。。
systemctl stop smb
systemctl stop docker
mount |grep ZFS|awk '{print $1}'|xargs -n 1 zfs umount
zfs send ZFS | zfs recv ZFS1
因为PVE占用。。。
umount -l ZFS/subvol-100-disk-0
zfs send ZFS/subvol-100-disk-0 | zfs recv ZFS1/subvol-100-disk-0
zfs send ZFS/pve | zfs recv ZFS1/pve
终于会递归了,先拍个递归的快照
把之前的都删了吧
zfs list -t all | grep ZFS1/|awk '{print $1}'|xargs -n 1 zfs destroy
先来个快照
zfs snapshot -r ZFS@TOD
zfs send -R ZFS@TOD |pv|zfs recv -F ZFS1
等待完成
zpool destroy ZFS
zpool export ZFS1
zpool import ZFS1 ZFS
zfs list -t all| grep TOD|awk '{print $1}'|xargs -n 1 zfs destroy
删除掉快照@TOD的
大概是因为是smb服务被关闭了提醒system error': SMB share creation failed
重启去windows pe调整NTFS,把原来的NTFS做成300G
移动到硬盘前61G位置,因为EFI给了1G, 60G 要给未来的rpool
windows的BCD设置好后每个硬盘的EFI复制一遍还好diskgenius能挂载EFI分区
再回到PVE把sdb也就是实际上的标号3盘
新建一个分区,其实我在windows下放了一个NTFS的60G直接fdisk /dev/sdb t 2 157
再在windows的分区后面 新建一个 分区 全默认,然后t 4 157
w 保存
Device Start End Sectors Size Type
/dev/sdb1 2048 2099199 2097152 1G EFI System
/dev/sdb2 2099200 127930367 125831168 60G Solaris /usr & Apple ZFS
/dev/sdb3 127930368 757075967 629145600 300G Microsoft basic data
/dev/sdb4 757075968 31251757055 30494681088 14.2T Solaris /usr & Apple ZFS
新的分区表
下面就是zpool 做镜像了,这比zfs send |zfs recv简单的多
ls -l /dev/disk/by-id/ | grep sdb
查看下分区对应的ID
zpool attach rpool -f ata-ST16000NM000J-2TW103_ZR5CNPR7-part2 ata-ST16000NM000J-2TW103_ZR5D4DSN-part2
把rpool从原来的adc镜像到sdb上也就是实体编号的2和3倒换
zpool status rpool
zpool status rpool -L
查看对比下,去掉sdc,因为目前的打算是124号盘放到另外一个设备上,原来的NAS只放一个单盘
zpool detach rpool ata-ST16000NM000J-2TW103_ZR5CNPR7-part2
接着是把zp1跟sdc4做镜像,然后把ZFS中的文件导出到zp1上
zpool attach zp1 ata-ST16000NM000J-2TW103_ZR5CNPR7-part3 ata-ST16000NM000J-2TW103_ZR5D4DSN-part4
等待resilvering,因为大概有429G,通过
zpool status zp1 看到速度202M/s
远远高于zfs send |zfs recev,因为那时候的zp1是4个盘做的raiz1,读取出来后又写回到其中一个硬盘的分区。。。并且使用iostat -m看的,zpool镜像的时候用iostat -m查看也就30.8M。。。
我并不知道iostat具体为啥数据差异这么大。。。
去PVE 管理界面Datacenter--storage去除多余的
zpool detach zp1 ata-ST16000NM000J-2TW103_ZR5CNPR7-part3
然后再zpool set autoexpand=on zp1
扩容下一般除了rpool 默认的autoexpand是开启的
然后zpool scrub zp1,这操作不太规范,应该用这个指令做扩展
zpool online -e zpool online -e zp1 ata-ST16000NM000J-2TW103_ZR5D4DSN-part4
zfs snapshot -r ZFS@TOD
systemctl stop smb
systemctl stop docker
zfs send -R ZFS@TOD |pv|zfs recv -F zp1
zpool destroy ZFS
zfs set mountpoint=/var/lib/docker zp1/docker
zfs list -t all| grep TOD|awk '{print $1}'|xargs -n 1 zfs destroy
docker info
systemctl start smb
还得重新做引导???
其实不用。。。把之前的efi分区的文件全部复制过来,用pe中的boot工具修改下PVE的启动分区对应上就好了,其他硬盘拔了硬盘3就变成hd0了。。。
这实际上是efi中的硬盘编号。。。紧接着的分区是efi的FAT32分区
然后我也不记得当年怎么把Windows的引导写入了grub有的引导中的。。。
https://iheld.net/?post=230
因为只是简单复制,默认的是根据uuid的。。。清除不旧的
proxmox-boot-tool clean
构建新的
proxmox-boot-tool format /dev/sda1 --force
!!!这是格式化!!!请自行复制备份原来的文件。。。接下来重构PVE的引导
proxmox-boot-tool init /dev/sda1
proxmox-boot-tool refresh
把之前的EFI分区中的文件复制过来就行了
https://pve.proxmox.com/wiki/Host_Bootloader
pve的引导WINDOWS只要,不要覆盖掉 /EFI/BOOT/BOOTX64.EFI
,因为这个是LINUX的
/EFI/Microsoft/Boot/bootmgfw.efi
就会显示windows的引导在最下面,EFI的引导顺序可以在diskgenus的工具中,BCD的工具中或者BIOS中调整
核心是这个EFI还有BCD,当然还是最好复制备份下。。。
毕竟PVE的引导修复是要格式化的。。。
Truenas 要避开 .system
zfs send -R YYY | pv | zfs recv -F XXX
后
zfs destroy -r XXX/.system