[分享] 被 Ubuntu 坑了

2017-02-20 14:06:07 +08:00
 msg7086

前情摘要

我司入了台洋辣鸡做 NAS ,装上 Ubuntu 16.04 跑 ZFS 。

前戏

今天正好想起来,登上服务器把玩一番,一不小心就发现了奇怪的情况。

Ubuntu 趁人不备,在后台给我静默安装了 15 个不同版本的内核。

高潮

默默 dpkg 列出了所有的内核和脑袋,去掉当前的和最新的,剩下的统统拿去 purge 了。

Purge 花了不少时间,毕竟要处理各种 dkms 和 grub 呢。

全跑完一看……

ZFS 内核模块编译不通过……

仔细读了 Log 发现, 4.4.0-21 是能编译过的, 4.4.0-62 是一定会炸的。

回去跑了 dkms install zfs -v 0.6.5.6 -k 4.4.0-62-generic 看了眼,发现编译错误指向了一个系统 API :

/var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c: In function ‘__zpl_xattr_acl_set_access ’:
/var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:1284:28: warning: passing argument 1 of ‘ posix_acl_valid ’ from incompatible pointer type [-Wincompatible-pointer-types]
    error = posix_acl_valid(acl);
                            ^
In file included from /var/lib/dkms/zfs/0.6.5.6/build/include/linux/vfs_compat.h:204:0,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zpl.h:37,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zfs_vnops.h:34,
                 from /var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:81:
include/linux/posix_acl.h:84:12: note: expected ‘ struct user_namespace *’ but argument is of type ‘ struct posix_acl *’
 extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
            ^
/var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:1284:12: error: too few arguments to function ‘ posix_acl_valid ’
    error = posix_acl_valid(acl);
            ^
In file included from /var/lib/dkms/zfs/0.6.5.6/build/include/linux/vfs_compat.h:204:0,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zpl.h:37,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zfs_vnops.h:34,
                 from /var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:81:
include/linux/posix_acl.h:84:12: note: declared here
 extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
            ^
/var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c: In function ‘__zpl_xattr_acl_set_default ’:
/var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:1323:28: warning: passing argument 1 of ‘ posix_acl_valid ’ from incompatible pointer type [-Wincompatible-pointer-types]
    error = posix_acl_valid(acl);
                            ^
In file included from /var/lib/dkms/zfs/0.6.5.6/build/include/linux/vfs_compat.h:204:0,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zpl.h:37,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zfs_vnops.h:34,
                 from /var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:81:
include/linux/posix_acl.h:84:12: note: expected ‘ struct user_namespace *’ but argument is of type ‘ struct posix_acl *’
 extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
            ^
/var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:1323:12: error: too few arguments to function ‘ posix_acl_valid ’
    error = posix_acl_valid(acl);
            ^
In file included from /var/lib/dkms/zfs/0.6.5.6/build/include/linux/vfs_compat.h:204:0,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zpl.h:37,
                 from /var/lib/dkms/zfs/0.6.5.6/build/include/sys/zfs_vnops.h:34,
                 from /var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.c:81:
include/linux/posix_acl.h:84:12: note: declared here
 extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
            ^
scripts/Makefile.build:258: recipe for target '/var/lib/dkms/zfs/0.6.5.6/build/module/zfs/zpl_xattr.o' failed

默默翻出之前卸掉的那些脑袋包看了眼……

# grep posix_acl_valid /usr/src/linux-headers-4.4.0-??/include/linux/posix_acl.h
/usr/src/linux-headers-4.4.0-21/include/linux/posix_acl.h:extern int posix_acl_valid(const struct posix_acl *);
/usr/src/linux-headers-4.4.0-47/include/linux/posix_acl.h:extern int posix_acl_valid(const struct posix_acl *);
/usr/src/linux-headers-4.4.0-57/include/linux/posix_acl.h:extern int posix_acl_valid(const struct posix_acl *);
/usr/src/linux-headers-4.4.0-59/include/linux/posix_acl.h:extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
/usr/src/linux-headers-4.4.0-62/include/linux/posix_acl.h:extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *);

解决方案

没什么好说的,滚回之前的版本就好了……

头一次信 Ubuntu ,就给我看这个……

9606 次点击
所在节点    Linux
41 条回复
hosiet
2017-02-20 15:53:19 +08:00
@msg7086 问了一下某 Canonical 员工,他建议你去报 bug
Laforet
2017-02-20 15:54:57 +08:00
@Tairy

ubuntu 到 14.04 为止( 16.04 没用过,不确定)自动更新不会 purge ,旧版本内核文件残留在硬盘上直接把 inodes 吃完,然后你就开不了机了。这个 bug 至少四年前就有人指出,一直没修复。

https://bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1089195
satifanie
2017-02-20 15:56:39 +08:00
@msg7086 安装的时候 会让你选择更新不更新的。 默认的我忘记了。 我没碰到你的问题,倒是碰到了。 升级内核把 /BOOT 搞满了的问题,然后各种麻烦。。。。。 zzZ
msg7086
2017-02-20 15:57:45 +08:00
@hosiet 刚刚放狗搜了一下, zfs 的 ppa 和 github 上已经有不少人涌入了,应该轮不到我上场了。
发这帖子主要是为了可能遇到同样坑的朋友留个记录。
squid157
2017-02-20 16:00:59 +08:00
@msg7086 那个蛋疼做法曾经考虑过。
msg7086
2017-02-20 16:03:42 +08:00
@Laforet
@satifanie

突然笑死

没记错的话我选了 Security 自动更新……于是成了罪恶的根源。
ovear
2017-02-20 16:05:06 +08:00
我选择 freenas , ubuntu 维护周期太短了,基本一两年就要没啥么更新了(包括 LTS )
懒得装系统啊。。
pubby
2017-02-20 16:30:43 +08:00
今天 zpool upgrade 了一下

然后需要更新硬盘上 zfs 开机引导块,但是几年前的机器当时 boot 区只分了 64K ,不够写....折腾一下午
mortal
2017-02-20 16:34:13 +08:00
@Laforet #22 的确是这样的( 14.04 ),这种也好意思做 LTS …

LZ 的表情包好丰富~
4ever911
2017-02-20 16:47:25 +08:00
看不大懂, 高手!
raptor
2017-02-20 17:58:01 +08:00
ZFS 还是老老实实用 FreeBSD 吧,反正我用了六年多从来没出过状况。
neoblackcap
2017-02-20 19:32:23 +08:00
@msg7086 内核模块不是编译好再放生产上面放的吗?在生产环境编译不会影响业务吗?
zbinlin
2017-02-20 19:46:33 +08:00
之前在一个 KVM 上安装过 xfs 的 CentOS7 ,在 update 时或导入数据库时不定时 crash 。后来重装换了 ext4 后就好了。
hd7771
2017-02-20 19:46:36 +08:00
用 ubuntu 我都不敢更新
keramist
2017-02-21 03:48:12 +08:00
满足你一切要求 nas4free
msg7086
2017-02-21 03:50:39 +08:00
@neoblackcap 系统包,我也没办法离线编译完扔上去啊。
ericFork
2017-02-21 06:16:21 +08:00
Ubuntu 和 ZFS on Linux 在这种场景下都不够鲁棒……所以是双重风险
okudayukiko0
2017-02-21 12:43:26 +08:00
可能是开启了自动更新吧,目前 Linux 下的 ZFS 不够成熟,如要 ZFS 建议 FreeBSD 或 NetBSD 。
madper
2017-02-21 22:08:35 +08:00
@msg7086 16.04 的 zfs 明明是 in-tree 就给你预编译好了. 你为毛要自己编译?
modinfo zfs | grep file
filename: /lib/modules/4.4.0-63-generic/kernel/zfs/zfs/zfs.ko
parm: spa_config_path:SPA config file (/etc/zfs/zpool.cache) (charp)

@hd7771 那你胆子太小.

@jarlyyn ubuntu 16.04 已经有 in-tree 的 zfs 支持了. 所以 ubuntu + zfs 也不算什么艺高人胆大...
jarlyyn
2017-02-21 23:15:53 +08:00
@madper

不不不

不管 ubuntu 还是 zfs ,都是艺高人胆打,何况一起用……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/341747

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX