Perluas partisi terakhir secara otomatis untuk menggunakan semua ruang yang tidak terisi, menggunakan parted dalam mode batch

20

Singkatnya, saya perlu melakukan ini semua secara otomatis saat boot (embedded system).

Teknisi kami akan mem-flash gambar ke perangkat produksi. Gambar-gambar ini akan berisi tabel partisi kecil. Saat boot, saya perlu secara otomatis memperluas partisi terakhir (# 3) untuk menggunakan semua ruang yang tersedia pada disk.

Inilah yang saya dapatkan ketika saya melihat ruang kosong pada disk saya.

> parted /dev/sda print free
Model: Lexar JumpDrive (scsi)
Disk /dev/sda: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  25.3MB  24.2MB  fat16        primary  legacy_boot
        25.3MB  26.2MB  922kB   Free Space
 2      26.2MB  475MB   449MB   ext4         primary
 3      475MB   1549MB  1074MB  ext4         primary
        1549MB  32.0GB  30.5GB  Free Space

Saya perlu memperluas partisi 3 dengan N (30,5GB) jumlah byte

Bagaimana saya melakukan langkah ini secara otomatis, tanpa prompt? Ini perlu bekerja dengan ukuran ruang dinamis yang tersedia setelah partisi ke-3.

Paul Knopf
sumber
Jangan berharap menerima skrip siap pakai, tanpa mencoba! Jadi bisakah Anda menunjukkan kepada kami apa yang Anda coba sampai sekarang? Lain hal partisi yang Anda mengubah ukuran harus tidak dipasang selama operasi ....
Luciano Andress Martini
Saya sudah mencoba resizepartperintah, dan itu berhasil, tetapi membutuhkan ukuran yang tepat. Saya membutuhkannya untuk menjadi dinamis.
Paul Knopf
resize2fsmungkin apa yang saya cari. linux.die.net/man/8/resize2fs
Paul Knopf

Jawaban:

21

Dalam versi saat ini parted, resizepartharus berfungsi untuk partisi ( partedmengerti 100%atau hal-hal seperti -1s, yang terakhir juga perlu --menghentikan opsi penguraian pada cmdline). Untuk menentukan nilai yang tepat Anda dapat menggunakan unit s, print free. resize2fsdatang setelahnya untuk sistem file.


Versi lama partedmemiliki resizeperintah yang akan mengubah ukuran partisi dan sistem file sekaligus, bahkan berhasil vfat.

Dalam modifikasi ereader Kobo saya menggunakan ini untuk mengubah ukuran partisi ke-3 dari memori internal ke maksimum: (itu secara membabi buta menganggap tidak ada partisi ke-4 dan tabel msdos dan sebagainya)

start=$(cat /sys/block/mmcblk0/mmcblk0p3/start)
end=$(($start+$(cat /sys/block/mmcblk0/mmcblk0p3/size)))
newend=$(($(cat /sys/block/mmcblk0/size)-8))

if [ "$newend" -gt "$end" ]
then
    parted -s /dev/mmcblk0 unit s resize 3 $start $newend
fi

Jadi, Anda juga dapat memperoleh nilai dari /sys/block/.../jika kernel mendukungnya. Tetapi partedmenghapus resizeperintah sehingga Anda harus melakukan dua langkah sekarang, resizepartuntuk menumbuhkan partisi, dan alat apa pun yang disediakan sistem file Anda untuk menumbuhkannya, seperti resize2fsuntuk ext*.

frostschutz
sumber
Inilah yang saya cari. Terima kasih atas bantuan Anda!
Paul Knopf
Pertanyaan sampingan, ada apa dengan 8 byte di akhir?
Paul Knopf
Hindari mengubah ukuran oleh satu sektor ... Anda harus mengubahnya ke -40 atau sesuatu (header cadangan GPT di akhir disk).
frostschutz
Tidak partedmendukung ekstensi otomatis dari baris perintah? Karena, tidak mendukung secara interaktif. Jika dijalankan secara interaktif, ia akan menanyakan apakah Anda ingin memperbaiki tabel partisi GPT agar sesuai dengan ukuran disk (jenis fix), dan kemudian Anda dapat menjalankan resizepart 3 -1. Saya sudah berusaha mencari cara untuk melakukannya dari baris perintah.
Harvey
Tidak terlalu cepat: Perintah resize telah dihapus di parted 3.0. Coba sfdisk atau gparted.
GregD
16

Karena skrip tidak dapat dipisah dengan benar (meminta konfirmasi karena partisi telah dipasang dan bertentangan dengan jawaban lain yang saya temukan tidak mengerti -1satau 100%), saya baru saja menemukan alat growpart yang melakukan hal ini.

Penggunaannya sederhana: growpart /dev/sda 3(dan kemudian resize2fs /dev/sda3, atau perintah lain yang sesuai untuk tipe sistem file yang digunakan).

Dalam Debian dan Ubuntu itu dikemas sebagai cloud-guest-utils .

Ivo Smits
sumber
1
Ini adalah cara paling nyaman yang bisa saya temukan untuk ini sekarang. Itu bekerja dengan sangat baik.
SebiF
Ini adalah solusi bagi saya - berpisah tidak suka ext4 sebagai sistem file, dan sepertinya tidak ada cara untuk menghindarinya dengan mencoba mengubah ukuran sistem file ...
Antti Haapala
tidak bekerja untuk Ubuntu 18.04
DreamFlasher
@DreamFlasher Saya tidak tahu mengapa itu tidak berhasil untuk Anda. Sejauh yang saya bisa lihat, Anda hanya dapat menginstal paket cloud-guest-utils dan karena ini adalah satu-satunya fungsi yang disediakan oleh growpart, ia seharusnya berfungsi kecuali ada bug, itu digunakan secara tidak benar atau sesuatu di luar kendalinya mengalami kesalahan. Perhatikan bahwa argumen terakhir (3 dalam contoh) adalah partisi yang akan diubah ukurannya, dihitung dari 1, dan bahwa ruang yang cukup harus tersedia segera setelah partisi untuk dapat mengubah ukurannya dengan cara ini.
Ivo Smits
7

Cara yang tepat untuk melakukan ini adalah menggunakan fakta bahwa parted memiliki gagasan persentase. Begitu

parted /dev/sda resize 3 100%
Jonathan Buzzard
sumber
1
ketinggalan jaman, tidak bekerja dengan Ubuntu 18.04 dan lebih baru
DreamFlasher
Sedikit perintah resize telah pergi dengan parted versi 3, Anda sekarang harus menggunakan perintah resizepart dan kemudian secara terpisah mengubah ukuran sistem file atau PV yang mendasarinya jika itu yang Anda gunakan. Untuk ext4 perintahnya adalah resize2fs, atau untuk XFS adalah xfs_growfs. Keduanya biasanya dilakukan ketika sistem file di-mount dan argumennya adalah titik mount dalam kedua kasus.
Jonathan Buzzard
0

Di Ubuntu 18.04, saya dapat mengubah ukuran untuk mengisi ruang yang tidak terisi dalam skrip dengan yang berikut:

sudo parted -s /dev/sdb "resizepart 2 -1" quit
sudo mount -av
sudo umount /dev/sdb2
sudo mount /dev/sdb2 /mnt
sudo resize2fs /dev/sdb2

Mungkin tidak perlu melakukan mount sebelum mengubah ukuran. Saya melakukannya untuk menekan permintaan dari resize2fs untuk input pengguna.

Nolan Zinn
sumber