Поиск по этому блогу

пятница, 5 февраля 2010 г.

Миграция с Ext3 на Ext4

Эта статья для тех кто хочет перейти с с файловой системы Ext3 на Ext4, при этом сохранить все свои файлы и каталоги. Постараюсь описать наиболее общие ошибки возникающие в процессе миграции с Ext3 на Ext4, не устанавливая систему заново.

Основания для перехода.
Объяснение преимуществ и недостатком Ext4 выходит за рамки этой статьи. Если вы не страдаете от ограничений накладываемых Ext3 и не готовы рискнуть и просто так перейти на Ext4 то очень хорошо подумайте, а нужно ли это вам? ;) С другой стороны, перейдя на Ext4 вы можете почувствовать прирост производительности вашей файловой системы и увеличить её надёжность, при этом не понеся никаких накладных расходов ;)


Попытка смонтировать Ext4 без конвертации.
Интересным моментом является тот факт, что можно попробовать смонтировать файловую систему Ext3 как Ext4 не конвертируя её. Всё, что при этом нужно сделать это внести соответствующие изменения типа файловой системы в /etc/fstab и перегрузить систему. В этом случае можно будет в любое время вернуться к Ext3.

Это может быть хорошей проверкой, а готова ли ваша ОС поддерживать Ext4. Но следует помнить что в этом случае никакие расширения Ext4 включены не будут — это будет просто режим совместимости с Ext3.

Переход на Ext4.

Последние предупреждения.
Сделайте резервную копию вашей системы перед тем как продолжить. Может так случиться, что в процессе конвертации компьютер перезагрузится и будут утеряны все данные.

Файловые системы более не будут совместимы с Ext3 поэтому необходимо удостовериться что в вашем распоряжении есть инструментарий с поддержкой Ext4 для нормальной загрузки и восстановления файловой системы, на случай сбоя. Последние версии загрузчика, e2fsprogs, mount и ядро Linux'а включают в себя поддержку Ext4.

Инструментарий.
  • e2fsprogs 1.41.6
  • mount 2.16
  • linux-image 2.6.30
  • grub 1.96+20090808
Все эти пакеты доступны в unstable или experimental ветках репозитория Debian GNU/Linux. Более старые версии может быть и будут работать, за исключением e2fsprogs — это действительно минимальная версия для поддержки Ext4.

Преобразование не корневой файловой системы в Ext4.
До тех пор пока мы будем конвертировать отмонтированные Ext3 в Ext4 это будет действительно простыми процедурами. В примере мы преобразуем /dev/sdc1 смонтированную как /home.
umount /dev/sdc1
Следующим шагом проверим раздел на наличие ошибок чтобы убедиться в их отсутствии. Мы всё ещё в Ext3:
fsck.ext3 -pf /dev/sdc1

Включаем новые возможности Ext4 для раздела:
tune2fs -O extents,uninit_bg,dir_index /dev/sdc1

После этого запустим проверку файловой системы для Ext4:
fsck.ext4 -yfD /dev/sdc1
Будут найдены ошибки — это нормально. Можете запустить проверку второй раз чтобы убедиться что ошибки исчезли.

Параметр -D при запуске fsck.ext4 фактически включит поддержку dir_index, восстановив индекс каталогов. Запуск с этой опцией в любое время можно сделать и позже.

Теперь изменим файл /etc/fstab для включения Ext4 для сконвертированного раздела, заменив ext3 на ext4, остальные параметры могут быть другими в вашей системе:
/dev/sdc1 /home ext4 defaults 0 2
Монтируем раздел:
mount /home
Примите поздравления если всё прошло успешно ;) Если нет то не паникуйте. В конце концов вы последовали совету выше и сделали резервную копию, не так ли? ;) Проверьте на самом ли деле у вас установлен указанный выше инструментарий (или версии выше) из unstable или experimental веток Debian'а (хотя может быть вы используете другой дистрибутив?), в случае необходимости — обновите эти пакеты. Попробуйте ещё раз проделать описанные выше шаги.

/boot раздел.
Если /boot является отдельным разделом в Ext3 то просто пока оставим всё как есть. Хотя последние версии grub и поддерживают Ext4 они могут быть не включены в дистрибутив.

Можно просто смонтировать раздел в Ext4 без реального преобразования, указав новый тип файловой системы раздела в /etc/fstab:
/dev/sdb1 /boot ext4 defaults 0 1

Большинство новинок Ext4 не будет использоваться но это мало на что повлияет в процессе начальной загрузки ОС, не так ли? ;) И по существу это остаётся всё ещё Ext3 раздел, так что даже старая версия grub не должна иметь каких либо проблем с загрузкой.

Если у вас раздел /boot не создан отдельно то в самое время задуматься об его отделении в отдельную область. В противном случае будьте очень осторожны и не включать фичи которые не поддерживаются вашей версией grub'а или обновите grub до той версии которая будет поддерживать их.

Конвертирование корневой файловой системы в Ext4.
Конвертировать корневую файловую систему несколько сложнее, так как мы не можем просто так взять и отмонтировать её. Тем не менее это возможно сделать и без использования внешних загрузочных носителей. Но всю процедуру конвертации корневой файловой системы надо будет проделать в однопользовательском монопольном режиме.

Первым шагом надо изменим /etc/fstab и скажем использовать для корневого раздела ext4 вместо ext3. Это важно так как дальше файловая система будет работать в режиме только для чтения и невозможно будет внести никакие изменения, в результате невозможно будет смонтировать корневую файловую систему при следующей загрузке.

Предположим, что корневой раздел / это /dev/sda1, так что после внесения изменений файл /etc/fstab строка для этого раздела должна выглядеть так:
/dev/sda1 / ext4 defaults 0 1
Теперь перемонтируем файловую систему в режим только для чтения:
mount -o remount,ro /
Запустим проверку файловой системы:
fsck.ext3 -pf /dev/sda1
Тут нас расскажут, что надо перезагрузить систему. Что-ж, хорошая идея. Перезагрузимся в одномользовательский монопольный режим и снова перемонтируем корневую файловую систему в режиме только для чтения:
mount -o remount,ro /
Хорошо, что мы уже отредактировали /etc/fstab и ext3 раздел может быть смонтировал как ext4 без предварительной конвертации.

Далее чтобы включить ext4 на корневой файловой системе запускаем:
tune2fs -O extents,uninit_bg,dir_index /dev/sda1
И снова запускаем проверку для корневой файловой системы. Она найдёт и исправит ошибки, ну мы уже в курсе (читаем выше):
fsck.ext4 -yfD /dev/sda1
Если используется ядро 2.6.30 из репозитория Debian то будьте осторожны. Возможно потребуется обновить initrd чтобы добавить модуль ext4:
update_initramfs -u
Если модуль ext4 не присутствует в initrd то вы не сможете загрузиться после того как сконвертируете Ext3 в Ext4.

Теперь перегружаемся. Вот, мы имеем быструю Ext4 файловую систему, ощущаем некоторый прирост производительности, нам доступны все улучшения Ext4. Ну, почти все, читаем дальше…

Преобразование файлов в extents.
Может показаться, что конвертация завершена. И это почти правда, за исключением того, что все ранее созданные файла будут использовать bitmap отображение ext3 вместо extents в ext4.

Нет, конечно-же рано или поздно, при последующей модификации файлов их отображение тоже обновится в extents. Но к великому сожалению гораздо больше файлов читается чем записывается (часто ли обновляются скомпилированные приложения ОС?). В итоге файлы могут отображаться в bitmap ещё длительное время и вы не почувствуете силу и не раскроете весь потенциал ext4.

Утилита e4defrag, которая могла бы перестроить файлы в новое отображение, на данный момент находится в этапе разработки. К сожалению она не полная и не готова для использования на реальных данных (во всяком случае, как говорят, пока).

К счастью не всё потеряно. Можно проделать необходимые действия используя chattr которая поставляется с пакетом e2fsprogs. Она позволяет установить атрибут который заставит ядро переписать файл в новом отображении extents. Это можно сделать на смонтированной и работающей файловой системе. Фактически это, наверное, единственный способ это сделать ;)

Но заметьте, что функция эта в некотором роде пока ещё экспериментальная и не окончательно протестированная. Выполнение этой операции может быть опасным. syslog может просто заполниться сообщениями о вызванных ошибках. Желательно сначала всё это проверить на незначительном объёме данных.

Для проверки расширенных атрибутов файла (и директория) можно воспользоваться lsattr:
lsattr /home/user/foo/bar
Если не используется extents то увидим что-то наподобие этого:
------------------- /home/user/foo/bar
Пунктирная линия это просто отображение атрибутов файла. В данном случае файл не имеет атрибутов.

Теперь установит атрибут для extents:
chattr +e /home/user/foo/bar
Снова отобразим атрибуты файла:
-----------------e- /home/user/foo/bar
Обращаем внимание на «e» говорящую о том, что файл использует атрибут extents.

Проверяем логи на предмет страшных сообщений об ошибках в файловой системе. Если не находим то это значит, что звёзды сегодня благосклонны к нам и мы можем продолжить.

Для chattr можно передать несколько имён файлов. Но… Кто в наше время делает что-то вручную и по одному файлу. Используем магию:
find /home -xdev -type f -print0 | xargs -0 chattr +e
find /home -xdev -type d -print0 | xargs -0 chattr +e
Таким образом мы установим атрибут extents сначала для всех файлов, а затем для всех директорий раздела /home.

Эту же операцию можно проделать начиная с корневого раздела. Указание опции -xdev не позволит пытаться установить атрибут extents в тех местах где ему быть не надобно.

Возможно имеет смысл запустить эти команды в однопользовательском монопольном режиме чтобы свести к минимуму шансу, что какой-то другой процесс параллельно вмешается в работу.

Заключительное слово.

Автор этих строк не несёт ответственности если у вас что-то сломается в результате всех вышеописанных действий. Помните, что действуете вы на свой страх и риск ;) А в остальном успехов… ;)

Данная статья является достаточно вольным переводом
"Migrating a live system from ext3 to ext4 filesystem" (как оригинала к началу боевых действий) с некоторыми дополнениями. ;)