Как изменить размер корневого раздела ext во время выполнения?
Как я могу увеличить размер корневого раздела системы во время выполнения?
У меня есть раздел, который не выделен после корневого раздела (который также является ext4), как я могу добавить это нераспределенное пространство в пространство, выделенное для корневого раздела, без необходимости выключать сервер?
10 ответов
GUI (Ubuntu 14.04 и более поздние версии ): GParted v0.17 и более поздние предоставляют хороший графический интерфейс для этого. (Старые версии откажутся изменять размер смонтированного раздела).
Командная строка (любая версия Ubuntu): Есть три шага к этому.
Шаг 1. Сначала необходимо изменить размер раздела. Если вы используете LVM, это легко, и вы, вероятно, знаете, как действовать. Если вы используете классические разделы, это немного сложнее и может потребовать перезагрузки (хотя вам никогда не придется загружать другую систему или live CD).
Вот как я это делаю: использовать fdisk
сначала удалить раздел (идея заключается в том, что данные на диске будут сохранены), а затем аккуратно воссоздать его с большим размером в той же позиции.
Пример:
$ sudo fdisk /dev/sda
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 9437183 4717568 83 Linux
Command (m for help): d
Selected partition 1
Command (m for help): p
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sda1 2048 10485759 5241856 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
Опять же, важно, чтобы новый раздел начинался с того же блока, что и старый. Идентификатор также должен совпадать (83 для систем Linux). Будьте готовы потерять все ваши данные при малейшей опечатке.
Чтобы быть в безопасности, вы также можете восстановить флаг загрузки (который согласно Википедии все еще требуется на некоторых компьютерах), нажав a
,
Смотрите в разделе комментариев, что делать, если ваш раздел подкачки мешает.
К настоящему времени должно стать очевидным, почему люди рекомендуют использовать live CD.;-)
Шаг 2. Как fdisk
Полезно напомнить вам, вы должны перезагрузить таблицу разделов, прежде чем продолжить. Самый безопасный способ - просто перезагрузиться; но вы также можете использовать partprobe
или же kpartx
(больше информации).
Шаг 3. После изменения размера раздела и перезагрузки таблицы разделов достаточно просто запустить resize2fs
в файловой системе, и вы можете сделать это, даже если он смонтирован как корневой раздел.
Пример:
$ sudo resize2fs /dev/sda1
Более простое решение - использовать growpart <device> <partition>
:
growpart /dev/xvda 1 # Grows the partition; note the space
resize2fs /dev/xvda1 # Grows the filesystem
Как всегда, сделайте резервную копию таблицы разделов (sfdisk -d /dev/xvda > partition_bak.dmp
) так, на всякий случай.
Возможно изменение размера файловой системы ext4 в режиме онлайн, даже если это ваш корневой раздел. Использовать resize2fs
команда.
sudo resize2fs /dev/sda1
РЕДАКТИРОВАТЬ: он-лайн сокращения не допускается:
root@brunojcm-htpc:/home# resize2fs /dev/sda5 2654693
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported
Да, вы можете уменьшить / переместить / увеличить корневой раздел в сети без перезагрузок (ни livecd, ни usbkey): обратитесь к этому ответу. Это очень хорошо написано и легко следовать, хотя довольно долго и немного рискованно. Так что, если вы хотите только увеличить раздел ext4, вы можете придерживаться обычного рабочего resize2fs
решения.
Общее решение, которое я написал, будет работать, например, с любым типом выделенного решения или решения VPS.
TLDR; это решение подразумевает pivot_root
в tmpfs
так что вы можете umount
безопасно ваш корневой раздел жить и возиться с ним. После этого вы pivot_root
вернуться на ваш новый корневой раздел.
Это позволяет практически любые манипуляции с корневой файловой системой (переместить ее, изменить файловую систему, изменить ее физическое устройство...).
В процессе перезагрузка не требуется, и это позволяет обойти ограничение resize2fs
не в состоянии сжаться ext4
перегородки.
Я лично использовал это, и он очень хорошо работает и в системе Debian, поэтому он должен работать и в Ubuntu. Я очень удивлен, что не вижу такого углубленного решения, более тесно связанного со многими вопросами на веб-сайтах stackexchange, которые занимаются той же проблемой.
Примечание. Конечно, если вы хотите увеличить раздел, просто resize2fs
будет достаточно, как указано в многочисленных местах и в других ответах здесь.
Вы также можете просто использовать GParted - если размер раздела, который вы изменяете, не тот, с которого вы загрузились, - в противном случае я полагаю, что вариант с живым компакт-диском для новичков несколько проще.
GParted в основном делает все шаги - только на основе графического интерфейса пользователя.
Я хотел бы сделать продолжение ответа @Søren Løvborg: расширение раздела с помощью раздела подкачки.
Сначала разметка диска после его расширения:
$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
63s 2047s 1985s Free Space
1 2048s 10485759s 10483712s primary ext4 boot
10485760s 10487805s 2046s Free Space
2 10487806s 12580863s 2093058s extended
5 10487808s 12580863s 2093056s logical linux-swap(v1)
12580864s 14335999s 1755136s Free Space
Таким образом, sda1 необходимо расширить с помощью свободного места в конце диска, но раздел подкачки находится между ними. Вот как вы можете это сделать:
Сначала нам нужно отключить своп. Проверьте, сколько он используется, и если вы можете отключить его.
$ free -h
total used free shared buff/cache available
Mem: 992M 52M 464M 3.2M 475M 784M
Swap: 1.0G 0B 1.0G
своп здесь не используется, поэтому мы можем его отключить
$sudo swapoff /dev/sda5
Теперь мы изменим таблицу разделов:
$sudo fdisk /dev/sda
(примечание: если у вас первый раздел начинается с сектора 63 вместо 2048, вам нужно добавить опцию -c=dos
)
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sda: 6.9 GiB, 7340032000 bytes, 14336000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9e11c6df
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 10485759 10483712 5G 83 Linux
/dev/sda2 10487806 12580863 2093058 1022M 5 Extended
/dev/sda5 10487808 12580863 2093056 1022M 82 Linux swap / Solaris
Command (m for help): d
Partition number (1,2,5, default 5): 2
Partition 2 has been deleted.
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 12242941
Created a new partition 1 of type 'Linux' and of size 5.9 GiB.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):
Created a new partition 2 of type 'Linux' and of size 1022 MiB.
Command (m for help): a
Partition number (1,2, default 2): 1
The bootable flag on partition 1 is enabled now.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
Примечание: размер sda1 - это общее количество секторов минус размер сектора вашего раздела подкачки: 14335999-2093058=12242941
Как упоминает fdisk: ядро все еще использует старую таблицу разделов, поэтому нам нужно перезагрузить ее.
$partprobe
Теперь нам нужно запустить resize2fs на sda1 (не забудьте об этом!)
$resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.
Теперь все еще не закончено. Как вы, наверное, заметили, sda2 разделен как тип Linux (Ext4). По какой-то причине в fdisk нет способа выбрать тип. Таким образом, мы должны чередовать это с помощью cfdisk
$ sudo cfdisk
Выберите sda2 и измените тип на 82 Linux swap / Solaris
и убедитесь, что вы пишете это (введите да, чтобы подтвердить)
Теперь мы можем повторно активировать своп
$mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0
И, наконец, включите его:
$swapon /dev/sda2
Единственное, что нам нужно сделать, это обновить fstab для автоматического монтирования раздела подкачки при загрузке
$sudo nano /etc/fstab
И измените UUID раздела подкачки на вывод выше:
# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0
Теперь все хорошо и вы можете перезагрузиться без проблем.
Только что завершил изменение размера корневого раздела ext4 в работающей системе, пока монтировался root.
[root@habib i686]# resize2fs /dev/vg_habib/lv_root
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/vg_habib/lv_root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 10
Performing an on-line resize of /dev/vg_habib/lv_root to 38427648 (4k) blocks.
The filesystem on /dev/vg_habib/lv_root is now 38427648 blocks long.
[root@habib i686]#
Я просто сделал это успешно без umount
, pivot_root
или временное удаление основного раздела, используя parted 3.2 в Ubuntu 16.04, ядро 4.4.0. Чтобы быть осторожным, я делал все с виртуальной консоли с отключенной сетью и на всякий случай заранее сделал снимок, но снимок не понадобился, поэтому я мог бы сделать это с помощью SSH и без изменения уровней выполнения.
Определить размер раздела: parted /dev/sda1 print | egrep "Disk.*GB"
При желании можно переключиться в многопользовательский режим без подключения к сети (это необходимо сделать из консоли, а не по SSH):
runlevel # remember the original runlevel
init 2
При желании сделайте снимок виртуальной машины, чтобы быть осторожным.
Изменить размер раздела:
parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q
Изменить размер файловой системы: resize2fs /dev/sda1
Если что-то пойдет не так, вы можете восстановить свой снимок здесь. Если все прошло нормально, вернитесь к нормальному уровню выполнения (получен выше) - обычно 5: init 5
, Может быть, лучше сделать полную перезагрузку на этом этапе, чтобы убедиться, что все возвращается правильно (у меня возникла проблема с date/ntp позже).
Следуй этим шагам.
- открыть терминал как суперпользователь
su
- бежать
parted
- тип
p
чтобы увидеть доступные разделы - определите номер корневого раздела (например, "sda 3" означает номер 3) и удалите соседний раздел, используя
rm PARTITION NUMBER
создать свободное пространство. - Теперь увеличьте размер корня, набрав
resizepart ROOT NUMBER
и перезагрузите систему при необходимости - выход
parted
набравexit
и в терминальном типеpartprobe
и нажмите Enter (это можно сделать даже после перезагрузки) - наконец беги
resize2fs /dev/sda PARTITION NUMBER
и наслаждайтесь просторным корневым разделом.
Как указано ранее:
возможно расширение live от корневой системы (нет проблем, так как загрузочный раздел не должен быть перемещен)
сжатие живого корневого раздела необходимо выполнить с внешнего загрузочного устройства (загрузка с работающей системы cd/usb-stick), как если бы произошла какая-либо ошибка, несоответствие... что угодно... ваша система зависает, ее необходимо перезагрузить и в конечном итоге она не будет умеет загружаться правильно.
Любое "но я сделал это, и это работает" - чистая удача.