Thay đổi kích thước trực tiếp phân vùng GPT trên Linux


12

Trên Linux, tôi đã sử dụng để thay đổi kích thước phân vùng MBR bằng fdisk, thậm chí trên các hệ thống tệp trực tiếp và sau đó phát hành resize2fs / pvresize / ... (tùy thuộc vào loại fs) để phân bổ không gian mới.

Gần đây tôi đã sử dụng các phân vùng Xen và GPT và tôi nhận thấy rằng không may chia tay dường như không cho phép thay đổi kích thước nhanh chóng của một phân vùng được gắn kết, trên thực tế, nó sẽ phàn nàn:

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

Tôi đã thử cả kết hợp resizelệnh và chẵn rm+ mkpart, nhưng cả hai sẽ phàn nàn về phân vùng được gắn kết.

Làm thế nào tôi có thể làm điều đó?


Một cách có sẵn trong hộp trên RHEL / CentOS sẽ được đánh giá cao
cyberz

Câu trả lời:


12

Cách an toàn nhất để thực hiện việc này là khởi động bằng phương tiện khẩn cấp (CD trực tiếp hoặc tương tự) và sử dụng GParted, sẽ thay đổi kích thước cả phân vùng và hệ thống tệp mà nó chứa. Điều này sẽ chỉ hoạt động nếu phân vùng hiện không được sử dụng.

Tuy nhiên, nếu bạn không đủ khả năng để ngừng hoạt động, bạn có thể thử sử dụng gdiskthay vì parted. Bạn sẽ cần xóa phân vùng bạn muốn thay đổi kích thước và tạo một phân vùng mới ở vị trí của nó với cùng một điểm bắt đầu, giống như bạn đã làm với fdisk. gdisksẵn sàng làm việc trên một đĩa đang sử dụng, mặc dù kernel có thể không đăng ký bất kỳ thay đổi nào. Trong trường hợp đó, bạn có thể cần phải sử dụng partprobehoặc kpartxđể lấy kernel chấp nhận bảng phân vùng mới hoặc thậm chí khởi động lại máy tính nếu điều đó không hoạt động. (Tất cả điều này sẽ khá giống với việc sử dụng fdisk.)


Trông đẹp, nhưng không được bao gồm theo mặc định trên CentOS. Bất kỳ cách tiêu chuẩn hơn? Ý tôi là, một hệ thống giống như
màu đỏ

2
Không có công cụ nào vận chuyển với CentOS sẽ thực hiện công việc. Bạn phải ra khỏi kho lưu trữ CentOS để làm những gì bạn muốn. Lưu ý rằng hầu hết tất cả các bản phân phối khác (bao gồm Fedora) bao gồm gdisktrong kho của họ và tôi đã nghe nói rằng gdisksẽ được đưa vào phiên bản tiếp theo của RHEL (và do đó là CentOS).
Rod Smith

Cảm ơn bạn đã trả lời và nhận xét, đó chính xác là thông tin tôi đang tìm kiếm
cyberz

1
gdiskcó sẵn trong EPEL.
jornane

Tôi đã thử cả hai partxpartprobecuối cùng phải khởi động lại. Dù sao cũng cảm ơn bạn vì những lời khuyên đó
Alexandre Bour trước

10

Điều này thường chỉ hoạt động với các bản phân phối Linux gần đây hơn. Công cụ cần thiết:

  • partprobe (thường là một phần của chia tay)
  • gdisk / sgdisk

Phân vùng GPT lưu trữ một tiêu đề sao lưu ở cuối đĩa. Nếu bạn đã thay đổi kích thước thiết bị bên dưới, tiêu đề sao lưu sẽ ở đâu đó ở giữa. Bước đầu tiên là di chuyển tiêu đề phân vùng đến cuối đĩa.

Giả sử đĩa là / dev / sda và phân vùng là / dev / sda3 (cũng phải là phân vùng cuối cùng):

sgdisk -e /dev/sda

Sau đó xóa, phân vùng cuối cùng và tạo lại nó:

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

Bạn thường sẽ thấy một thông báo chỉ ra rằng kernel không thể tải lại bảng phân vùng. Bạn phải chạy partprobe để phân vùng được đăng ký với kích thước mới:

partprobe /dev/sda

Nếu điều này không thành công, bạn sẽ phải khởi động lại máy ảo. Sau đó, bạn có thể phát triển hệ thống tập tin của mình bằng công cụ thích hợp, cho ext4, v.v.:

resize2fs /dev/sda3

Chú ý : chạy sgdisk có thể bị phá hủy. Hãy chắc chắn rằng bạn có quy trình sao lưu thích hợp tại chỗ.


Tuyệt vời! Đặc biệt cảm ơn về partprobebước này - Tôi luôn nghĩ cần phải khởi động lại khi thay đổi bảng phân vùng với bất kỳ phân vùng được gắn nào.
piit79

Hãy nhớ rằng việc phá hủy và tạo lại phân vùng sẽ tạo ra một PHẦN MỀM mới cho phân vùng, đây là cách duy nhất đáng tin cậy và độc lập với hệ thống tệp cho fstab / GRUB / vv để xác định đáng tin cậy các phân vùng trong các thiết lập đa đĩa.
Teo Klestrup Röijezon 26/12/18

5

Dưới đây là một ví dụ mà một công cụ tự động sử dụng để thay đổi kích thước phân vùng trực tuyến, trong một lần chạy:

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

Đây là danh sách các tùy chọn cho lệnh sgdisk:

  • -d 1 xóa phân vùng đầu tiên
  • -n 1: 2048: 0 nói tạo phân vùng mới "số 1", với bắt đầu sector 2048. End sector = "0" có nghĩa là "sử dụng tất cả không gian có sẵn cho phân vùng này
  • -u đặt hướng dẫn duy nhất cho phân vùng đó (điều này dành riêng cho phân vùng GPT); bạn có thể sử dụng 'R' cho GUID để được đặt thành một giá trị ngẫu nhiên. Bạn cũng có thể lấy id của phân vùng hiện tại thông qua gdisk /dev/xvda; pđầu ra để sử dụng lại cùng một uid
  • -t 1: 0700 về cơ bản có nghĩa là phân vùng đầu tiên có kiểu chữ '0700'.

/ dev / xvda là đĩa mà chúng tôi đã phân vùng lại.

Vì vậy, nó xóa và tạo một phân vùng mới trên vị trí của nó ngay lập tức.

Tái bút Một vài lưu ý về kiểu chữ '0700'. Từ người đàn ông 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 

được mô tả trước đó hoặc giá trị GUID được chỉ định đầy đủ, chẳng hạn như EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Tìm thấy lời giải thích tốt nhất cho ý nghĩa của '0700' ở đây - http://www.rodsbooks.com/gdisk/walk phiên.html

"Nhưng chờ đã," bạn nói, "Tôi nghĩ đĩa có phân vùng FAT!" Quả thực là như vậy. Windows sử dụng một mã GUID duy nhất cho tất cả các phân vùng dữ liệu của mình, có thể là FAT hoặc NTFS. Trước đây, mã tương tự đã được sử dụng trong Linux cho các phân vùng dữ liệu của nó. (Thông tin thêm về điều này trong thời gian ngắn ....) Vì vậy, trong trường hợp này, một số mã MBR khác nhau đều được dịch thành một mã GPT GUID duy nhất. GPT fdisk sử dụng, phần nào tùy ý, mã 0x0700 (hay chính xác hơn là EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) cho tất cả những điều này.

Trong trường hợp của tôi, tôi tin rằng đó là phân vùng ext4 của Linux, nhưng kiểu chữ của phân vùng không có nghĩa là loại hệ thống tệp, vì vậy '0700' trông giống như một loại hình bắt cho sgdisk. Ít nhất là trong những trường hợp tôi đã thấy.

PPS. Bạn có thể cần chạy partprobekernel để nhận biết thay đổi phân vùng mà không cần khởi động lại hệ thống.


'p' sẽ hiển thị cho bạn UUID của đĩa. 'i' sẽ hiển thị cho bạn UUID của phân vùng.
Keith

2

Tôi chỉ tóm tắt một số câu trả lời và ý kiến ​​ở đây:

partedđơn giản sẽ từ chối thay đổi bất kỳ phân vùng gắn kết. gdisksẽ thực hiện công việc cho bạn, nhưng nó không có trong kho lưu trữ tiêu chuẩn của RHEL hoặc CentOS. Nó nằm trong kho EPEL .

Hãy nhớ rằng việc thay đổi phân vùng trên đĩa đang sử dụng có thể ngăn kernel đăng ký thay đổi. Nếu điều đó xảy ra, sử dụng partprobe, partxhoặc khởi động lại.


1

Bạn đang hỏi về việc thay đổi kích thước một khối lượng logic? Đây là cách tôi sẽ làm điều đó:

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

HOẶC (xfs):

xfs_growfs /mount/point -D <bytes>

Có lẽ anh ta không sử dụng ext2 / ext3 / ext4, nếu không thì resize2fs sẽ hoạt động nhanh?

1
@Antony Lee: nếu bạn vượt qua -rđể lvextend, sau đó nó gọi resize2fscho bạn.
jmtd 13/03/2015

0

fdisk thường vẫn có sẵn và có thể làm điều này, nếu phân vùng là phân vùng cuối cùng và bắt đầu phân vùng không di chuyển.

Tuy nhiên, đây là một hoạt động nguy hiểm nên được thực hiện hết sức cẩn thận. Tạo một bản sao lưu!

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
```
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.