โปรแกรมแบ่งพาร์ติชันดิสก์


10

ฉันกำลังพยายามสร้างสคริปต์ทุบตีซึ่งจะสร้างพาร์ติชันใหม่ด้วยระบบไฟล์บนดิสก์ที่มีพาร์ติชันที่มีอยู่

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

ฉันไม่ต้องการพึ่งพาดิสก์ที่มีพาร์ติชันในตำแหน่ง / ขนาดเฉพาะ นั่นคือฉันต้องการสร้างพาร์ติชันใหม่เริ่มทันทีหลังจากพาร์ทิชันที่มีอยู่ล่าสุด ฉันต้องการที่จะสามารถสร้างพาร์ทิชันทั้งขนาดคงที่หรือเพื่อเติมเต็มพื้นที่ที่เหลือ

ใน Bash มีวิธีการกำหนดที่เชื่อถือได้

ก) ตำแหน่งสุดท้ายของพาร์ติชั่นสุดท้ายและ
b) พื้นที่ที่ไม่ได้แบ่งพาร์ติชั่นที่เหลือหลังจากพาร์ติชั่นสุดท้าย?


1
แม้ว่าคุณสามารถทำได้ฉันก็ไม่ทำ ลองนึกภาพชนิดของความเสียหายที่พิมพ์ผิดสามารถทำได้ที่นี่ ...
โจเซฟอาร์

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

ฉันยอมรับว่ามันอันตราย อย่างไรก็ตามนี่เป็นสคริปต์ที่จะเริ่มต้นด้วยการลบพาร์ติชั่นทั้งหมดในดิสก์ดังนั้นการทำพาร์ติชั่นในภายหลังจึงไม่เป็นเรื่องใหญ่ ความเสี่ยงเพียงอย่างเดียวคือผู้ใช้ระบุดิสก์ที่ไม่ถูกต้องซึ่งทำได้ง่ายด้วยเครื่องมือพาร์ติชั่น
อเล็กซ์

คำตอบ:


4

partedสามารถพิมพ์พื้นที่ว่าง ตัวอย่าง (ฉันเลือกวัตถุประสงค์ที่ซับซ้อน):

# 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

Free Spaceที่คุณสามารถดูนี้จะช่วยให้คุณโดยตรงตำแหน่งและขนาดของพาร์ทิชันที่คุณอาจจะไม่สามารถที่จะสร้างเช่นบรรทัดสุดท้ายมากที่บอกว่า คุณสามารถสร้างพาร์ติชันที่เริ่มต้นที่ 31115264s และสิ้นสุดที่ 31116287s

ถ้าไม่ใช่เพราะหลุมพรางที่พาร์ติชั่นเสริมนั้นไม่ใหญ่พอ!

แต่บางทีคุณอาจใช้ GPT แล้วซึ่งคุณไม่ต้องทนทุกข์ทรมานจากภาวะแทรกซ้อนดังกล่าว

การหยิบตัวเลขควรง่ายพอ

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`

หรือสิ่งที่คล้ายกัน (โดยปกติคุณต้องการตรวจสุขภาพเพิ่มเติมที่นี่)

@swisscheese แสดงความคิดเห็นที่ดีในคำตอบอื่น ๆ ฉันไม่ทราบว่าการpartedเสนอผลงานเป็นมิตรแยก คุณอาจเลือกที่จะใช้สิ่งนั้นแทน ตัวอย่างสำหรับการคว้าฟรีที่ใหญ่ที่สุดล่าสุด:

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

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


ขอบคุณ! สำหรับการอ้างอิงฉันใช้ฟังก์ชั่น make_partition ของคุณ แต่มีข้อโต้แย้งที่แตกต่างกันเล็กน้อย: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

มันเป็นเรื่องง่ายmkpartedมี --listตัวเลือกที่คุณจะต้องใช้awk และ--listเพื่อดึงพาร์ทิชันที่ผ่านมาและจากนั้นใช้mkpart part-type [fs-type] start end,

แต่คำตอบของคุณ:

ตอนแรกคุณควรได้พาร์ติชั่นทั้งหมดและ:

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

หมายเหตุ:

  1. คุณควรจะแปลงไปGBMG
  2. คุณควรใช้ค่าสุดท้ายของแต่ละอัน variable
  3. คุณควรใช้-sในparted commandสคริปต์สุดท้ายของคุณ

หากฉันมีเวลาให้เขียนสคริปต์นี้ให้สมบูรณ์เพราะไม่มีเวลา


สวัสดีคุณเรียกใช้ลำดับคำสั่งที่คุณแนะนำจริงหรือไม่? ฉันไม่คิดว่าพวกเขาทำในสิ่งที่คุณคาดหวังว่าพวกเขาจะทำ .. :(
swisscheese

ฉันอัพเดทแล้วกรุณาอ่านใหม่
PersianGulf

ตัวเลือก 2 ก็เปลี่ยนแปลงเช่นกัน
PersianGulf

2
สวัสดีสิ่งที่ฉันหมายถึงคือ 'แยก --list | awk' {print $ 2} 'เป็นเพียงการสุ่มสี่สุ่มห้าไปยัง awk! ไม่ได้สิ่งที่คุณต้องการ คุณควรใช้ตัวเลือก -m เพื่อแยกส่วนซึ่งมีเอาต์พุต "เป็นมิตรกับแจง"
วิสเชเซ

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