Linux 5.1中的错误导致数据丢失-已经发布了更正补丁

几周前,在Linux 5.1内核版本中发现了一个错误,该错误导致SSD上的数据丢失。 最近,开发人员发布了 Linux 5.1.5补丁程序补丁,填补了“空白”。

我们讨论是什么原因。


/不溅水/ Glen Carrie

真是个错误


年初,开发人员对Linux 5.1内核进行了许多更改。 在那之后,在三星的固态硬盘上使用dm-crypt / LUKS加密和设备映射器/ LVM的系统上, 开始出现错误 ,从而导致数据丢失。 但是直到5月中旬才知道这个问题-那时他们开始在主题论坛上积极讨论它

至少已知两个知道此错误的人:LKML邮件列表成员 MichaelLaß(他是第一个报告该问题的人 )以及ArchLinux 用户

Michael 运行了fstrim命令,该命令告诉驱动器已装入的btrfs卷不再使用哪些数据块。 他收到以下系统消息后:

attempt to access beyond end of device sda1: rw=16387, want=252755893, limit=250067632 BTRFS warning (device dm-5): failed to trim 1 device(s), last error -5 BTRFS warning (device dm-5): csum failed root 257 ino 16634085 off 21504884736 csum 0xd47cc2a2 expected csum 0xcebd791b mirror 1 

此后,他发现btrfs卷已损坏,物理设备上的其余逻辑卷被破坏。

对于ArchLinux用户,该问题影响了LUKS的密码保护。 重新启动操作系统并运行fstrim后,LUKS标头(用于搜索卷)被证明是不可读的,这不允许解密的加密数据。

是什么原因


问题是设备映射器 (DM)子系统,其任务是创建虚拟块设备。 它仅用于实现LVM逻辑卷管理器,软件RAID和dm-crypt磁盘加密系统。

“ fstrim小组一次标记了太多块,而没有考虑max_io_len_target_boundary限制。 结果,释放了那些仍在使用的内存段,”开发部门1cloud.ru负责人Sergey Belkin 说道 “由于该错误与设备映射器有关,因此从理论上讲,任何文件系统上都可能发生数据丢失。”

贴片


内核开发人员于5月底发布了针对该错误的补丁程序。 在drivers / md / dm.c文件中仅更改了四行。 对即将到来的Linux 5.2内核也进行了相应的更改(添加和删除的行分别用“ +”和“-”标记):

 @@ -1467,7 +1467,7 @@ static unsigned get_num_write_zeroes_bios(struct dm_target *ti) static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti, unsigned num_bios) { - unsigned len = ci->sector_count; + unsigned len; @@ -1478,6 +1478,8 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target * if (!num_bios) return -EOPNOTSUPP; + len = min((sector_t)ci->sector_count, max_io_len_target_boundary(ci->sector, ti)); + __send_duplicate_bios(ci, ti, num_bios, &len); ci->sector += len; 

该补丁已被ArchLinux / Manjaro和Fedora发行开发商所应用。 Ubuntu发行版不影响该错误,因为它没有转换为Linux 5.1内核版本。


/ Flickr / 安迪·梅尔顿 / CC BY-SA

您无需安装补丁程序即可消除数据丢失的情况。 使用以下命令禁用fstrim.service / timer服务就足够了:

 systemctl disable fstrim.timer systemctl stop fstrim.timer 

另一个选择是重命名fstrim可执行文件或在挂载fstab时删除丢弃标志。 您也可以通过dmsetup在LUKS中关闭允许丢弃。 但是,所有这些方法仅是暂时的 ,不能解决问题的实质。

不是第一次


这不是Linux内核中的提交第一次导致内存损坏的情况。 在Linux版本4.19中发生了类似的故事-然后归咎于BLK-MQ I / O调度程序。 当使用默认设置的CONFIG_SCSI_MQ_DEFAULT = y选项构建内核时,就会出现该问题。 在某些情况下,卷数据损坏。

 sed: error while loading shared libraries: /lib/x86_64-linux-gnu/libattr.so.1: unexpected PLT reloc type 0x00000107 sed: error while loading shared libraries: /lib/x86_64-linux-gnu/libattr.so.1: unexpected PLT reloc type 0x00000107 

大多数情况下,问题是通过EXT4表现出来的,但从理论上讲,它可能会影响其他文件系统。

然后,其中一个内核维护者准备了一个小的解决方案来解决该问题。 但是,后来在Linux 4.20构建中发现了相同的错误。 终于有可能在2018年12月底通过新的全球更新来摆脱它。

我们的其他资源和来源:

文件备份:如何防止数据丢失
风险最小化:如何不丢失数据
备份和恢复:流和智能重复数据删除,快照和辅助存储
如何使用应用程序编程接口省钱
以1cloud.ru为例的云服务中的DevOps
1cloud云架构演进

我们的工作方式:1cloud摘要
对HTTPS的潜在攻击及其防范方法

Source: https://habr.com/ru/post/zh-CN454978/


All Articles