ปรับขนาด Live ของพาร์ติชัน GPT บน Linux


12

บน Linux ฉันเคยปรับขนาดพาร์ติชัน MBR โดยใช้ fdisk แม้ในระบบไฟล์สดแล้วออก resize2fs / pvresize / ... (ขึ้นอยู่กับประเภท fs) เพื่อรับการจัดสรรพื้นที่ใหม่

เมื่อเร็ว ๆ นี้ฉันใช้ Xen และ GPT พาร์ทิชันและฉันสังเกตเห็นว่าโชคไม่ดีที่แยกส่วนไม่อนุญาตให้ปรับขนาดพาร์ติชันที่ติดตั้งแบบทันทีทันใดในความเป็นจริงมันจะบ่น:

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

ฉันได้ลองทั้งresizeคำสั่งและการรวมกันrm+ mkpartแต่พวกเขาทั้งสองจะบ่นเกี่ยวกับพาร์ทิชันที่กำลังติดตั้ง

ฉันจะทำสิ่งนั้นได้อย่างไร


วิธีที่มีอยู่ในกล่องบน RHEL / CentOS จะได้รับการชื่นชมอย่างมาก
cyberz

คำตอบ:


12

วิธีที่ปลอดภัยที่สุดในการทำเช่นนี้คือการบูตโดยใช้สื่อฉุกเฉิน (ซีดีสดหรือสิ่งที่คล้ายกัน) และใช้ GParted ซึ่งจะปรับขนาดทั้งพาร์ติชันและระบบไฟล์ที่มีอยู่ สิ่งนี้จะใช้ได้เฉพาะในกรณีที่พาร์ติชันไม่ได้ถูกใช้งานอยู่ในขณะนี้

ถ้าคุณไม่สามารถหยุดทำงานใด ๆ แม้ว่าคุณอาจลองใช้แทนgdisk partedคุณจะต้องลบพาร์ติชันที่คุณต้องการปรับขนาดและสร้างพาร์ติชันใหม่ที่มีจุดเริ่มต้นเดียวกันกับที่คุณทำfdiskไว้ gdiskยินดีที่จะทำงานบนดิสก์ที่ใช้งานอยู่แม้ว่าเคอร์เนลอาจไม่ลงทะเบียนการเปลี่ยนแปลงใด ๆ ในกรณีดังกล่าวคุณอาจจำเป็นต้องใช้partprobeหรือkpartxเพื่อให้เคอร์เนลยอมรับตารางพาร์ติชันใหม่หรือแม้กระทั่งรีบูตคอมพิวเตอร์หากไม่ได้ผล (สิ่งนี้ควรคล้ายกับการใช้fdiskทั้งหมด)


ดูดี แต่ไม่รวมโดยค่าเริ่มต้นบน CentOS มีวิธีมาตรฐานเพิ่มเติมอีกไหม? ผมหมายถึงระบบ RedHat เหมือนควรจะสามารถปรับขนาดตัวเองโดยไม่ต้องอาศัยโปรแกรมภายนอก
CyberZ

2
ไม่มีเครื่องมือที่มาพร้อมกับ CentOS ที่จะทำงานได้ คุณต้องออกไปจากที่เก็บ CentOS เพื่อทำสิ่งที่คุณต้องการ โปรดทราบว่าการกระจายอื่น ๆ เกือบทั้งหมด (รวมถึง Fedora) รวมgdiskอยู่ในที่เก็บของพวกเขาและฉันได้ยินมาว่าgdiskจะรวมอยู่ใน RHEL รุ่นถัดไป (และ CentOS)
ร็อดสมิ ธ

ขอบคุณสำหรับคำตอบและความคิดเห็นเป็นข้อมูลที่ฉันต้องการ
cyberz

1
gdiskมีอยู่ใน EPEL
jornane

ฉันลองทั้งสองอย่างpartxและpartprobeในที่สุดก็ต้องรีบูต ขอขอบคุณสำหรับเคล็ดลับต่อไป
Alexandre Bourlier

10

สิ่งนี้มักจะใช้ได้กับลีนุกซ์รุ่นล่าสุดเท่านั้น เครื่องมือที่จำเป็น:

  • partprobe (มักเป็นส่วนหนึ่งของการแยกส่วน)
  • gdisk / sgdisk

พาร์ติชัน GPT เก็บส่วนหัวสำรองที่ท้ายดิสก์ หากคุณปรับขนาดอุปกรณ์พื้นฐานแล้วส่วนหัวสำรองจะอยู่ตรงกลาง ขั้นตอนแรกคือการย้ายส่วนหัวของพาร์ทิชันไปยังจุดสิ้นสุดของดิสก์

สมมติว่าดิสก์คือ / dev / sda และพาร์ติชันคือ / dev / sda3 (ต้องเป็นพาร์ติชันสุดท้ายด้วย):

sgdisk -e /dev/sda

จากนั้นลบพาร์ติชันล่าสุดและสร้างใหม่:

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

โดยปกติคุณจะเห็นข้อความระบุว่าเคอร์เนลไม่สามารถโหลดตารางพาร์ติชันได้อีกครั้ง คุณต้องเรียกใช้ partprobe เพื่อให้พาร์ติชันมีการลงทะเบียนด้วยขนาดใหม่:

partprobe /dev/sda

หากไม่สำเร็จคุณจะต้องรีบูตเครื่องเสมือน หลังจากนั้นคุณสามารถขยายระบบไฟล์ของคุณด้วยเครื่องมือที่เหมาะสมสำหรับ ext4 ฯลฯ

resize2fs /dev/sda3

ข้อควรระวัง : การเรียกใช้ sgdisk อาจเป็นอันตรายได้ ตรวจสอบให้แน่ใจว่าคุณมีกระบวนการสำรองข้อมูลที่เหมาะสม


! น่ากลัว ขอบคุณโดยเฉพาะอย่างยิ่งสำหรับpartprobeขั้นตอน - ฉันคิดเสมอว่ามันเป็นสิ่งจำเป็นในการรีบูตเมื่อเปลี่ยนตารางพาร์ทิชันที่มีพาร์ทิชันที่ติดตั้งใด ๆ
piit79

โปรดทราบว่าการทำลายและสร้างพาร์ติชันใหม่จะสร้างพาร์ติชันใหม่สำหรับพาร์ติชันซึ่งเป็นวิธีเดียวที่เชื่อถือได้และเป็นอิสระจากระบบไฟล์สำหรับ fstab / GRUB / ฯลฯ เพื่อระบุพาร์ติชันในการตั้งค่าหลายดิสก์อย่างเชื่อถือได้
Teo Klestrup Röijezon

5

นี่คือตัวอย่างที่เครื่องมืออัตโนมัติใช้เพื่อปรับขนาดพาร์ติชันออนไลน์ในการรันครั้งเดียว:

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

นี่คือรายการตัวเลือกสำหรับคำสั่ง sgdisk:

  • -d 1พาร์ติชันแรกของการลบ
  • -n 1: 2048: 0กล่าวว่าสร้างพาร์ติชันใหม่ "หมายเลข 1" โดยเริ่มต้นเซกเตอร์ 2048 End sector = "0" ซึ่งหมายถึง "ใช้พื้นที่ว่างทั้งหมดสำหรับพาร์ติชันนี้
  • -uตั้งค่า guid ที่ไม่ซ้ำสำหรับพาร์ติชันนั้น (นี่เป็นเฉพาะสำหรับพาร์ติชัน GPT); คุณสามารถใช้ 'R' เพื่อให้ GUID ตั้งค่าเป็นแบบสุ่ม นอกจากนี้คุณยังสามารถรับ ID ของพาร์ติชันปัจจุบันผ่านgdisk /dev/xvda; pเอาต์พุตเพื่อใช้ uid เดียวกันซ้ำได้
  • -t 1: 0700โดยทั่วไปหมายถึงการแบ่งพาร์ติชันแรกเป็น typecode '0700'

/ dev / xvda เป็นดิสก์ที่เราแบ่งพาร์ติชั่นใหม่

ดังนั้นมันจะลบและสร้างพาร์ติชันใหม่ในตำแหน่งทันที

PS หมายเหตุสั้น ๆ เกี่ยวกับ typecode '0700' จากผู้ชาย 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 

อธิบายไว้ก่อนหน้านี้หรือค่า GUID ที่ระบุอย่างสมบูรณ์เช่น EBD0A0A2-B9E5-4433-87C0-68B6B72699C7

พบคำอธิบายที่ดีที่สุดสำหรับความหมายของ '0700' ที่นี่ - http://www.rodsbooks.com/gdisk/walkthrough.html

"แต่เดี๋ยวก่อน" คุณพูดว่า "ฉันคิดว่าดิสก์มีพาร์ทิชัน FAT!" แน่นอนมัน Windows ใช้รหัส GUID เดียวสำหรับพาร์ติชันข้อมูลทั้งหมดไม่ว่าจะเป็น FAT หรือ NTFS ในอดีตมีการใช้รหัสเดียวกันใน Linux สำหรับพาร์ติชันข้อมูล (เพิ่มเติมเกี่ยวกับเรื่องนี้ในไม่ช้า .... ) ดังนั้นในกรณีนี้รหัส MBR ที่แตกต่างกันหลายคำแปลทั้งหมดเป็นรหัส GPT GUID เดียว GPT fdisk ใช้รหัส 0x0700 ตามอำเภอใจ (หรือมากกว่านั้นอย่างชัดเจน EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) สำหรับสิ่งเหล่านี้ทั้งหมด

ในกรณีของฉันฉันเชื่อว่าเป็นพาร์ทิชัน Linux ext4 แต่ typecode ของพาร์ติชันไม่ได้หมายถึงประเภทระบบไฟล์ดังนั้น '0700' จึงดูเหมือน catchall สำหรับ sgdisk อย่างน้อยก็ในกรณีที่ฉันเคยเห็น

PPS คุณอาจต้องเรียกใช้partprobeเพื่อให้เคอร์เนลตระหนักถึงการเปลี่ยนแปลงการแบ่งพาร์ติชันโดยไม่ต้องรีบูตระบบ


'p' จะแสดง UUID ของดิสก์ 'i' จะแสดง UUID ของพาร์ติชัน
Keith

2

ฉันแค่สรุปคำตอบและความคิดเห็นที่นี่:

partedก็จะปฏิเสธที่จะเปลี่ยนพาร์ทิชันที่ติดตั้งใด ๆ gdiskจะทำงานให้คุณ แต่มันไม่ได้อยู่ในที่เก็บ RHEL หรือ CentOS มาตรฐาน มันอยู่ในที่เก็บของEPEL

โปรดทราบว่าการเปลี่ยนพาร์ติชันบนดิสก์ที่ใช้งานอยู่อาจทำให้เคอร์เนลไม่สามารถลงทะเบียนการเปลี่ยนแปลงได้ ถ้าเกิดว่าใช้partprobe, partxหรือรีบูต


1

คุณกำลังถามเกี่ยวกับการปรับขนาดโลจิคัลวอลุ่มหรือไม่? นี่คือวิธีที่ฉันจะทำ:

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

หรือ (xfs):

xfs_growfs /mount/point -D <bytes>

เขาอาจไม่ได้ใช้ ext2 / ext3 / ext4 มิฉะนั้น resize2fs ควรทำงานได้ทันทีหรือไม่

1
@Antony Lee: ถ้าคุณผ่าน-rไปlvextendแล้วมันจะเรียกresize2fsคุณ
jmtd

0

fdisk โดยทั่วไปยังคงพร้อมใช้งานและสามารถทำได้ถ้าพาร์ติชันเป็นพาร์ติชันสุดท้ายและจุดเริ่มต้นของพาร์ติชันไม่ได้ย้าย

อย่างไรก็ตามนี่เป็นการผ่าตัดที่อันตรายที่ควรทำด้วยความระมัดระวัง ทำการสำรองข้อมูล!

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
```
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.