Как изменить размер корневого раздела ext во время выполнения?


236

Как я могу увеличить размер корневого раздела системы во время выполнения?

У меня есть раздел, который не выделен после корневого раздела (который также является ext4), как я могу добавить это нераспределенное пространство в пространство, выделенное для корневого раздела, без необходимости выключать сервер?


3
Я ненавижу звучать как грязь, но это влечет за собой немалый риск? Почему это должно произойти? Является ли время работы основным ограничением?
Облако

Вы не можете изменить размер раздела влево, потому что это будет движение.
Заз

5
Увеличить размер разделов ext4 онлайн очень просто. Трудная часть будет уменьшаться (ваш заголовок о «изменении размера»). Для людей, интересующихся ЛЮБОЙ манипуляцией с корневым разделом (перемещение, сжатие, изменение файловой системы, устройства) во время выполнения, следует проконсультироваться с моим ответом: askubuntu.com/a/728141/21888
vaab

Используйте growpart
guettli

Ответы:


215

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

16
Это отлично сработало для меня. Однако я дополнительно удостоверился, что флаг загрузки сохранен в исходном состоянии.
Август Клинг

4
@ jbo5112: как fdiskговорится, partprobeили kpartxможет работать вместо перезагрузки; см. также этот вопрос . Даже если вы перезагружаетесь, решение все равно предпочтительнее использования live CD, когда речь идет о времени простоя, когда простая перезагрузка может быть менее 10 с для виртуальной машины. Это также быстрее во времени оператора, поэтому я обычно использую этот подход сам. :)
Сорен Левборг

1
@Raymond: Если давление памяти позволяет (см. free -h), Отключите функцию swap ( swapoff /dev/sda2), измените таблицу разделов (включая удаление и воссоздание раздела подкачки) и либо 1) перезагрузите компьютер, либо 2) перезагрузите таблицу разделов и swaponснова. (Если памяти слишком мало, чтобы временно отключить подкачку, вы все равно можете создать и включить новый раздел подкачки ( /dev/sda3), затем поменять местами sda2; но тогда вам придется обновить /etc/fstabимя нового устройства подкачки.)
Сёрен Лёвборг,

1
Если вы используете vmware и расширили размер диска, вам придется запустить sudo lshw -C disk для повторного сканирования файловых систем, чтобы vm распознал больший диск. Затем следуйте инструкциям выше.
Парень

2
Как насчет сокращения?
Аарон Франке

113

Возможно изменение размера файловой системы 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

55
From man resize2fs: The resize2fs program does not manipulate the size of partitions. If you wish to enlarge a filesystem, you must make sure you can expand the size of the underlying partition first. This can be done using fdisk(8) by deleting the partition and recreating it with a larger size or using lvextend(8),if you're using the logical volume manager lvm(8).Этот вопрос касается изменения размера раздела , а не файловой системы . Различие тонкое, но очень важное.
Элия ​​Каган

8
Вы можете использовать fdisk, чтобы удалить корневой раздел, а затем воссоздать его в том же начальном блоке. fdisk запишет изменение, но оно не вступит в силу до перезагрузки. после перезагрузки вы можете использовать программу resize2fs для отправки диска для заполнения раздела.
Джеймс Беквар,

3
Я только что изменил размер корневого раздела ext4 онлайн. Поэтому я могу подтвердить, что это возможно. Но вместо передачи / dev / sda * в качестве параметра resize2fs вам нужно передать имя логического тома.
CDR

10
Я нахожу первый абзац man-страницы resize2fs наиболее интересным для первоначального вопроса:The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the filesystem is mounted, it can be used to expand the size of the mounted filesystem, assuming the kernel supports on-line resizing. (As of this writing, the Linux 2.6 kernel supports on-line resize for filesystems mounted using ext3 and ext4.).
mo '23

5
Пожалуйста, не связывайтесь с тем, fdiskкогда growpartсделаете это очень легко для вас.
STRML

54

Более простое решение - используйте 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) на всякий случай.


Как насчет сокращения?
Аарон Франке

Хотел использовать этот метод, но получил sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(используя двойную загрузку с Windows)
monkut

Сокращение невозможно сделать в режиме онлайн. Я рекомендую использовать gpartedдля этого.
STRML

4
growpart является частью cloud-utils. Если вы не установили, вы можете установить сapt-get install cloud-utils
klor

1
@monkut Поздно на вечеринку, но ваш диск , скорее всего /dev/nvme0n1. p5 это раздел 5 на этом диске. Сравните с традиционными разделами дисков BSD, они используют аналогичную схему нумерации.
За Лундберг

12

Да, вы можете уменьшить / переместить / увеличить корневой раздел в сети без перезагрузок (ни livecd, ни usbkey): обратитесь к этому ответу . Это очень хорошо написано и легко следовать, хотя довольно долго и немного рискованно. Так что, если вы хотите увеличить только раздел ext4, вы можете придерживаться обычных рабочих resize2fsрешений.

Общее решение, которое я написал, будет работать, например, с любым типом выделенного решения или решения VPS.

TLDR; это решение подразумевает , pivot_rootчтобы tmpfsтаким образом вы можете umountбезопасно корневой раздел жить и возиться с ним. После этого вы pivot_rootвернетесь к своему новому корневому разделу.

Это позволяет практически любые манипуляции с корневой файловой системой (переместить ее, изменить файловую систему, изменить ее физическое устройство ...).

Перезагрузка не требуется в процессе, и это позволяет обойти ограничение на resize2fs не будучи в состоянии сжиматься ext4 разделов.

Я лично использовал это, и он очень хорошо работает и в системе Debian, поэтому он должен работать и в Ubuntu. Я очень удивлен, что не вижу такого углубленного решения, более тесно связанного со многими вопросами на веб-сайтах stackexchange, которые занимаются той же проблемой.

Примечание: конечно, если вы хотите увеличить свой раздел, достаточно resize2fsбудет простого , как указано во многих местах и ​​в других ответах здесь.


4
Я думаю, что для большинства людей, как только вы остановите все программы и службы, обращающиеся к корневому разделу, вы могли бы перезагрузить компьютер. Для сжатия / перемещения это может быть все же быстрее, чем при использовании живого CD, но для роста (безусловно, самая распространенная задача и то, о чем спрашивал OP), есть способы, которые не предполагают временное отключение большей части системы. ,
Сёрен Лёвборг

2
@ SørenLøvborg: Вы можете перезапустить основные службы, которые требуют непрерывного производства, выполняя полную процедуру. Существует множество конфигураций, в которых вы не можете поместить LiveCD (экземпляры VPS, выделенные серверы ...) или обстоятельства, при которых вы хотите избежать перезагрузок по определенным причинам. В заголовке исходного вопроса упоминается «изменение размера», что привлекает людей, ищущих сокращающиеся разделы в Интернете. ** Ни одно другое решение не позволяет сократить ext4 онлайн. ** Это решение рискованно, сложно, но наиболее эффективно из всех, и оно устраняет недостатки других.
Вааб

1
Пожалуйста, не публикуйте ответы в зависимости от внешних ссылок. Поместите соответствующую часть в свой ответ или опубликуйте ссылку в качестве комментария к вопросу. См. Как ответить для деталей.
Мелебиус

10

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

GParted в основном делает все шаги - только на основе графического интерфейса пользователя.


Я загрузил свою систему с Ubuntu 12.04 Live CD и изменил размер раздела ext4 с помощью GParted. Работал хорошо для меня. Во всяком случае, перед этой операцией я сделал резервную копию всех моих важных данных.
StandDuPp

я думаю, gparted нуждается в размонтированном разделе. но я могу ошибаться
Ник

Очевидно, вопрос заключается в том, с какого раздела они загружаются, а для загрузки live CD требуется перезагрузка компьютера. -1
wjandrea

5

Только что завершил изменение размера корневого раздела 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]# 

5

Я хотел бы сделать продолжение ответа @ 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и убедитесь, что вы пишете его (введите yes для подтверждения)

Теперь мы можем повторно активировать своп

$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

Теперь все хорошо и вы можете перезагрузиться без проблем.


что касается изменения типа раздела подкачки, это можно сделать в fdisk buy, выбрав t затем 5 (раздел 5), затем 82 (тип Linux swap / Solaris)
Оз Эдри

Разве раздел 2 не должен быть расширен? (а затем в fdisk мы должны выбрать e вместо p) Кроме того, не следует ли запускать команды mkswap и swapon в / dev / sda5 вместо sda2?
Оз Эдри

1
Для типа раздела подкачки: я нашел в других инструкциях, что вы действительно можете выбрать тип в fdisk, но по какой-то причине он не работал в моей версии. В любом случае, он всегда будет работать с cfdisk
wouter205

1
Для раздела подкачки: вы можете использовать расширенный раздел, но затем вам нужно добавить два раздела: расширенный и логический (см. Мою первоначальную схему разделов). В моем примере я получаю 2 основных раздела: sda1 - ext4 - корневой раздел и sda2 - раздел подкачки. Таким образом, команды mkswap& swaponдолжны быть запущены на sda2. Я действительно ошибся в начале своего поста: swapoffнужно выполнить на sda5. Комментарии всегда приветствуются, это было сложно записать.
wouter205

1
Когда раздел подкачки зашифрован, нужно сначала остановить с помощью cryptdisk cryptdisks_stop, затем обновить / etc / crypttab вместо /etc/fstabи перезапустить cryptdisk с cryptdisks_start.
Дмитрий Чубаров

1

Я просто сделал это успешно без umount, pivot_rootили временное удаление основного раздела, используя расстался 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

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

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

0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.