Programowo podziel dysk na partycje


10

Próbuję utworzyć skrypt bash, który utworzy nową partycję z systemem plików na dysku z istniejącymi partycjami.

Wygląda na to, że tworzenie partycji jest łatwe programowo, ale wymaga wiedzy, od czego zacząć i zatrzymać nową partycję, i tutaj mam problemy.

Nie chcę polegać na tym, że dysk ma partycje w określonej pozycji / rozmiarze. Oznacza to, że chcę utworzyć nową partycję, rozpoczynającą się natychmiast po ostatniej istniejącej. Chcę mieć możliwość utworzenia partycji o stałym rozmiarze lub wypełnienia pozostałej przestrzeni.

W Bash istnieje wiarygodny sposób określania

a) pozycja końcowa ostatniej partycji, i
b) pozostała przestrzeń niepodzielona na partycje po ostatniej partycji?


1
Nawet jeśli możesz to zrobić, nie zrobiłbym tego. Wyobraź sobie, jakie szkody może tu wyrządzić literówka ...
Joseph R.

Lepiej nie. Instalatorzy niektórych dystrybucji mają repartycjonery i napisanie jednego nie jest tak proste. Zbyt wiele skrzynek narożnych, zbyt wiele rzeczy, które możesz zepsuć. Nie rób tego Jeśli to zrobisz, pozwól mu wygenerować sugerowaną konfigurację, która musi zostać zatwierdzona przez operatora.
peterph

Zgadzam się, że to niebezpieczne. Jest to jednak skrypt, który rozpocznie się od skasowania wszystkich partycji na dysku, więc późniejsze bałaganowanie partycji to nic wielkiego. Jedynym ryzykiem jest to, że użytkownik określi niewłaściwy dysk, co jest równie łatwe w przypadku dowolnego narzędzia do partycjonowania.
Alex

Odpowiedzi:


4

partedmożna wydrukować wolne miejsce. Przykład (celowo wybrałem skomplikowany):

# 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

Jak widać, daje to bezpośrednio pozycję i rozmiar partycji, którą możesz być w stanie utworzyć, tj. Ostatni wiersz, który mówi Free Space. Możesz utworzyć partycję, która zaczyna się od 31115264s, a kończy na 31116287s.

Gdyby nie pułapka, rozszerzona partycja nie jest wystarczająco duża!

Ale może już używasz GPT, gdy nie cierpisz z powodu takich komplikacji.

Chwytanie liczb powinno być dość łatwe.

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`

Lub coś podobnego. (Oczywiście chciałbyś tutaj zrobić więcej kontroli zdrowia).

@swisscheese zrobił dobry komentarz w drugiej odpowiedzi, nie wiedziałem, że partedoferuje przyjazny wynik analizy. Możesz zamiast tego użyć tego. Przykład wykorzystania ostatniej największej darmowej:

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

To, czy ma to zastosowanie do twojej sytuacji (w moim przykładzie nie można tam utworzyć partycji, jest już naprawdę pełna), jest czymś, co musisz samemu wymyślić. :)


Dzięki! Dla porównania użyłem funkcji make_partition, ale z nieco innymi argumentami: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

To proste, mkpartedma --listopcję, musisz użyć awk i --listpobrać ostatnią partycję, a następnie użyć mkpart part-type [fs-type] start end,

Ale twoja odpowiedź:

Najpierw powinieneś uzyskać wszystkie partycje oraz:

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

Uwagi:

  1. Powinieneś przekonwertować GBna MG.
  2. Powinieneś użyć ostatniej wartości każdego z nich variable
  3. Powinieneś użyć -sw swoim parted commandostatecznym skrypcie.

Jeśli mam czas, proszę ukończyć ten skrypt przepraszam, że nie mam czasu.


Cześć, czy faktycznie uruchomiłeś sugerowane sekwencje poleceń? Nie sądzę, aby robili to, czego się od nich oczekuje .. :(
szwajcarski

zaktualizowałem, proszę ponownie przeczytać.
PersianGulf,

opcja 2 również została zmieniona.
PersianGulf,

2
Cześć, miałem na myśli to, że „parted --list | awk '{print $ 2}' ślepo leci na awk! NIE dostaje tego, czego chcesz. Powinieneś użyć opcji -m do parted, która oferuje wyjście „przyjazne dla parsowania”.
szwajcarski

1
Nic więcej do powiedzenia, powodzenia.
szwajcarski
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.