Phân vùng đĩa lập trình


10

Tôi đang cố gắng tạo một tập lệnh bash sẽ tạo một phân vùng mới với một hệ thống tệp trên một đĩa có (các) phân vùng hiện có.

Có vẻ như thật dễ dàng để tạo các phân vùng theo chương trình với một phần, tuy nhiên nó đòi hỏi bạn phải biết bắt đầu từ đâu và dừng phân vùng mới, và đây là lúc tôi gặp rắc rối.

Tôi không muốn dựa vào đĩa có phân vùng ở vị trí / kích thước cụ thể. Đó là, tôi muốn tạo một phân vùng mới bắt đầu ngay sau phân vùng hiện có cuối cùng. Tôi muốn có thể tạo phân vùng có kích thước cố định hoặc để lấp đầy không gian còn lại.

Trong Bash, có một cách xác định đáng tin cậy

a) vị trí kết thúc của phân vùng cuối cùng và
b) không gian không phân chia còn lại sau phân vùng cuối cùng?


1
Ngay cả khi bạn có thể làm điều đó, tôi sẽ không. Hãy tưởng tượng loại thiệt hại mà một lỗi đánh máy có thể gây ra ở đây ...
Joseph R.

Tốt hơn không nên. Trình cài đặt của một số bản phân phối có phân vùng lại và thực sự không phải là một nhiệm vụ đơn giản để viết. Quá nhiều trường hợp góc, quá nhiều thứ bạn có thể gây rối. Đừng làm điều đó. Nếu bạn làm như vậy, hãy để nó tạo ra cấu hình được đề xuất, điều đó phải được nhà điều hành chấp thuận.
peterph

Tôi đồng ý điều này là nguy hiểm. Tuy nhiên đây là một tập lệnh sẽ bắt đầu bằng cách xóa tất cả các phân vùng trên đĩa, do đó, việc làm rối các phân vùng sau đó không phải là vấn đề lớn. Rủi ro duy nhất là người dùng chỉ định đĩa sai, điều này cũng dễ dàng với bất kỳ công cụ phân vùng nào.
Alex

Câu trả lời:


4

partedcó thể in không gian trống. Ví dụ (Tôi đã chọn một mục đích phức tạp):

# 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

Như bạn có thể thấy điều này cung cấp cho bạn trực tiếp vị trí và kích thước của phân vùng mà bạn có thể tạo, tức là dòng cuối cùng nói Free Space. Bạn có thể tạo một phân vùng bắt đầu từ 31115264 và kết thúc vào lúc 31116287.

Nếu không có gì đáng tiếc thì phân vùng mở rộng không đủ lớn!

Nhưng có lẽ bạn đã sử dụng GPT khi bạn không gặp phải các biến chứng như vậy.

Lấy số phải đủ dễ dàng.

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`

Hoặc một cái gì đó tương tự. (Đương nhiên, bạn muốn thực hiện thêm một số kiểm tra về sự tỉnh táo ở đây.)

@swisscheese đã đưa ra một nhận xét tốt trong câu trả lời khác, tôi không biết partedcung cấp đầu ra thân thiện với phân tích cú pháp. Bạn có thể chọn sử dụng thay thế. Ví dụ để lấy miễn phí lớn nhất cuối cùng:

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

Cho dù điều đó có thể áp dụng cho tình huống của bạn hay không (trong ví dụ của tôi, bạn cũng không thể tạo một phân vùng ở đó, nó đã thực sự đầy đủ) là điều bạn phải tự mình tìm ra. :)


Cảm ơn! Để tham khảo, tôi đã sử dụng hàm make_partition của bạn nhưng với các đối số hơi khác nhau: make_partition $ đĩaparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

Thật dễ dàng, mkpartedcó một --listtùy chọn, bạn cần sử dụng awk--listtruy xuất phân vùng cuối cùng và sau đó sử dụng mkpart part-type [fs-type] start end,

Nhưng câu trả lời của bạn:

Lúc đầu, bạn sẽ nhận được tất cả các phân vùng và với:

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

Ghi chú:

  1. Bạn nên chuyển đổi GBsang MG.
  2. Bạn nên sử dụng giá trị cuối cùng của mỗi variable
  3. Bạn nên sử dụng -strong parted commandkịch bản cuối cùng của bạn .

Nếu tôi có thời gian, hãy hoàn thành kịch bản này xin lỗi vì không có thời gian.


Xin chào, bạn đã thực sự chạy các chuỗi lệnh mà bạn đề xuất chưa? Tôi không nghĩ họ làm những gì bạn mong đợi họ làm .. :(
swisscheese

tôi đã cập nhật, xin vui lòng đọc lại.
Tiếng Ba Tư

tùy chọn 2 cũng được thay đổi.
Tiếng Ba Tư

2
Xin chào, ý tôi là, 'parted --list | awk' {print $ 2} 'chỉ là đường ống mù quáng để awk! Nó KHÔNG có được những gì bạn muốn. Bạn nên sử dụng tùy chọn -m để chia tay, cung cấp đầu ra "thân thiện với phân tích cú pháp".
Thụy Điển

1
Không có gì hơn để nói, tốt nhất của may mắn.
Thụy Điển
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.