问题
在系统状态出现一些问题后,我恢复到了以前的状态快照。
从那时起我systemctl is-system-running
就处于degraded
状态(我的提示中有它)。
唯一失败的服务zsys-commit.service
是status
:
● zsys-commit.service - Mark current ZSYS boot as successful Loaded: loaded (/lib/systemd/system/zsys-commit.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Sun 2022-01-23 23:21:41 EST; 10h ago Main PID: 12287 (code=exited, status=1/FAILURE) Jan 23 23:21:40 hostname systemd[1]: Starting Mark current ZSYS boot as successful... Jan 23 23:21:41 hostname zsysctl[12287]: level=error msg="couldn't commit: couldn't promote dataset \"rpool/ROOT/ubuntu_ssfirw\": couldn't promote \"rpool/ROOT/ubuntu_ssfirw\": not a cloned filesystem" Jan 23 23:21:41 hostname systemd[1]: zsys-commit.service: Main process exited, code=exited, status=1/FAILURE Jan 23 23:21:41 hostname systemd[1]: zsys-commit.service: Failed with result 'exit-code'. Jan 23 23:21:41 hostname systemd[1]: Failed to start Mark current ZSYS boot as successful.
问题
- 如何系统确定数据集是克隆?
- 接下来是:我可以修改它吗?
- 清理所有系统状态并仅保留当前状态(所有内容均已对齐,包括启动菜单)?请参阅更新底部排名第一
更多细节:
经过一番挖掘,我们发现该服务正在运行的命令是:
/sbin/zsysctl boot commit
这是的输出sudo /sbin/zsysctl boot commit -vvv
:
DEBUG /zsys.Zsys/CommitBoot() call logged as [79ef457a:5d32ce55] DEBUG Check if grpc request peer is authorized DEBUG Authorized as being administrator INFO Commit current boot state INFO Committing boot for "rpool/ROOT/ubuntu_ssfirw" INFO Tag current user dataset: "rpool/USERDATA/szkolnik_vvk5gq" DEBUG ZFS: trying to set "com.ubuntu.zsys:bootfs-datasets"="rpool/ROOT/ubuntu_1s4qqj,rpool/ROOT/ubuntu_ssfirw" on "rpool/USERDATA/szkolnik_vvk5gq" INFO Tag current user dataset: "rpool/USERDATA/root_vvk5gq" DEBUG ZFS: trying to set "com.ubuntu.zsys:bootfs-datasets"="rpool/ROOT/ubuntu_1s4qqj,rpool/ROOT/ubuntu_ssfirw" on "rpool/USERDATA/root_vvk5gq" INFO set current time to "1643036037" DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "bpool/BOOT/ubuntu_ssfirw" DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw" DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/srv" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/srv" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/usr" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/usr" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/usr/local" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/usr/local" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/games" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/games" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/lib" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/lib" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/log" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/log" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/mail" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/mail" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/snap" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/snap" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/spool" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/spool" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/www" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/www" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/lib/AccountsService" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/lib/AccountsService" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/lib/NetworkManager" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/lib/NetworkManager" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/lib/apt" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/lib/apt" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/ROOT/ubuntu_ssfirw/var/lib/dpkg" DEBUG ZFS: can't set property "com.ubuntu.zsys:last-used"="1643036037" for "rpool/ROOT/ubuntu_ssfirw/var/lib/dpkg" as not a local property ("inherited") DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/USERDATA/szkolnik_vvk5gq" DEBUG ZFS: trying to set "com.ubuntu.zsys:last-used"="1643036037" on "rpool/USERDATA/root_vvk5gq" INFO Set latest booted kernel to "vmlinuz-5.13.0-27-generic" DEBUG ZFS: trying to set "com.ubuntu.zsys:last-booted-kernel"="vmlinuz-5.13.0-27-generic" on "rpool/ROOT/ubuntu_ssfirw" INFO Promoting user datasets INFO Promoting system datasets INFO Promoting dataset: "bpool/BOOT/ubuntu_ssfirw" DEBUG ZFS: trying to promote "bpool/BOOT/ubuntu_ssfirw" DEBUG Trying to promote "bpool/BOOT/ubuntu_ssfirw" DEBUG ZFS: an error occurred: couldn't promote "bpool/BOOT/ubuntu_ssfirw": not a cloned filesystem DEBUG ZFS: Cancelling nested transaction DEBUG ZFS: ending transaction DEBUG ZFS: reverting all in progress zfs transactions DEBUG ZFS: transaction done DEBUG ZFS: ending transaction DEBUG ZFS: ending transaction DEBUG ZFS: transaction done DEBUG ZFS: reverting all in progress zfs transactions DEBUG ZFS: transaction done ERROR couldn't commit: couldn't promote dataset "bpool/BOOT/ubuntu_ssfirw": couldn't promote "bpool/BOOT/ubuntu_ssfirw": not a cloned filesystem
更新 #1
我发现这个答案并在此基础上得出了以下代码:
# List all bpool/BOOT states, from newest created to oldest
zfs list -r -t snapshot -S creation -o name,used,referenced,creation bpool/BOOT | sed '6 i --------------------------------------------------------------------------------'
我想保留最后 4 个状态,因此我编写了以下代码,删除除最近 4 个状态之外的所有状态(从最新到最旧):
zfs list -r -t snapshot -S creation -Ho name bpool/BOOT | tail -n+5 | sed 's/.*@\(autozsys_\)\?//' | sudo xargs -i sh -c "echo removing {}...; zsysctl state remove {} --system --force || exit 255"
然而,这对我来说却卡住了,因为某种状态拒绝被删除:
ERROR couldn't remove system state kxxwbr: Couldn't remove state rpool/ROOT/ubuntu_ssfirw: Couldn't destroy rpool/ROOT/ubuntu_ssfirw: couldn't destroy "rpool/ROOT/ubuntu_ssfirw" and its children: stop destroying dataset on "rpool/ROOT/ubuntu_ssfirw", cannot destroy child: stop destroying dataset on "rpool/ROOT/ubuntu_ssfirw/usr", cannot destroy child: cannot destroy dataset "rpool/ROOT/ubuntu_ssfirw/usr/local": dataset is busy
由于某种原因,它试图破坏活动数据集。
我认为我显然没有正确处理这个问题,于是我尝试反转顺序,从最旧到最新删除(除了最近的 4 个):
zfs list -r -t snapshot -s creation -Ho name bpool/BOOT | head -n-4 | sed 's/.*@\(autozsys_\)\?//' | sudo xargs -i sh -c "echo removing {}...; zsysctl state remove {} --force --system || exit 255"
这在相同状态下出错,kxxwbr
并出现相同错误。
所以我仍然需要这方面的帮助。
答案1
回答我自己的问题,因为它似乎是一个问题,zfs
甚至可能具体到zfs-on-linux
而与无关zsys
。
我继续尝试手动清理快照,最终只剩下一个状态,当前名为kxxwbr
。
此kxxwbr
状态与名为 的数据集相关联1s4qqj
,该数据集是名为 的克隆数据集的基础ssfirw
。
下面的代码将清楚地输出状态:
zfs list -o name,origin -S creation | grep -v '\W\-$'
输出以下内容
NAME ORIGIN rpool/ROOT/ubuntu_ssfirw rpool/ROOT/ubuntu_1s4qqj@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/srv rpool/ROOT/ubuntu_1s4qqj/srv@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/usr rpool/ROOT/ubuntu_1s4qqj/usr@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/usr/local rpool/ROOT/ubuntu_1s4qqj/usr/local@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var rpool/ROOT/ubuntu_1s4qqj/var@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/games rpool/ROOT/ubuntu_1s4qqj/var/games@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/lib rpool/ROOT/ubuntu_1s4qqj/var/lib@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/lib/AccountsService rpool/ROOT/ubuntu_1s4qqj/var/lib/AccountsService@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/lib/NetworkManager rpool/ROOT/ubuntu_1s4qqj/var/lib/NetworkManager@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/lib/apt rpool/ROOT/ubuntu_1s4qqj/var/lib/apt@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/lib/dpkg rpool/ROOT/ubuntu_1s4qqj/var/lib/dpkg@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/log rpool/ROOT/ubuntu_1s4qqj/var/log@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/mail rpool/ROOT/ubuntu_1s4qqj/var/mail@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/snap rpool/ROOT/ubuntu_1s4qqj/var/snap@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/spool rpool/ROOT/ubuntu_1s4qqj/var/spool@autozsys_kxxwbr rpool/ROOT/ubuntu_ssfirw/var/www rpool/ROOT/ubuntu_1s4qqj/var/www@autozsys_kxxwbr
当我尝试推广任何数据集时,我得到以下结果:
> sudo zfs promote rpool/ROOT/ubuntu_ssfirw
cannot promote 'rpool/ROOT/ubuntu_ssfirw': not a cloned filesystem
搜索谷歌解决方案出现了很多问题,但到目前为止,没有一个提供任何解决方案。
结论和可能的解决方案
这是个 BUG!(目前看来很明显)
这是我在错误线程中的+1:
https://bugs.launchpad.net/ubuntu/+source/zfs-linux/+bug/1947568/comments/5
我正在使用第三方 PPA 作为在错误中描述:
* 这是有风险的,所以我不负任何责任,只是报告我所做的事情。
# upgrade everything and cleanup before dealing with 3rd party content
sudo apt upgrade --yes
sudo apt autoremove --yes
# add 3rd party PPA for zfstools
sudo add-apt-repository ppa:jonathonf/zfs && \
sudo apt update && \
sudo apt upgrade --yes
# you may get the following message in apt's output:
# the following packages have been kept back:
# zfs-initramfs zfs-zed zfsutils-linux
# if that is the case explicitly update zfsutils-linux by running:
sudo apt install zfs-initramfs zfs-zed zfsutils-linux
至此,promote
应该可以正常工作。
事实上,我使用以下代码来推广一切:
zfs list -Ho name,origin -S creation rpool/ROOT/ubuntu_ssfirw | grep -v '\W\-$' | sed 's/\t.*$//' | xargs -i sh -c "echo promoting {}; zfs promote {} || exit 255"
我继续删除了所有快照(只是因为此时这样更容易),激活了垃圾收集器(sudo zsysctl service gc
),然后我就可以重新启动了zsys-commit.service
。
希望从现在起这将继续发挥作用,并且有人可能会发现它很方便。