Как изменить размер раздела ext4 за пределы 16 ТБ?

19

При попытке изменить размер и старый раздел ext4, который был создан без 64-битного флага, resize2fs 1.42 завершится с ошибкой, если новый размер равен или превышает 16 TiB.

$ resize2fs -p /dev/mapper/target-device
resize2fs: New size too large to be expressed in 32 bits

Я не хочу копировать файлы на внешний носитель. Я тоже не хочу рисковать потерями данных. Как можно безопасно изменять размер?

    
задан anx 31.05.2016 в 06:39
источник

1 ответ

34

Почему это происходит:

Новые файловые системы обычно создаются с опцией -O 64bit Это позволяет им охватить значительно большие (1024 PiB вместо 16 TiB) томов. Старые файловые системы, которые были созданы до этого, стали по умолчанию, ранее не имели возможности обновить длину адреса до 64 бит.

Хотя он еще не был частью Ubuntu - Ubuntu 16.04 (2016-04-21) был выпущен с e2fsprogs Version 1.42.12 (2014-08-25), это было исправлено в последней версии e2fsprogs Version 1.43 (2016-05) -17).

Теперь я расскажу, как можно выполнить операцию, если ваше целевое устройство называется /dev/mapper/target-device

Предпосылки:

  1. Резервное копирование независимо от того, что вы не можете потерять. Всегда. Также обратите внимание: этот размер файловой системы будет поврежден обычными ошибками на диске, поэтому настройте RAID для гарантированной целостности.
  2. Операция должна выполняться в автономном режиме - это означает, что вы не можете сделать это в корне системы (серьезно, если ваш корень > 16TiB, обратитесь к специалисту по Linux)
  3. Убедитесь, что все окружающие тома будут полностью поддерживать полученный размер (содержится ли он в зашифрованном контейнере? любые таблицы разделов?)
  4. Продолжайте обновление размера файловой системы после и дважды проверяйте все, что содержится в ней, - после обновления системы рейдов Linux может или не может сразу определить новый максимальный размер. проверьте $ cat /proc/partitions .
  5. Убедитесь, что (проверьте uname -r ) вы запускаете ядро, которое может корректно обрабатывать 64-битные файловые системы ext4 - любое 4.4.x kernel (по умолчанию Ubuntu 16.04) или более поздняя версия будет прекрасным - старые ядра поддерживают 64-битный вариант, я просто не знаю, свободны ли они от ошибок.

Необходимое условие 6 - Приобретите e2fsprogs как минимум версии 1.43

$ resize2fs
# if this command - without any parameters - prints a version above 1.43, continue to step 1
$ sudo apt update
$ sudo apt install git
$ sudo apt build-dep e2fsprogs  # see https://askubuntu.com/q/158871/158442 to enable source package support
$ cd $(mktemp -d)
$ git clone -b v1.44.2 https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git e2fsprogs && cd e2fsprogs
$ ./configure
$ make
# note: make test is strange in 1.43, see the master changelog for a fix
$ cd resize
$ ./resize2fs
# if this prints 1.43 or higher, use './resize2fs' instead of 'resize2fs' for the rest of the steps
# if this prints any other version, panic

Шаг 1 - Правильно umount файловая система

$ sudo umount /dev/mapper/target-device

Шаг 2 - Проверьте файловую систему на наличие ошибок

$ sudo e2fsck -fn /dev/mapper/target-device

Шаг 3 - включить поддержку 64-битной файловой системы

$ man tune2fs
# read about the filesystem flags - you may wish to change some
$ man resize2fs
$ sudo resize2fs -b /dev/mapper/target-device
# on a typical HDD RAID, this takes 4 minutes of high IO & CPU load

Шаг 4 - изменение размера файловой системы

$ sudo resize2fs -p /dev/mapper/target-device
# resize2fs assumes "grow to all space available" if no size is passed on command line
# the -p flag will enable progress bars - after completing some initial steps
# on a typical HDD RAID, this takes 4 minutes of high IO & CPU load

Шаг 5 - снова проверьте файловую систему

$ sudo e2fsck -fn /dev/mapper/target-device

Шаг 6 - перезагрузка

Если возникают ошибки, не паникуйте; не пытайтесь писать на том; проконсультируйтесь с тем, кто действительно знает этот материал, прежде чем полностью разорвать ваши данные. Если ошибок не возникает, перемонтируйте устройство.

$ sudo mount /dev/mapper/target-device

Успех!

Вам не нужна никакая версия e2fsprogs, отличная от Ubuntu, для продолжения работы обновленной файловой системы - ядро поддерживает их уже довольно давно. Необходимо было только начать обновление.

Примечание: e2fsck из более новых версий может предложить исправить отметки времени или размеры деревьев, обработанные предыдущими версиями. Это не проблема, и вы можете исправить ее сейчас или позже.

Для справки есть аналогичное сообщение об ошибке mke2fs, которое будет напечатано, если его попросят создать огромное устройство с неприемлемыми параметрами:

$ mke2fs -O ^64bit /dev/huge
mke2fs: Size of device (0x123456789 blocks) is too big to be expressed in 32 bits using a blocksize of 4096.
    
ответ дан anx 31.05.2016 в 06:39
источник