Вы пытаетесь изменить размер файловой системы, которая была создана до того, как -O 64bit
опция стала стандартной. Возможно обновить вашу файловую систему ext до 64-битных адресов, что позволит ей охватывать значительно большие объемы (1024 ПиБ вместо 16 ТиБ).
Предполагая, что ваше целевое устройство называется /dev/mapper/target-device
, это то, что вам нужно сделать:
Предпосылки
- Этот размер тома должен поддерживаться RAID. Обычные ошибки диска будет причинить вред в противном случае.
- Тем не менее, RAID не является резервной копией . Вы должны хранить свои ценности в другом месте.
- Сначала измените размер и проверьте все окружающие тома (таблицы разделов, шифрование, lvm).
- После изменения аппаратной конфигурации RAID, linux может или не может немедленно подтвердить новый максимальный размер. Проверьте
$ cat /proc/partitions
и перезагрузите при необходимости.
Используйте последнее стабильное ядро и e2fsprogs
- Убедитесь (проверьте
uname -r
), что вы используете ядро, которое может правильно обрабатывать 64-битные файловые системы ext4 - вы хотите использовать 4.4.x
ядро или более позднюю версию (по умолчанию Ubuntu 16 и выше).
Приобретите e2fsprogs как минимум версии 1.43
Ubuntu 16.04
(2016-04-21) был выпущен с e2fsprogs 1.42.12
(2014-08-25)
e2fsprogs 1.43
(2016-05-17) является первым выпуском, способным обновить размер адреса extfs.
Ubuntu 18.04
(2018-04-26) поставляется с e2fsprogs 1.44.x
(хорошо!)
Если вы используете 16.04
и не можете перейти на более новую версию Ubuntu, вам нужно будет включить поддержку исходного пакета и установить более новую версию вручную:
$ resize2fs
# if this prints version 1.43 or above, continue to step 1
$ sudo apt update
$ sudo apt install git
$ sudo apt build-dep e2fsprogs
$ cd $(mktemp -d)
$ git clone -b v1.44.2 https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git e2fsprogs && cd e2fsprogs
$ ./configure
$ make
$ cd resize
$ ./resize2fs
# this should print 1.43 or higher
# if this prints any lower version, panic
# use `./resize2fs` instead of `resize2fs` for the rest of the steps
Изменение размера
Шаг 1: Правильно размонтировать файловую систему
$ sudo umount /dev/mapper/target-device
Шаг 2: Проверьте файловую систему на наличие ошибок
$ sudo e2fsck -fn /dev/mapper/target-device
Шаг 3: Включить 64-битную поддержку в файловой системе
Проконсультируйтесь man tune2fs
и man resize2fs
- вы можете изменить некоторые флаги файловой системы.
$ sudo resize2fs -b /dev/mapper/target-device
На типичном жестком диске RAID это занимает 4 минуты высокой нагрузки ввода-вывода и загрузки процессора.
Шаг 4: изменить размер файловой системы
$ sudo resize2fs -p /dev/mapper/target-device
Если вы не передаете размер в командной строке, resize2fs предполагает "увеличение до всего доступного пространства" - обычно это именно то, что вам нужно. -p
Флаг включен прогресс баре - но те , отображаются только после некоторых первоначальных шагов.
На типичном жестком диске RAID это занимает 4 минуты высокой нагрузки ввода-вывода и загрузки процессора.
Подтвердите еще раз
Проверьте файловую систему снова
$ sudo e2fsck -fn /dev/mapper/target-device
e2fsck более новых версий может предложить исправить временные метки или деревья экстентов, которые предыдущие версии плохо обрабатывали. Это не является признаком какой-либо серьезной проблемы, и вы можете решить ее сейчас или позже.
Если возникают ошибки, не паникуйте и не пытайтесь записать на том; проконсультируйтесь с кем-то, кто обладает обширными знаниями о файловой системе, поскольку дальнейшие операции могут привести к уничтожению данных!
Если ошибок нет, перемонтируйте устройство:
$ sudo mount /dev/mapper/target-device
Успех!
Для продолжения работы обновленной файловой системы вам не понадобится версия e2fsprogs, не относящаяся к Ubuntu, - ядро поддерживает их уже довольно давно. Нужно было только начать обновление.
Для справки есть похожее сообщение об ошибке, которое 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.