几周前,在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的潜在攻击及其防范方法