Disk partisi terprogram

10

Saya mencoba membuat skrip bash yang akan membuat partisi baru dengan sistem file pada disk dengan partisi yang ada.

Sepertinya mudah untuk membuat partisi secara terprogram dengan parted, namun mengharuskan Anda untuk mengetahui di mana harus memulai dan menghentikan partisi baru, dan di sinilah saya mengalami masalah.

Saya tidak ingin bergantung pada disk yang memiliki partisi dalam posisi / ukuran tertentu. Yaitu, saya ingin membuat partisi baru dimulai segera setelah yang terakhir ada. Saya ingin dapat kemudian membuat partisi dengan ukuran tetap, atau untuk mengisi ruang yang tersisa.

Di Bash, apakah ada cara penentuan yang andal

a) posisi akhir dari partisi terakhir, dan
b) sisa ruang tanpa partisi setelah partisi terakhir?

Alex
sumber
1
Bahkan jika Anda bisa melakukannya, saya tidak akan melakukannya. Bayangkan kerusakan seperti apa yang dapat dilakukan kesalahan ketik di sini ...
Joseph R.
Lebih baik tidak. Pemasang dari beberapa distribusi memiliki partisi ulang dan bukan tugas yang mudah untuk menulisnya. Terlalu banyak kotak sudut, terlalu banyak hal yang bisa Anda ganggu. Jangan lakukan itu. Jika ya, biarkan menghasilkan konfigurasi yang disarankan, yang harus disetujui oleh operator.
peterph
Saya setuju ini berbahaya. Namun ini adalah skrip yang akan mulai dengan menghapus semua partisi pada disk, jadi mengacaukan partisi setelahnya bukan masalah besar. Satu-satunya risiko adalah bahwa pengguna menentukan disk yang salah, yang sama mudahnya dengan alat partisi apa pun.
Alex

Jawaban:

4

parteddapat mencetak ruang kosong. Contoh (sengaja saya pilih yang rumit):

# 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

Seperti yang Anda lihat, ini memberi Anda secara langsung posisi dan ukuran partisi yang mungkin dapat Anda buat, yaitu baris terakhir yang mengatakan Free Space. Anda bisa membuat partisi yang dimulai pada 31115264 dan berakhir pada 31116287.

Jika bukan karena perangkap bahwa partisi extended tidak cukup besar!

Tapi mungkin Anda sudah menggunakan GPT di mana Anda tidak menderita komplikasi seperti itu.

Meraih angka harus cukup mudah.

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`

Atau yang serupa. (Tentu Anda ingin melakukan pemeriksaan kewarasan lagi di sini.)

@swisscheese membuat komentar yang bagus di jawaban yang lain, saya tidak tahu partedmenawarkan output ramah parse. Anda mungkin memilih untuk menggunakannya. Contoh untuk meraih gratis terbesar terakhir:

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

Apakah itu berlaku untuk situasi Anda (dalam contoh saya, Anda tidak dapat membuat partisi di sana, itu sudah benar-benar penuh) adalah sesuatu yang harus Anda cari tahu sendiri. :)

frostschutz
sumber
Terima kasih! Sebagai referensi, saya menggunakan fungsi make_partition Anda tetapi dengan argumen yang sedikit berbeda: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex
-1

Sangat mudah, mkpartedmemiliki --listopsi, Anda perlu menggunakan awk dan --listmengambil partisi terakhir dan kemudian menggunakan mkpart part-type [fs-type] start end,

Tapi jawaban Anda:

Pada awalnya Anda harus mendapatkan semua partisi dan dengan:

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

Catatan:

  1. Anda harus mengonversi GBke MG.
  2. Anda harus menggunakan nilai terakhir masing-masing variable
  3. Anda harus menggunakan -sdi Anda parted commanddalam script final.

Jika saya punya waktu, lengkapi skrip ini maaf karena tidak punya waktu.

Teluk Persia
sumber
Hai, apakah Anda benar-benar menjalankan urutan perintah yang Anda sarankan? Saya tidak berpikir mereka melakukan apa yang Anda harapkan dari mereka .. :(
swisscheese
saya diperbarui, silakan baca kembali.
PersianGulf
opsi 2 juga diubah.
PersianGulf
2
Hai, apa yang saya maksudkan adalah, 'parted --list | awk' {print $ 2} 'hanya membabi buta untuk awk! Ini TIDAK mendapatkan apa yang Anda inginkan. Anda harus menggunakan opsi -m untuk berpisah, yang menawarkan output "parse-friendly".
swisscheese
1
Tidak ada lagi yang bisa dikatakan, semoga beruntung.
swisscheese