Баг в Linux 5.1 приводил к потере данных

Модератор: LinuxNEWS
Аватара пользователя

Автор темы
rogoznik
Сообщения: 10044
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Баг в Linux 5.1 приводил к потере данных

#1

06 июн 2019, 20:50

Пару недель назад в версии ядра Linux 5.1 обнаружили баг, который приводил к потере данных на SSD. Недавно разработчики выпустили корректирующий патч Linux 5.1.5, который залатал «брешь».

Что за баг

В начале года разработчики внесли ряд изменений в ядро Linux 5.1. После этого на системах с SSD от компании Samsung, которые используют шифрование dm-crypt/LUKS c device-mapper/LVM, начала проявляться ошибка, приводящая к потере данных. Но о проблеме стало известно только в середине мая — тогда же её начали активно обсуждать на тематических форумах.

Известно как минимум о двух людях, столкнувшихся с багом, — это участник рассылки LKML Майкл Ласс (Michael Laß), который впервые сообщил о проблеме, и пользователь ArchLinux.

Майкл запустил команду 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 (которые используются для поиска томов) оказались нечитаемыми, что не позволило расшифровать зашифрованные данные.

В чем причина

Проблема заключалась в подсистеме device mapper (DM), задача которой — создавать виртуальные блочные устройства. Она как раз используется для реализации менеджера логических томов LVM, программного RAID и системы шифрования дисков dm-crypt.
«Команда fstrim помечала слишком большое количество блоков за раз без учета предела max_io_len_target_boundary. В результате освобождались те сегменты памяти, которые до сих пор используются, — комментирует Сергей Белкин, начальник отдела развития 1cloud.ru. — Поскольку ошибка была связана с device mapper, в теории потеря данных могла произойти на любой файловой системе».
Патч

Патч для бага разработчики ядра выпустили в конце мая. Были изменены всего четыре строчки в файле 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.

Исключить ситуацию с потерей данных можно и не устанавливая патч. Достаточно отключить сервис fstrim.service/timer с помощью команд:

Код: Выделить всё

systemctl disable fstrim.timer
systemctl stop fstrim.timer
Еще вариант — переименовать исполняемый файл fstrim или убрать флаг discard при монтировании fstab. Еще можно выключить режим allow-discards в LUKS через dmsetup. Однако все эти методы не более чем временные и не решают сути проблемы.

Источник: https://habr.com/ru/company/1cloud/blog/454978/
ИзображениеИзображение

Аватара пользователя

Dja
Сообщения: 6875
Зарегистрирован: 27 авг 2016, 20:03
Решено: 30
Откуда: Voskresensk
Благодарил (а): 1312 раз
Поблагодарили: 724 раза
Контактная информация:

Баг в Linux 5.1 приводил к потере данных

#2

14 июн 2019, 12:38

только наоборот. Сначала стоп, а потом выключить

Аватара пользователя

slant
Сообщения: 4506
Зарегистрирован: 21 июн 2017, 18:09
Решено: 99
Благодарил (а): 51 раз
Поблагодарили: 1993 раза
Контактная информация:

Баг в Linux 5.1 приводил к потере данных

#3

14 июн 2019, 16:18

Dja писал(а):
14 июн 2019, 12:38
только наоборот. Сначала стоп, а потом выключить
На самом деле совершенно не имеет значения в каком порядке. disable - всего лишь отключает автозапуск сервиса. Т.е. даже "отключенный" сервис можно запустить вручную командой start.

Аватара пользователя

Dja
Сообщения: 6875
Зарегистрирован: 27 авг 2016, 20:03
Решено: 30
Откуда: Voskresensk
Благодарил (а): 1312 раз
Поблагодарили: 724 раза
Контактная информация:

Баг в Linux 5.1 приводил к потере данных

#4

15 июн 2019, 14:07

slant, Если нет линка как он запустится? Он ругнется, что нет юнита

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Баг в Linux 5.1 приводил к потере данных

#5

15 июн 2019, 14:25

Dja, там симлинк делается именно в директории, куда смотрят таргеты при автозапуске.

Т.е. другими словами, не каждый юнит который ты ставишь в автозапуск должен быть запущен вотпрямщас, и не каждый из действующих юнитов должен быть в автозапуске.
Изображение
   
Изображение

Аватара пользователя

slant
Сообщения: 4506
Зарегистрирован: 21 июн 2017, 18:09
Решено: 99
Благодарил (а): 51 раз
Поблагодарили: 1993 раза
Контактная информация:

Баг в Linux 5.1 приводил к потере данных

#6

15 июн 2019, 18:51

Dja писал(а):
15 июн 2019, 14:07
slant, Если нет линка как он запустится? Он ругнется, что нет юнита
Линк отвечает как раз за автозапуск. А вот сам юнит от отсутствия линка никуда не девается, и для старта через команду start вполне доступен...

Аватара пользователя

Dja
Сообщения: 6875
Зарегистрирован: 27 авг 2016, 20:03
Решено: 30
Откуда: Voskresensk
Благодарил (а): 1312 раз
Поблагодарили: 724 раза
Контактная информация:

Баг в Linux 5.1 приводил к потере данных

#7

20 июн 2019, 13:36


Ответить

Вернуться в «Другие новости»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя