V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
msg7086
V2EX  ›  Linux

[分享] 被 Ubuntu 坑了

  •  
  •   msg7086 ·
    msg7086 · 2017-02-20 14:06:07 +08:00 · 9582 次点击
    这是一个创建于 2832 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情摘要

    我司入了台洋辣鸡做 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 ,就给我看这个……

    41 条回复    2017-02-22 01:45:12 +08:00
    mephisto
        1
    mephisto  
       2017-02-20 14:12:37 +08:00   ❤️ 1
    今年地球引力是弱了点
    sighforever
        2
    sighforever  
       2017-02-20 14:13:32 +08:00
    这不是内核的锅么?为什么 ubuntu 要背?
    fyyz
        3
    fyyz  
       2017-02-20 14:15:04 +08:00 via Android
    别重启就不会换内核
    DesignerSkyline
        4
    DesignerSkyline  
       2017-02-20 14:17:48 +08:00
    把 unattended upgrade 关掉就能解决了吧
    neoblackcap
        5
    neoblackcap  
       2017-02-20 14:18:28 +08:00
    其实我是不明白,你们是有 15 个内核同时在跑?没有的话那么那也只是占一下系统空间而已,没必要删啊。
    msg7086
        6
    msg7086  
    OP
       2017-02-20 14:19:15 +08:00
    @sighforever 发行版要保证内核模块包与内核包之间的兼容性。
    像 ZFS 这样重要的内核模块,竟然会在内核小版本更新的时候出现编译错误,你说这锅为什么不能让 Ubuntu 背……

    官方仓库包诶又不是 PPA 第三方。
    loading
        7
    loading  
       2017-02-20 14:20:53 +08:00 via Android
    nas 我会选择 ext4 做文件系统
    msg7086
        8
    msg7086  
    OP
       2017-02-20 14:23:52 +08:00   ❤️ 1
    @fyyz 然而万一机房断电了,下一次启动的时候……

    @DesignerSkyline 学习了,回头去看一下怎么搞。

    @neoblackcap 吃了我 4G 多的硬盘。(当然这并不重要,我不在意。
    但是更新内核模块的时候要编译 15 次你想过要多少时间吗……

    @loading 如果能让我选的话,我会选 XFS 。
    但是要用 ZFS RAID Z3 ,我没的选啊。
    jarlyyn
        9
    jarlyyn  
       2017-02-20 14:29:06 +08:00
    ubuntu+zfs

    艺高人胆大,必须赞
    zlhdd108
        10
    zlhdd108  
       2017-02-20 14:29:52 +08:00 via Android
    zfs 应该是 Freebsd 的支持最好,作 nas ,配置够,直接用 Freenas 吧,基于 Freebsd ,只支付 zfs
    msg7086
        11
    msg7086  
    OP
       2017-02-20 14:33:34 +08:00
    @zlhdd108 我们以前的 NAS 就是 FreeNAS 上面跑的 UFS ,被我拆下来扔了……
    BSD 不会玩,还是 Linux 熟悉一点,包管理,设备,应用层的环境什么的……
    之前用 Ubuntu 跑 ZFS 也是因为 Ubuntu 官家放话说要好好支持……
    zlhdd108
        12
    zlhdd108  
       2017-02-20 14:37:10 +08:00 via Android
    @msg7086 实际上还是 bsd 支持好…
    dynaguy
        13
    dynaguy  
       2017-02-20 14:37:19 +08:00
    貌似 LZ 用的是 Ubuntu 的 desktop 版本~

    Server 版一般是不會自動給你升級的。
    msg7086
        14
    msg7086  
    OP
       2017-02-20 14:39:19 +08:00
    @zlhdd108 我知道的,还不是看中 Linux 的生态嘛……

    @dynaguy 我一定是用了假的 Ubuntu→_→
    -rwxrw-rw- 1 nobody nogroup 655M Apr 21 2016 ubuntu-16.04-server-amd64.iso*
    gwind
        15
    gwind  
       2017-02-20 14:42:32 +08:00
    Ubuntu ZFS 应该问题不大吧?我是 CentOS7 + ZFS 的,用了1年的备份服务器。
    squid157
        16
    squid157  
       2017-02-20 14:55:52 +08:00 via Android
    我想了半天 决定 Ubuntu+ext4
    zfs 还是 FreeBSD 吧
    btrfs 有 bug
    trlsmax
        17
    trlsmax  
       2017-02-20 14:57:44 +08:00 via Android
    Linux 的 nas 系统好像有个叫 open media vault 的,不过貌似不支持 zfs
    msg7086
        18
    msg7086  
    OP
       2017-02-20 15:03:57 +08:00
    @trlsmax OMV 那个是面向普通人群的,「 without deeper knowledge 」。
    对于我们做开发的公司来说适得其反。

    @squid157 其实还有一种奇葩的结构,就是在 ESXi 上装 BSD / Solaris ,带着直通上来的硬盘构建出 ZFS 以后,做成 iSCSI target 装载进 ESXi ,然后再把 Ubuntu 安装在这上面。
    很蛋疼。
    Showfom
        19
    Showfom  
       2017-02-20 15:24:14 +08:00
    所以用 Debian 啊哈哈
    Tairy
        20
    Tairy  
       2017-02-20 15:29:38 +08:00
    刚删了一堆自动不知道啥时候更新的内核,硬盘瞬间多了好几个 G !
    hosiet
        21
    hosiet  
       2017-02-20 15:53:19 +08:00 via Android
    @msg7086 问了一下某 Canonical 员工,他建议你去报 bug
    Laforet
        22
    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
        23
    satifanie  
       2017-02-20 15:56:39 +08:00
    @msg7086 安装的时候 会让你选择更新不更新的。 默认的我忘记了。 我没碰到你的问题,倒是碰到了。 升级内核把 /BOOT 搞满了的问题,然后各种麻烦。。。。。 zzZ
    msg7086
        24
    msg7086  
    OP
       2017-02-20 15:57:45 +08:00
    @hosiet 刚刚放狗搜了一下, zfs 的 ppa 和 github 上已经有不少人涌入了,应该轮不到我上场了。
    发这帖子主要是为了可能遇到同样坑的朋友留个记录。
    squid157
        25
    squid157  
       2017-02-20 16:00:59 +08:00 via Android
    @msg7086 那个蛋疼做法曾经考虑过。
    msg7086
        26
    msg7086  
    OP
       2017-02-20 16:03:42 +08:00
    @Laforet
    @satifanie

    突然笑死

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

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

    LZ 的表情包好丰富~
    4ever911
        30
    4ever911  
       2017-02-20 16:47:25 +08:00
    看不大懂, 高手!
    raptor
        31
    raptor  
       2017-02-20 17:58:01 +08:00
    ZFS 还是老老实实用 FreeBSD 吧,反正我用了六年多从来没出过状况。
    neoblackcap
        32
    neoblackcap  
       2017-02-20 19:32:23 +08:00
    @msg7086 内核模块不是编译好再放生产上面放的吗?在生产环境编译不会影响业务吗?
    zbinlin
        33
    zbinlin  
       2017-02-20 19:46:33 +08:00
    之前在一个 KVM 上安装过 xfs 的 CentOS7 ,在 update 时或导入数据库时不定时 crash 。后来重装换了 ext4 后就好了。
    hd7771
        34
    hd7771  
       2017-02-20 19:46:36 +08:00
    用 ubuntu 我都不敢更新
    keramist
        35
    keramist  
       2017-02-21 03:48:12 +08:00 via Android
    满足你一切要求 nas4free
    msg7086
        36
    msg7086  
    OP
       2017-02-21 03:50:39 +08:00
    @neoblackcap 系统包,我也没办法离线编译完扔上去啊。
    ericFork
        37
    ericFork  
       2017-02-21 06:16:21 +08:00
    Ubuntu 和 ZFS on Linux 在这种场景下都不够鲁棒……所以是双重风险
    okudayukiko0
        38
    okudayukiko0  
       2017-02-21 12:43:26 +08:00 via iPhone
    可能是开启了自动更新吧,目前 Linux 下的 ZFS 不够成熟,如要 ZFS 建议 FreeBSD 或 NetBSD 。
    madper
        39
    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
        40
    jarlyyn  
       2017-02-21 23:15:53 +08:00
    @madper

    不不不

    不管 ubuntu 还是 zfs ,都是艺高人胆打,何况一起用……
    msg7086
        41
    msg7086  
    OP
       2017-02-22 01:45:12 +08:00
    @madper 为毛我要编译?我没编译啊, apt 帮我编译的,我也不知道怎么回事……就看到 apt 日志里一排排的错误信息。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3048 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 10:47 · PVG 18:47 · LAX 02:47 · JFK 05:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.