Как изменить размер корневого раздела 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 позже).

Следуй этим шагам.

  1. открыть терминал как суперпользователь su
  2. бежать parted
  3. тип p чтобы увидеть доступные разделы
  4. определите номер корневого раздела (например, "sda 3" означает номер 3) и удалите соседний раздел, используя rm PARTITION NUMBERсоздать свободное пространство.
  5. Теперь увеличьте размер корня, набрав resizepart ROOT NUMBER и перезагрузите систему при необходимости
  6. выход parted набрав exit и в терминальном типе partprobe и нажмите Enter (это можно сделать даже после перезагрузки)
  7. наконец беги resize2fs /dev/sda PARTITION NUMBER и наслаждайтесь просторным корневым разделом.

Как указано ранее:

  • возможно расширение live от корневой системы (нет проблем, так как загрузочный раздел не должен быть перемещен)

  • сжатие живого корневого раздела необходимо выполнить с внешнего загрузочного устройства (загрузка с работающей системы cd/usb-stick), как если бы произошла какая-либо ошибка, несоответствие... что угодно... ваша система зависает, ее необходимо перезагрузить и в конечном итоге она не будет умеет загружаться правильно.

Любое "но я сделал это, и это работает" - чистая удача.

Другие вопросы по тегам