Як я можу змінити розмір зовнішнього кореневого розділу під час виконання?


236

Як я можу збільшити розмір кореневого розділу системи під час виконання?

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


3
Я ненавиджу звучати як палиця в грязі, але це тягне за собою неабиякий ризик? Чому це потрібно статися? Чи є основним обмеженням тривалість тривалості роботи?
Хмара

Ви не можете змінити розмір розділу ліворуч, тому що це насправді буде ходом.
Заз

5
Збільшити розмір розділів ext4 в Інтернеті досить просто. Важка частина буде скорочуватися (ваш заголовок про "зміни розміру"). Для людей, які цікавляться будь-якими маніпуляціями на кореневому розділі (переміщення, зменшення, зміна файлової системи, пристрою) під час виконання, слід ознайомитися з моєю відповіддю: askubuntu.com/a/728141/21888
vaab

Використовуйте зростанняpart
guettli

Відповіді:


214

GUI (Ubuntu 14.04 і новіші версії) : GParted v0.17 і пізніші версії надають хороший графічний інтерфейс для цього. (Старіші версії відмовляться змінити розмір змонтованого розділу).

Командний рядок (будь-яка версія Ubuntu): Для цього є три кроки.

Крок 1. Спершу слід змінити розмір розділу. Якщо ви використовуєте LVM, це легко, і ви, мабуть, знаєте, як діяти. Якщо ви використовуєте класичні розділи, це трохи складніше і може зажадати перезавантаження (хоча вам ніколи не доведеться завантажувати іншу систему або живий компакт-диск).

Ось так я це роблю: 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.

Дивіться розділ коментарів щодо того, що робити, якщо ваш перехідний розділ перешкоджає.

На сьогодні вже очевидно, чому люди рекомендують використовувати живий компакт-диск. ;-)

Крок 2. Як fdiskкорисно нагадує вам, ви повинні перезавантажити таблицю розділів, перш ніж продовжувати. Найбезпечніший спосіб - просто перезавантажити; але ви також можете використовувати partprobeабо kpartx (більше інформації) .

Крок 3. Після зміни розміру розділу та перезавантаження таблиці розділів це проста робота resize2fsіз файловою системою, і ви можете це зробити, навіть якщо він встановлений як кореневий розділ.

Приклад:

$ sudo resize2fs /dev/sda1

16
Це прекрасно працювало для мене. Однак я додатково переконався, що прапор завантажувача зберігається у вихідному стані.
Август Клінг

4
@ Jbo5112: Як fdiskговорить, partprobeабо kpartxможе працювати замість перезавантаження; див. також це питання . Навіть якщо ви перезавантажуєтесь, рішення все-таки краще використовувати живий компакт-диск, коли мова йде про простої, коли проста перезавантаження може бути менше 10 с для віртуальної машини. Це також швидше в операторський час, саме тому я зазвичай сам використовую такий підхід. :)
Søren Løvborg

1
@Raymond: Якщо тиск у пам'яті дозволяє (див. free -h), Відключіть swap ( swapoff /dev/sda2), змініть таблицю розділів (включаючи видалення та відновлення розділу swap) та 1) перезавантажте або 2) перезавантажте таблицю розділів та swaponще раз. (Якщо пам'ять занадто обтяжена, щоб тимчасово відключити своп, ви все одно можете створити та включити новий розділ підкачки ( /dev/sda3), а потім здійснити заміну sda2; але тоді вам доведеться оновити /etc/fstabнове ім’я пристрою для заміни.)
Søren Løvborg

1
Якщо ви використовуєте vmware і збільшили розмір диска, вам доведеться запустити диск sudo lshw -C для повторної перевірки файлових систем, щоб vm розпізнав більший диск. Потім дотримуйтесь наведених вище вказівок.
Хлопець

2
А як щодо скорочення?
Аарон Франке

114

Можна змінити онлайновий розмір файлової системи ext4, навіть якщо це ваш кореневий розділ. Використовуйте resize2fsкоманду.

sudo resize2fs /dev/sda1

EDIT: On-line скорочення заборонено:

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
Від 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
Я вважаю, перший абзац з resize2fs Manpage найцікавіший початковий питання: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.).
мо »

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
Сподівався

Усунення неможливо зробити в режимі он-лайн. Я рекомендую використовувати gpartedдля цього.
STRML

4
зростанняpart є частиною хмарних утиліт. Якщо у вас не встановлено, ви можете встановити програму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
Я думаю, що більшість людей, як тільки ви зупините всі програми та сервіси, що мають доступ до кореневого розділу, ви також можете перезавантажити машину. Для скорочення / переміщення це все ще може бути швидшим, ніж використання живого компакт-диска, але для зростання (на сьогоднішній день найпоширеніша задача і те, про що запитувала ОП), існують способи, які не передбачають тимчасового відключення більшості системи .
Søren Løvborg

2
@ SørenLøvborg: Ви можете перезапустити основні сервіси, які потребують постійного виробництва, виконуючи повну процедуру. Існує багато конфігурацій, де ви не можете поставити LiveCD (екземпляри VPS, виділені сервери ...) або обставини, коли ви хочете уникати перезавантажень з певних причин. У заголовку оригінального питання згадується "змінити розмір", що приваблює людей, які шукають скорочення розділів в Інтернеті. ** Жодне інше рішення не дозволяє скоротити ext4 в Інтернеті. ** Це рішення є ризикованим, складним, але найпотужнішим з усіх і заповнює недоліки інших.
vaab

1
Будь ласка, не публікуйте відповідей залежно від зовнішніх посилань. Введіть відповідну частину у свою відповідь або опублікуйте посилання як коментар до питання. Детальніше див. У розділі Як відповісти .
Мелебій

10

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

GParted в основному робить усі кроки - просто на основі інтерфейсу GUI.


Я завантажив свою систему за допомогою Ubuntu 12.04 Live CD і змінив розмір розділу ext4 з GParted. Добре працював для мене. У будь-якому випадку, перед цією операцією я створив резервну копію всіх важливих даних.
StandDuPp

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

Очевидно, що питання про розділ, з якого вони завантажилися, і завантаження живого компакт-диска вимагає перезавантаження машини. -1
wjandrea

5

Щойно закінчив зміни розміру кореневого розділу ext4 в живій системі під час монтажу кореня.

[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: розширення розділу з наявним розділом swap.

Спочатку макет диска після його розширення:

$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 потрібно розширити вільним простором на кінці диска, але розділ swap знаходиться між ними. Ось як це можна зробити:

Спочатку нам потрібно відключити своп. Перевірте, скільки воно використовується і чи можете вимкнути його.

$ 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 - загальна кількість секторів за вирахуванням розміру сектору вашого swap-розділу: 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 для автоматичного монтажу розділу swap після завантаження

$sudo nano /etc/fstab

І змініть UUID розділу swap на вихід вище:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

Зараз все добре, і ви можете перезавантажитись без проблем.


що стосується чергування типу розділу swap, це можна зробити у fdisk buy, вибравши t тоді 5 (розділ 5), потім 82 (тип Linux swap / Solaris)
Oz Edri

чи не слід продовжувати розділ 2? (і тоді у fdisk ми повинні вибрати e замість p) Також, чи не повинні команди mmwp та swapon виконуватись на / dev / sda5 замість sda2?
Оз Едрі

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

1
Для розділу swap: ви можете використовувати розширений розділ, але тоді вам потрібно додати два розділи: розширений та логічний (див. Мою початкову версію розділу). У моєму прикладі я закінчую 2 основні розділи: sda1 - ext4 - кореневий розділ & sda2 - розділ swap. Отже mkswap, swaponкоманди & потрібно запустити на sda2. Я зробив помилку на початку своєї публікації: swapoffпотрібно виконати на sda5. Коментарі завжди вітаються, важко було це записати.
wouter205

1
Коли шифрований розділ swap потрібно спочатку зупинити криптовалюти cryptdisks_stop, а потім оновити / etc / crypttab, а не /etc/fstabперезапустити криптовалюти 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

За бажанням слід зробити знімок VM, щоб бути обережним.

Змінити розмір розділу:

parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q

Змініть розмір файлової системи: resize2fs /dev/sda1

Якщо щось піде не так, ви можете відновити свій знімок тут. Якщо все пройшло нормально, повернутися до нормального (рівню виконання отриманого вище) - зазвичай 5: init 5. Може бути краще зробити повну перезавантаження в цей момент, щоб переконатися, що все повертається належним чином (у мене була проблема з датою / 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

Як зазначено раніше:

  • можливе розширення трансляції з кореневої системи (без складнощів, оскільки завантажувальний розділ не переміщується)

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

Будь-який тип "але я це зробив і працює" - це чиста удача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.