4 февраля 2010 в 19:43

Миграция с 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" (как оригинала к началу боевых действий) с некоторыми дополнениями. ;)

Критика, обсуждение, описание собственного опыта и прочее-прочее безусловно приветствуется…
Александр Русских @oldengremlin
карма
87,0
рейтинг 0,0
Самое читаемое Администрирование

Комментарии (43)

  • +1
    Уже где-то пол-года на ехт4, полет нормальный.)))
    • 0
      использую давно еще с ext4dev — все отлично, а главное fsck терабайтного раздела проходит за пару минут вместо 20-30 которые требовались на ext3…

      ps: еще отличная дока есть ext4.wiki.kernel.org/index.php/Ext4_Howto
  • +2
    Испокон веку использовал reiser вместо ext3 и был очень доволен. А во время прочтения статьи подумалось, что, может быть, имеет смысл попробовать более поддерживаемую ФС? Хотя бы до пришествия btrfs.
    Да, пожалуй попробую переселить свою коллекцию аниме на ext4 :)
    • +4
      Ага… Я тоже использовал reiserfs, да и продолжаю использовать там где он уже есть… Зачем что-то делать с сервером у которого аптайм несколько лет. reiserfs реально нравится. Был даже случай когда пришлось полностью перестраивать файловую систему из-за краха — отлично, всё прошло на ура. А вот с Ext3 имелся печальный опыт. После очередной перезагрузки просто не поднялась и всё. Сыпала какие-то ошибки… Давно это правда было, лет пять назад… Подробностей уже и не вспомню толком.
      А вот на купленный недавно нетбук поставил себе любимый с '97-го года Debian и в качестве файловой систему выбрал Ext3, ну а потом логично прошла миграция на Ext4 :) Тьфу-тьфу-тьфу, пока полёт нормальный :)
    • 0
      У меня на одном из хостов опыт с рейзером исключительно негативный. За 5 лет ловил проблемы с xattr после многих апдейтов, несколько кернел паников, и несколько вынужденных rebuild-tree. Везде теперь держу ext3
      • +1
        Да, читал и о подобных вещах в интернетах. У меня за те же пять лет рейзер жил как на домике, так и на корне домашних машин, на корнях физических серверов, на корнях xen-виртуалок, на корнях kvm-виртуалок, нигде проблем не было. Видимо, как повезёт.
  • 0
    а я пару месяцев назад мигрировал и у меня фс крякнулась, такое я фейло :D
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Вопрос такой: а стоит ли переходить с Ext3 на Ext4? Скоро уже Btrfs будет, и Ext3 в Btrfs можно конвертировать in-place, а вот можно ли конвертировать Ext4 в Btrfs — это ещё вопрос.
    • 0
      Они вроде как работают над тем что бы можно было из Ext4 в Btrfs конвертить, так что это вопрос времени.
    • 0
      А у btrfs формат уже устаканился? Или известна хотя бы примерная дата?
  • 0
    Стремное занятие, особенно для серверов. Да и судя по бенчмаркам, прирост производительности ничтожный (в среднем менее 5%). А если учесть, что основные операции сервера — это чтение/запись в базу данных (то есть практически в один файл), то думаю, никакой выгоды от ext4 здесь не будет. Обновлю файловую систему вместе с ОС и машиной.
    • +1
      сервер серверу рознь, некоторые серверы рождены для того чтобы раздавать сотни тысяч миллионов файлов :)

      p.s. я на всех новых серверах раздел с данными форматирую в ext4, OS CentOS 5.4, старые серверы трогать пока не рискую
  • 0
    А в ext4 уже есть нормальная поддержка квот? Пару раз пробовали ставить на новый сервер голый linux с разделами ext4 — после включения квот при нагрузочном тестировании вылетают ошибки ядра, система падает. С ext3 на том же сервере проблем нет…
  • +4
    После подобного перехода я начал жизнь с чистого листа (бекапов не было) :)
  • 0
    больше всего жду дефрагментатор работающий из каробки для ext4 в Ubuntu 10.04
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        угу пару дней назад читал как раз где то статью, там говорилось о том, что есть специальная утилита e4defrag
        www.ibm.com/developerworks/ru/library/l-ext4/index.html
        • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    > Сделайте резервную копию вашей системы перед тем как продолжить.

    с этого можно было бы начать и тут же закончить ;-)
  • +1
    >Попытка смонтировать Ext4 без конвертации.
    >… изменения типа файловой системы в /etc/fstab и перегрузить систему…

    чаво? какая перезагрузка системы, дорогой? используй mount -a
  • 0
    Да, месяц назад конвертировал на нетбуке корень вместе с boot… Перестало загружаться.
    В итоге пришлось с Live-USB GRUB2 ставить, но провозился часа 3-4 пока все заработало
    • 0
      use grub2, luke! С ext4 первый grub не умеет грузиться.
      • 0
        А, ну собственно так и случилось, только чуть не в том порядке.
      • 0
        А у меня каким-то чудом грузился. Причём, я-то думал, что стоит grub2, а как стал разбираться, почему при загрузке граб подвисает на 30 секунд, оказалось, что на ext4 (сконвертированной) стоит grub 1.
        • 0
          Как я понял, последние версии первого граба тоже умеют ext4, если в menu.lst указать rootfstype=ext4 или типа того, но у меня не получилось
          • 0
            Да, такая опция была.
  • +2
    Тут подсказывают, что
    find /home -xdev -type f -print0 | xargs -0 chattr +e  

    правильнее юзать как:
    find /home -xdev -type f -exec chattr +e {} \;

    а
    find /home -xdev -type d -print0 | xargs -0 chattr +e 

    как
    find /home -xdev -type d -exec  chattr +e {} \;
    • +1
      Ну если есть охота постоянно дёргать вызов одной и той-же команды (chattr) для каждого найденного имени — то огонь(!), можно и так.

      Выдержка из man xargs:
      xargs - build and execute command lines from standard input

      Т.е. в случае
      find /home -xdev -type f -print0 | xargs -0 chattr +e  

      chattr будет вызываться всего один(!) раз и ему будет передан список имён файлов в качестве аргументов. В случае
      find /home -xdev -type f -exec chattr +e {} \;

      chattr будет вызван для каждого файла в отдельности.

      Тут уже, как говорится, на вкус и цвет все фломастеры разные, каждый выберет сам, что ему удобнее. ;)
      • 0
        Всё равно можно проще. find(1):
        -exec command {} +
      • 0
        Про то, что chattr запустится один раз, вы заблуждаетесь. Смотрите опции -n и -s к команде xargs.
        Кстати, а чем не угодил chattr -R +e?
        • 0
          Было бы забавно понаблюдать за установкой атрибута в /dev, /proc и т.д. ;)
          Именно этим, наверное, и не угодил…
          • 0
            Эммм, во-первых, если уж говорить о разделе /home, то /dev, /proc, /sys там смонтированы только в экстремальных ситуациях.
            Ну, и предлагаемый Вами find -type f там вполне находит даже character devices.
            у меня рекурсивный chattr ругается только на симлинки.
            • 0
              Если не только говорить, но ещё и читать то, что написано то можно заметить, что find для /home это был просто пример, а дальше пишется следующее, по тексту:
              _____________

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

              Уже было сказано — на вкус и цвет все фломастеры разные. ;)
              Или это цель в самореализации — придраться хоть к чему-то? :(
              • –1
                Я не мог не придраться к этой статье — она крайне своевременна. У меня переезд на ext4 наживую произошел где-то в мае прошлого года, если не ошибаюсь. Да и то я долго сомневался.
                Прошло 9 месяцев. Какова ЦА Вашей статьи?
                Те, кому интересно, давно воспользовались гуглом.
                Те, кто боится консоли, все равно ничего не сделают.
                Те, кто мнит себя офигенными чуваками из-за того, что полгода назад поставили линукс, переломают себе (или, что еще хуже, кому-нибудь другому) что-нибудь в системе, если не в этот раз, то в следующий.
                • 0
                  > Я не мог не придраться к этой статье — она крайне своевременна.

                  Иронию воспринял нормально. Спасибо.
                  Что-ж, наверное не правы те кто поблагодарил за «своевременность».
                  • 0
                    Ну так, это, скорее всего, представители третьей группы :)
  • 0
    уже пора на btrfs переходить :)
  • 0
    Я когда-то с дуру обновил себе Ubuntu и проапгрейдил etx3 на ext4, а оказалось что моя WindowsXP установленная на другой партиции перестала понимать что это за нафиг такая ext4, та же ситуация если у вас установлена Хакинтош OSX, средств чтения (и уж подавно записи) на ext4 из под альтернативных Осей не существовало на тот момент. Кстати а какая ситуация с этим сейчас?
    • 0
      сейчас с этим тоже не очень хорошо, но работы ведутся :)
    • 0
      на fs-driver.org и слова о ext4 :(
  • 0
    когда ext4 включили в ядро, я даже собрал livecd чтобы с него все партиции переконвертить :) получилось, до сих пор на этих же партициях система стоит
  • 0
    Извиняюсь, а как в Ubuntu 10.10 в одномользовательский монопольный режим попасть? У меня меню GRUB не появляется, следовательно не могу воспользоваться
    В меню загрузчика при помощи клавиш со стрелками выберите инсталляцию, которую хотите редактировать, и наберите [A], чтобы попасть в режим append.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.