Ubah ukuran langsung partisi GPT di Linux

12

Di Linux saya biasa mengubah ukuran partisi MBR menggunakan fdisk, bahkan pada sistem file live, dan kemudian mengeluarkan resize2fs / pvresize / ... (tergantung pada tipe fs) untuk mendapatkan ruang baru yang dialokasikan.

Akhir-akhir ini saya telah menggunakan partisi Xen dan GPT, dan saya perhatikan bahwa sayangnya parted sepertinya tidak memungkinkan on-the-fly mengubah ukuran dari partisi yang dipasang, sebenarnya itu akan mengeluh:

Error: Partition XXX is being used. You must unmount it before you modify it with Parted.

Saya sudah mencoba kombinasi resizeperintah dan bahkan rm+ mkpart, tetapi keduanya akan mengeluh tentang partisi yang dipasang.

Bagaimana saya bisa melakukan itu?

cyberz
sumber
Cara yang tersedia di luar kotak di RHEL / CentOS akan sangat dihargai
cyberz

Jawaban:

12

Cara paling aman untuk melakukan ini adalah boot menggunakan media darurat (live CD atau sejenisnya) dan menggunakan GParted, yang akan mengubah ukuran partisi dan sistem file yang dikandungnya. Ini hanya akan berfungsi jika partisi saat ini tidak digunakan.

Jika Anda tidak mampu downtime apapun, meskipun, Anda bisa mencoba menggunakan gdiskbukan parted. Anda harus menghapus partisi yang ingin Anda ubah ukurannya dan membuat yang baru di tempatnya dengan titik awal yang sama, seperti yang telah Anda lakukan fdisk. gdiskbersedia bekerja pada disk yang digunakan, meskipun kernel mungkin tidak mendaftarkan perubahan apa pun. Dalam hal ini, Anda mungkin perlu menggunakan partprobeatau kpartxuntuk mendapatkan kernel untuk menerima tabel partisi baru, atau bahkan me-reboot komputer jika itu tidak berhasil. (Ini semua harus sangat mirip dengan menggunakan fdisk.)

Rod Smith
sumber
Terlihat bagus, tetapi tidak disertakan secara default pada CentOS. Adakah cara yang lebih standar? Maksudku, sistem seperti redhat harus bisa mengubah ukuran sendiri tanpa bergantung pada program eksternal
cyberz
2
Tidak ada alat yang dikirimkan dengan CentOS yang akan melakukan pekerjaan. Anda harus keluar dari repositori CentOS untuk melakukan apa yang Anda inginkan. Perhatikan bahwa hampir semua distribusi lainnya (termasuk Fedora) termasuk gdiskdalam repositori mereka, dan saya pernah mendengar bahwa gdiskakan dimasukkan dalam versi RHEL berikutnya (dan karenanya dari CentOS).
Rod Smith
Terima kasih atas jawaban dan komentarnya, ini persis informasi yang saya cari
cyberz
1
gdisktersedia dalam EPEL.
jornane
Saya mencoba keduanya partxdan partprobetetapi akhirnya harus reboot. Terima kasih atas tipnya
Alexandre Bourlier
10

Ini biasanya hanya bekerja dengan distribusi Linux yang lebih baru. Alat yang dibutuhkan:

  • partprobe (biasanya bagian dari berpisah)
  • gdisk / sgdisk

Partisi GPT menyimpan header cadangan di akhir disk. Jika Anda telah mengubah ukuran perangkat yang mendasarinya, header cadangan akan berada di suatu tempat di tengah. Langkah pertama adalah memindahkan header partisi ke ujung disk.

Dengan asumsi disk adalah / dev / sda dan partisi adalah / dev / sda3 (juga harus menjadi partisi terakhir):

sgdisk -e /dev/sda

Kemudian hapus, partisi terakhir dan buat kembali:

sgdisk -d 3 /dev/sda
sgdisk -N 3 /dev/sda

Anda biasanya akan melihat pesan yang menunjukkan bahwa kernel tidak dapat memuat ulang tabel partisi. Anda harus menjalankan partprobe agar partisi terdaftar dengan ukuran baru:

partprobe /dev/sda

Jika ini tidak berhasil, Anda harus me-reboot mesin virtual. Setelah itu Anda dapat menumbuhkan sistem file Anda dengan alat yang sesuai, untuk ext4 dll .:

resize2fs /dev/sda3

Perhatian : menjalankan sgdisk bisa merusak. Pastikan Anda memiliki prosedur cadangan yang tepat.

Nils Meyer
sumber
Luar biasa! Terima kasih terutama untuk partprobelangkah ini - saya selalu berpikir perlu untuk reboot ketika mengubah tabel partisi dengan partisi yang terpasang.
piit79
Ingatlah bahwa menghancurkan dan membuat ulang partisi akan menghasilkan PARTUUID baru untuk partisi tersebut, yang merupakan satu-satunya cara yang dapat diandalkan dan sistem file untuk fstab / GRUB / etc untuk mengidentifikasi partisi dengan andal dalam pengaturan multi-disk.
Teo Klestrup Röijezon
5

Berikut adalah contoh yang digunakan alat otomatis untuk mengubah ukuran partisi online, dalam sekali jalan:

sgdisk -d 1 -n 1: 2048: 0 -c 1: -u 1: E485F29F-A1F4-4953-9DD8-799EAEA0119B -t 1: 0700 / dev / xvda

Berikut daftar opsi untuk perintah sgdisk:

  • -d 1 partisi pertama delete
  • -n 1: 2048: 0 mengatakan buat partisi baru "nomor 1", dengan mulai sektor 2048. Akhir sektor = "0" yang berarti "menggunakan semua ruang yang tersedia untuk partisi ini
  • -u menetapkan panduan unik untuk partisi itu (ini khusus untuk partisi GPT); Anda bisa menggunakan 'R' untuk GUID untuk diatur ke nilai acak. Anda juga bisa mendapatkan id partisi saat ini melalui gdisk /dev/xvda; poutput untuk menggunakan kembali uid yang sama
  • -t 1: 0700 pada dasarnya berarti partisi pertama adalah dari kode ketik '0700'.

/ dev / xvda adalah disk yang kami partisi ulang.

Jadi itu menghapus dan membuat partisi baru di tempatnya segera.

PS. Beberapa catatan tentang kode ketik '0700'. Dari man SGDISK (8)

   -t, --typecode=partnum:{hexcode|GUID}
          Change a single partition's type  code.  You  enter  the  type  code  using  either  a  two-byte  hexadecimal  number,  as 

dijelaskan sebelumnya, atau nilai GUID yang ditentukan sepenuhnya, seperti EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Temukan penjelasan terbaik untuk arti '0700' di sini - http://www.rodsbooks.com/gdisk/walkthrough.html

"Tapi tunggu," katamu, "kupikir disk itu memiliki partisi FAT!" Memang benar. Windows menggunakan kode GUID tunggal untuk semua partisi datanya, baik itu FAT atau NTFS. Di masa lalu, kode yang sama telah digunakan di Linux untuk partisi datanya. (Lebih lanjut tentang ini segera ....) Jadi, dalam hal ini beberapa kode MBR yang berbeda semua diterjemahkan ke dalam satu kode GPT GUID. GPT fdisk menggunakan, agak sewenang-wenang, kode 0x0700 (atau lebih tepatnya, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) untuk semua ini.

Dalam kasus saya, saya percaya itu adalah partisi Linux ext4, tetapi kode tik partisi tidak berarti tipe sistem file, jadi '0700' lebih mirip tipe catchall untuk sgdisk. Setidaknya dalam kasus yang pernah saya lihat.

PPS. Anda mungkin perlu menjalankan partprobekernel agar menyadari perubahan partisi tanpa me-reboot sistem.

Tagar
sumber
'p' akan menunjukkan kepada Anda UUID disk. 'i' akan menunjukkan kepada Anda UUID suatu partisi.
Keith
2

Saya hanya merangkum beberapa jawaban dan komentar di sini:

partedhanya akan menolak untuk mengubah partisi yang dipasang. gdiskakan melakukan pekerjaan untuk Anda, tetapi tidak dalam repositori RHEL atau CentOS standar. Itu ada di repositori EPEL .

Ingatlah bahwa mengubah partisi pada disk yang digunakan dapat mencegah kernel mendaftarkan perubahan. Jika itu terjadi, gunakan partprobe, partxatau reboot.

jornane
sumber
1

Apakah Anda bertanya tentang mengubah ukuran volume logis? Inilah cara saya akan melakukannya:

vgextend vgname /dev/sdb3
lvextend -L +3T /dev/mapper/location
resize2fs /mount/point

ATAU (xfs):

xfs_growfs /mount/point -D <bytes>
jredd
sumber
dia mungkin tidak menggunakan ext2 / ext3 / ext4, kalau tidak resize2fs harus bekerja dengan cepat?
1
@Antony Lee: jika Anda lulus -runtuk lvextend, maka memanggil resize2fsuntuk Anda.
jmtd
0

fdisk biasanya masih tersedia dan dapat melakukan ini, jika partisi tersebut adalah partisi terakhir dan awal partisi tidak bergerak.

Namun, ini adalah operasi berbahaya yang harus dilakukan dengan sangat hati-hati. Buat cadangan!

ec2-user@ip-10-0-20-15 ~]$ sudo fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.30.2).
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/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 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: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 16777182 16773087   8G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

Command (m for help): d
Partition number (1,128, default 128): 1

Partition 1 has been deleted.

Command (m for help): n
Partition number (1-127, default 1): 1
First sector (34-50331614, default 4096):
Last sector, +sectors or +size{K,M,G,T,P} (4096-50331614, default 50331614):

Created a new partition 1 of type 'Linux filesystem' and of size 24 GiB.
Partition #1 contains a xfs signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): p

Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 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: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

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).

[ec2-user@ip-10-0-20-15 ~]$ sudo partprobe

[ec2-user@ip-10-0-20-15 ~]$ sudo fdisk -l
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 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: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

[ec2-user@ip-10-0-20-15 ~]$ sudo xfs_growfs /
meta-data=/dev/nvme0n1p1         isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 6290939
```
Daniel Farrell
sumber