Програмно-розділовий диск


10

Я намагаюся створити скрипт bash, який створить новий розділ з файловою системою на диску з існуючими розділами.

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

Я не хочу покладатися на диск, який має перегородки в певному положенні / розмірі. Тобто я хочу створити новий розділ, починаючи відразу після останнього існуючого. Я хочу мати змогу створити розділ або зафіксованого розміру, або заповнити залишок місця.

У Баша є надійний спосіб визначення

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


1
Навіть якщо ти можеш це зробити, я б цього не зробив. Уявіть собі, яку шкоду тут може нанести помилка ...
Джозеф Р.

Краще не варто. Установці деяких дистрибутивів мають перерозподільники, і написати насправді це не просто завдання. Занадто багато кутових справ, занадто багато речей, які ви можете зіпсувати. Не робіть цього. Якщо ви зробите це, нехай він створює запропоновану конфігурацію, яку має бути затверджено оператором.
петерф

Я згоден, це небезпечно. Однак це сценарій, який розпочнеться зі стирання всіх розділів на диску, так що зіпсувати розділи згодом - це не велика справа. Єдиний ризик полягає в тому, що користувач вказує неправильний диск, що так само просто з будь-яким інструментом розділів.
Алекс

Відповіді:


4

partedможе друкувати вільний простір. Приклад (я вибрав складний за призначенням):

# parted /dev/sda unit s print free
[...]
Number  Start      End        Size       Type      File system  Flags
        63s        2047s      1985s                Free Space
 1      2048s      4196351s   4194304s   primary   fat32        lba
        4196352s   4198399s   2048s                Free Space
 2      4198400s   6295551s   2097152s   primary   ext2         boot
        6295552s   6297599s   2048s                Free Space
 3      6297600s   27269119s  20971520s  primary   ext2
        27269120s  27271167s  2048s                Free Space
 4      27271168s  31115263s  3844096s   extended               lba
 5      27273216s  29192191s  1918976s   logical   ext2
 6      29194240s  31115263s  1921024s   logical   ext2
        31115264s  31116287s  1024s                Free Space

Як ви бачите, це дає вам безпосередньо положення та розмір розділу, який ви зможете створити, тобто останній рядок, який говорить Free Space. Ви можете створити розділ, який починається з 31115264 і закінчується в 31116287.

Якби не провалля, що розширена перегородка недостатньо велика!

Але, можливо, ви вже використовуєте GPT там, де не страждаєте від таких ускладнень.

Взяти цифри повинно бути досить просто.

function make_partition
{
    parted -s "$1" unit s mkpart primary "$2" "$3"
}

make_partition /dev/sda `parted /dev/sda unit s print free | grep 'Free Space' | tail -n 1`

Або щось подібне. (Природно, ви хочете зробити ще кілька перевірок на корисність.)

@swisscheese зробив хороший коментар в іншій відповіді, я не знав, що partedпропонують дружній аналіз. Ви можете скористатися цим. Приклад захоплення останнього найбільшого безкоштовного:

# parted -m /dev/sda unit s print free | grep 'free;' | sort -t : -k 4n -k 2n | tail -n 1
1:27269120s:27271167s:2048s:free;

Чи це підходить для вашої ситуації (на моєму прикладі, ви також не могли створити там розділ, він дійсно повний) - це те, що ви повинні з’ясувати для себе. :)


Дякую! Для довідки я використовував вашу функцію make_partition, але з дещо іншими аргументами: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

Це легко, mkpartedє --listопція, вам потрібно використовувати awk та --listотримати останній розділ, а потім використовувати mkpart part-type [fs-type] start end,

Але ваша відповідь:

Спочатку слід отримати всі розділи та:

mystartgroup=`parted --list |awk {'print $2'}`
myendgroup=`parted --list |awk {'print $3'}`

Примітки:

  1. Ви повинні конвертувати GBв MG.
  2. Ви повинні використовувати останнє значення кожного variable
  3. Ви повинні використовувати -sу своєму parted commandостаточному сценарії.

Якщо у мене є час, заповніть цей скрипт, вибачте, що не встигнете.


Привіт, ви насправді запускаєте запропоновані вами послідовності команд? Я не думаю, що вони роблять те, чого ви від них очікуєте .. :(
швейцарський

я оновлений, будь ласка, перечитайте.
PersianGulf

варіант 2 також був змінений.
PersianGulf

2
Привіт, що я мав на увазі: "Розлучився - список | awk" {print $ 2} '- це просто сліпо прокладати пробудження! Він НЕ отримує того, що ви хочете. Вам слід скористатися параметром -m для розбору, який пропонує вихід "зручний для розбору".
швейцарський

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