存储
这一章讲主机上的存储:存储页上看到什么、建存储池、加第二个池、ISO 放在哪里、虚拟机的磁盘、换盘、定期检查数据、看磁盘健康,最后列出 1.0 还不做的事。第一次建池见首次设置。
1. 存储是怎么组织的
- keelOS 的存储是 ZFS。存储池(pool)由磁盘组成,虚拟机的磁盘、快照、ISO 都在池里。
- 安装时只会占掉一块盘的最前面一小段(keelOS 的启动分区),其余的空间和别的盘都留给你,在网页上建存储池,见 §3。默认的池叫
zones。 - 有多个池时,其中一个是默认存储池:新建的虚拟机、ISO 库、软件包和 keel 自己的数据(数据库、日志)都放在它上面,见 §5。
- keel 为每台虚拟机建一个自己的数据集,磁盘、UEFI 变量、日志和快照都在里面。数据集的事 keel 自己管,网页上不用你建。
注意:ISO 和虚拟机放在存储池
zones上,不放在启动盘的系统分区里。启动分区很小,只放 keelOS 自己。所以没有存储池就不能建虚拟机、也不能传 ISO。
2. 存储页
打开 配置 → 存储。页面从上到下是:
- 池卡片:每个存储池一张。标题是池名(默认池带 默认 标记)和状态(
ONLINE是正常,其他颜色是有问题)。下面是剩余空间、占用条、碎片 N%,以及池里的设备树:镜像、raidz 或单盘,每块盘的大小和状态。默认池的卡片下面还有数据检查(scrub),见 §8。 - 磁盘 表:主机上每块盘一行,列有 磁盘、型号、序列号、容量、分区(一条色带,标出 keelOS 启动分区、池占的部分、别的分区、未用空间)、扇区、类型(SSD 或 HDD)、健康、池(不在池里的盘写 不在池里)。
- guest 的磁盘:每台虚拟机的每块盘占了多少(已用 / 总量),有两个以上的池时多一列 池。
- ISO 镜像:见 §6。
有些卡片只在能用时出现:没有存储池时有 建立存储池;盘上有以前装的池时有 导入存储池;装在启动分区上的主机有 启动分区的副本;还有空盘时有 建池(建第二个池)。
注意:改动存储的按钮(建池、加盘、分离、删池……)要有主机写权限的账户;只读账户只能看。
keelOS 不认的存储控制器,它们的盘不在这里列出,页面上会写 keelOS 不支持的存储控制器。可以把整个控制器直通给一台虚拟机,见设备直通。
3. 建存储池
没有存储池时,页面上是 建立存储池 zones。
- 打开 配置 → 存储。
- 在 存储池名字 里填名字(默认
zones)。小写字母开头,后面是字母、数字、_、.、-。 - 勾要用的空间: - keelOS 启动分区后面的剩余空间(页面写"keelOS 启动分区后面还有 N"):只有一块盘时选它。 - 整块盘:每块盘一行,写着容量、型号,以及"空盘"或"盘上有:……"。整块盘会被清空。 - 盘上有别的池的标签时,那一行是灰的、不能选,先 清除标签 或导入那个池(见 §9)。
- 勾了两块以上时,出现 布局:
| 布局 | 要几块盘 | 说明 |
|---|---|---|
| 单盘 | 1 | 没有冗余,盘坏了数据就没了。 |
| 镜像 | 2 块以上 | 每块盘上都是同样的数据,坏到只剩一块也不丢。可用空间 = 最小的那块。 |
| raidz(可坏一块) | 3 块以上 | 可用空间约 = 最小的盘 × (块数 − 1)。 |
| raidz2(可坏两块) | 4 块以上 | 可用空间约 = 最小的盘 × (块数 − 2)。 |
- 点 建立 zones…。弹出确认框,列出每块盘的型号、容量、序列号、现在盘上有 什么、将变成 什么,以及布局和 可用约 N。盘上有数据的行是红的,要照着框里写的,输入这几块盘的名字才能继续:红色的盘上的一切(包括别的池)都会被销毁,无法恢复。
- 点确认框里的 建立 zones。几秒钟后提示 存储池 zones 建好了。
池用 4K 对齐,开着 lz4 压缩,建池时同时打开 autotrim(SSD 释放的空间自动通知盘)和 autoexpand(盘变大后池可以长大)。这些是 keel 定好的,网页上没有开关,也不用你管。
注意:打算整块直通给 NAS 虚拟机的盘不要选进存储池。
注意:带 T10-PI(保护信息)或每块带元数据格式的 NVMe 盘,keelOS 用它建池时会顺便格式化成不带这些的格式,因为 FreeBSD 不写有效的校验标签,换到 Linux 或直通给 Linux 虚拟机会读不出来。扇区格式(512、512e、4Kn、LBA 格式)在 配置 → 硬件 里按盘设置。建池用哪种都行,只认 512 字节扇区的系统用不了 4Kn 的盘。
3.1 给启动分区再放一份
只有一块启动盘时,这块盘坏了主机就起不来。启动分区的副本 卡片可以在第二块盘上再写一份 keelOS 的启动分区(那块盘的其余空间留着不用,盘会被清空):
- 在 磁盘 里选一块盘。
- 盘上有东西时,输入盘名确认。
- 点 写入副本。
在镜像池里加盘时也可以顺便勾上这一项,见 §7。
4. 往镜像里加盘
单盘的池可以加一块盘变成镜像,镜像可以再加一块多一份副本:
- 在池卡片的设备树里,找到最上层的单盘或镜像那一行,点 加入…。
- 在 给 … 加一块盘 里选盘。可选的是启动分区后面的空间,或者一块整盘(会被清空,要输入盘名确认)。比被镜像的那块盘小的盘是灰的,写着至少要多大,因为镜像的成员不能比它小。
- 整盘还可以勾 同时在这块盘上写一份 keelOS 启动分区的副本。
- 点 加入。池把全部数据复制到新盘上(resilver),进度显示在池卡片里。复制期间虚拟机照常运行,只是磁盘会慢一些。
要把镜像里的一块盘拿出来:点那块盘的 分离,确认。数据还在其余的盘上;只剩一块盘时没有第二份副本。池里最后一块放数据的盘不能分离。
5. 有多个存储池
用户的数据可以分在几个池里,例如一个快的 NVMe 池放系统盘,一个大的 HDD 池放数据。(设计见 docs/75。)
再建一个池:还有没用的盘时,存储页上多出一张 建池 卡片,做法和 §3 一样,名字默认是下一个空闲的(zones2、zones3……)。
默认存储池:每个池卡片上,不是默认的池有 设为默认…。确认后:
- 新建的虚拟机放到它上面;
- keel 自己的数据(
/var/db/keel、/var/log)现在就搬过去; - ISO 库和装好的软件包不搬,留在旧池上。以后要删旧池的话,ISO 得重新上传。
默认池也可以在 系统 → 维护 的 默认存储池 里换。
新建虚拟机选池:有多个池时,新建虚拟机的向导里 存储池 一栏可以选,旁边写着每个池剩多少(… · 剩 N)。
删池:不是默认池、而且上面没有虚拟机的池,卡片上 删除… 可点。输入池名确认,池被销毁,它的盘空出来,里面剩下的一切都没了。上面还有虚拟机时按钮是灰的,先把它们搬走。
6. ISO 镜像
存储页最下面的 ISO 镜像 卡片是安装盘库。它在默认存储池上,所有虚拟机共用;新建虚拟机时选 ISO 就是从这里选。
- 上传 ISO:从浏览器上传。文件名要以
.iso或.img结尾;.qcow2、.vmdk、.dmg上传后 keel 自动转成.img,上传和转换都显示进度,点 ✕ 可以取消。同名的文件已经有时提示 已经有了。 - 从网址下载:贴一个
http或https地址,点 从网址下载,由主机自己下载,下载期间可以离开这个页面,回来看进度。 - 列表里每个 ISO 的右侧会认出它是什么系统(来自卷标和文件名),认不出的写 认不出来,鼠标放上去看卷标。
- 删除:点名字旁边的 ✕。ISO 正在某台虚拟机的光驱里时会问 仍然删除吗,删了以后那台虚拟机要换掉光驱才能启动。
在新建虚拟机的向导里也可以直接 上传 ISO,传完点 回到新建 guest 继续。上传和删除需要有"上传、删除镜像"权限的账户。
注意:已经装好的系统镜像(路由器固件之类)当第一块盘用,不走 ISO 库,见虚拟机管理。
7. 虚拟机的磁盘
- 新建虚拟机时向导里的磁盘默认是 20 GiB(模板会改),可以改大小、再用 + 磁盘 加。这是向导里的大小,不是 ISO 的位置。
- 磁盘的类型默认是
zvol:ZFS 的块设备,快照、克隆、扩容都有;file是数据集里的一个文件,在 自定义 和编辑页里能选,一般用不着。 - 磁盘接口(
virtio-blk、NVMe、AHCI……)由模板定,要换在编辑页的 存储 里。 - 加大:磁盘只能加大,在编辑页的 存储 里改,见虚拟机管理。
- 每块盘占了多少:存储页的 guest 的磁盘 表。
- 快照在每台虚拟机的详情页里拍,见虚拟机管理;存储页没有按数据集拍快照的功能。快照放在池里,不是备份,备份见快照、备份与迁移。
7.1 搬到别的存储池
有两个以上的存储池时,虚拟机可以在池之间搬家,运行中的也行:先在运行中复制,再追几轮增量,最后切换时虚拟机停顿不到一秒,校验后删掉旧的。(设计见 docs/83。)
- 一台虚拟机:详情页的 搬到别的存储池…,选 搬到 的池(旁边写着剩余空间,放不下的灰着,并写原因),点 搬家。对话框显示阶段(复制中、追赶中、切换中、校验中、收尾)、进度,运行中的搬完会写 停了 N ms。
- 一批虚拟机:池卡片上的 搬 guest…,勾要搬的,一台一台搬。挂起的搬完还是挂起,出错或配置坏的列出来不动。
- 存储页最下面的 存储池之间的搬家 列出正在搬和刚搬完的。
注意:目标池剩余空间要放得下这台虚拟机现在用的量,放不下的池在下拉框里是灰的。
8. 数据检查(scrub)
默认池的卡片下有 数据检查(scrub):把池里全部数据读一遍,校验和对不上的,镜像或 raidz 里有好副本就自动修好。虚拟机照常运行,检查期间磁盘会慢一些。
- 立即检查 开始,检查中 停止。检查中显示百分比、还剩 …、速度曲线,以及 每块盘的读取速度:同一个镜像里的盘读得应该差不多快,一块盘一直比别的慢很多,可能要坏了,看它的健康。
- 计划…:定期检查 选 每月(第一个星期几)、每周(星期几)或 关,再选 时间;还可以 另外检查一次 选一个将来的时间。时间按主机的时区。
- 检查完,卡片上留着 上次检查 的时间、用时、速度和发现的错误数。
默认是每月一次。
9. 导入旧的池和清除标签
盘上有存储池、但这台主机没有导入它(例如重装之前的池):
- 导入存储池:存储页上出现卡片 导入存储池 zones,点 导入,原来的虚拟机都回来。这台主机的设置、密码和令牌不变。
- 不想要那个池了:在 磁盘 表里那块盘一行点 清除标签…,输入池名确认。清掉以后池里的数据再也恢复不了。这些盘变成普通的盘,可以拿去建池。
keelOS 不会自己清掉没导入的池的盘,免得误删。
10. 磁盘健康、温度
- 存储页 磁盘 表的 健康 一列是磁盘自己的 SMART 结论(SATA、SAS 和 NVMe 都有):正常 或 故障。把鼠标放上去,显示当前温度和通电小时数。读不出来的盘显示
–。 - 池卡片的设备树里,每块盘有 ZFS 的状态(
ONLINE……)。坏盘、被拔掉的盘在这里变色。 - 概览 页会提醒存储池不是
ONLINE。 - 主机整体的温度(CPU、主板传感器)和风扇在 配置 → 硬件,另有 体检 页做磁盘和主机的检查与温度曲线,见故障排查与日志。
注意:健康显示 故障 的盘,或者设备树里变色的盘,尽快换,见下一节。
11. 换坏盘
镜像里的盘坏了,或被拔掉,设备树里它的行是变了色的状态,旧盘写 不在。1.0 网页上能做的是"先加后拿":
- 装上新盘(不比被镜像的盘小)。
- 点镜像那一行的 加入…(§4),选新盘,等 resilver 完成,池卡片里的进度走完。
- 点坏盘那一行的 分离。池里只留下好盘。
只剩一块盘的单盘池,不能靠换盘救数据,请从备份恢复。
raidz、raidz2 的池:1.0 的网页上还不能换盘(只能给镜像和单盘加盘、从镜像拿盘)。用命令行,在主机控制台或 ssh 上:
zpool status zones # 看哪块盘坏了,记下它的名字
zpool replace zones 旧盘名 新盘名 # 例如 zpool replace zones gpt/zones1 nda3
resilver 的进度在存储页池卡片里看,或用 zpool status zones。换完等它结束,池回到 ONLINE。
注意:命令行换盘不会给新盘写 keelOS 启动分区的副本;原来有副本的盘换了,要回存储页的 启动分区的副本 再写一次。
12. 1.0 还不支持什么
- 网页上不能给 raidz 换盘,也不能把单盘、镜像改成 raidz,或往 raidz 里加盘;命令行
zpool replace见 §11。 - 存储页没有按数据集拍快照、浏览数据集的功能:快照在每台虚拟机的详情页里。数据集由 keel 管理,不手工建。
- 没有池级别的配额和预留,没有池改名,没有跨池共享的 ISO 库(ISO 库只在默认池上,换默认池时不搬)。
- ISO 库和软件包不跟着默认池搬,换默认池后要重新上传 ISO(§5)。
- 网页上没有 SMART 详细信息,只有 正常 / 故障、温度和通电小时数;详细的用
smartctl。 - 存储页不做文件共享:要共享文件,在虚拟机里做 NAS(keelNAS)。