วิธีสร้างและฟอร์แมตพาร์ติชั่นโดยใช้สคริปต์ทุบตี


62

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

ฉันคิดว่ามันสามารถทำได้ด้วย fdisk แต่ฉันไม่รู้วิธีป้อนคำสั่งจากสคริปต์ bash ลงใน fdisk shell แล้วออกจาก fdisk shell

ฉันต้องการสร้างพาร์ติชันแล้วจัดรูปแบบเป็น ntfs จากภายในทุบตี

คำตอบ:


70

คล้ายกับคำแนะนำก่อนหน้านี้คำสั่ง piping ไปยัง fidsk ฉันพบว่าวิธีนี้มีประโยชน์ในการทิ้งรายละเอียดไว้สำหรับผู้ดูแลที่ตามมา บิต sed ดึงความคิดเห็นทั้งหมดออกก่อนที่ fdisk จะได้รับอินพุต

# to create the partitions programatically (rather than manually)
# we're going to simulate the manual input to fdisk
# The sed script strips off all the comments so that we can 
# document what we're doing in-line with the actual commands
# Note that a blank line (commented as "defualt" will send a empty
# line terminated with a newline to take the fdisk default.
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  o # clear the in memory partition table
  n # new partition
  p # primary partition
  1 # partition number 1
    # default - start at beginning of disk 
  +100M # 100 MB boot parttion
  n # new partition
  p # primary partition
  2 # partion number 2
    # default, start immediately after preceding partition
    # default, extend partition to end of disk
  a # make a partition bootable
  1 # bootable partition is partition 1 -- /dev/sda1
  p # print the in-memory partition table
  w # write the partition table
  q # and we're done
EOF

3
ฉันเห็นด้วยอย่างยิ่ง จัดทำเอกสารงานของคุณเพื่อให้ผู้อื่นอ่าน
Eric Duncan

1
หมายเหตุคุณต้องมีแท็บนำในแต่ละบรรทัด
Stu

2
คุณจะช่วยเตือนว่ามีแท็บที่จำเป็นในแต่ละบรรทัดอักขระคำสั่งตามที่ @Stu พูดถึงหรือไม่ ฉันต้องแก้จุดบกพร่องในขณะเพียงเพราะคัดลอกและวางละเว้นแท็บและแทนที่พวกเขาด้วยช่องว่างดังนั้น regex ไม่ตรงกับบรรทัดคำสั่ง
ceremcem

9
แทนที่จะเป็นคำเตือนเกี่ยวกับแท็บฉันได้แก้ไข sed เพื่อละทิ้งช่องว่างนำหน้า (ไม่ใช่แค่แท็บ) และไม่คาดหวังแท็บหลังจากคำสั่ง fdisk สิ่งนี้ควรตัดและวางดีกว่า @ceremcem - ข้อเสนอแนะที่ดีและขออภัยที่ทำให้คุณดีบักทุกครั้ง
user2070305

3
sfdiskเป็นระบบอัตโนมัติที่เป็นมิตรมากกว่าfdisk
spuder

64

sfdisk

sfdisk เป็นเวอร์ชัน Scripted ของ fdisk

มันเป็นส่วนหนึ่งutil-linuxเช่นเดียวกับfdiskเพื่อให้พร้อมใช้งานควรจะเหมือนกัน

ตารางพาร์ติชันที่มีพาร์ติชันเดียวที่สามารถใช้ทั้งดิสก์ได้สามารถสร้างได้ด้วย:

echo 'type=83' | sudo sfdisk /dev/sdX

และตารางพาร์ติชันที่ซับซ้อนมากขึ้นได้อธิบายไว้ด้านล่าง

ในการสร้างตัวอย่างสคริปต์รับการตั้งค่าหนึ่งในดิสก์ของคุณ:

sudo sfdisk -d /dev/sda > sda.sfdisk

ตัวอย่างผลลัพธ์ของ Lenovo T430 Windows 7 / Ubuntu ดูอัลบูต:

label: dos
label-id: 0x7ddcbf7d
device: /dev/sda
unit: sectors

/dev/sda1 : start=        2048, size=     3072000, type=7, bootable
/dev/sda2 : start=     3074048, size=   195430105, type=7
/dev/sda3 : start=   948099072, size=    28672000, type=7
/dev/sda4 : start=   198504446, size=   749594626, type=5
/dev/sda5 : start=   198504448, size=   618891264, type=83
/dev/sda6 : start=   940277760, size=     7821312, type=82
/dev/sda7 : start=   817397760, size=    61437952, type=83
/dev/sda8 : start=   878837760, size=    61437500, type=83

เมื่อคุณบันทึกสคริปต์ลงในไฟล์แล้วคุณสามารถนำไปใช้sdXกับ:

sudo sfdisk /dev/sdX < sda.sfdisk

สำหรับsfdiskอินพุตคุณสามารถละเว้นชื่ออุปกรณ์และใช้บรรทัดประเภท:

start=        2048, size=     3072000, type=7, bootable

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

คำอธิบายบางอย่าง:

  • บรรทัดส่วนหัว: ตัวเลือกทั้งหมด:
    • label: ประเภทของตารางพาร์ทิชัน dos(MBR)เป็นรุ่นเก่าที่ได้รับการสนับสนุนอย่างกว้างขวางgptสิ่งใหม่ที่เป็นประกาย
    • unit: sectorรองรับเท่านั้น 1 ส่วนมักเท่ากับ 512 ไบต์ ค้นหาด้วยcat /sys/block/sda/queue/hw_sector_sizeดูเพิ่มเติมที่: https://unix.stackexchange.com/questions/2668/finding-the-sector-size-of-a-partition
    • device: ข้อมูลเท่านั้นฉันคิดว่า
  • สายพาร์ทิชัน:

    • start: offset ภายในดิสก์ที่พาร์ติชันเริ่มทำงาน

      start มีค่าเริ่มต้นที่ดีมากและมักจะเป็น ommited:

      • ในบรรทัดแรกstartคือ 2048 เช่น 1Mb (2048 + 512) ซึ่งเป็นค่าเริ่มต้นที่มีสติสำหรับความเข้ากันได้ของดิสก์
      • startเริ่มต้นต่อไปยังตำแหน่งที่ไม่ได้ถูกจัดสรรแรก
    • size: พูดว่า:man sfdisk The default value of size indicates "as much as possible"ดังนั้นเมื่อต้องการเติมดิสก์ด้วยพาร์ติชันเดียวให้ใช้:/dev/sda : start=2048, type=83

    • type: ไบต์มายากลที่เก็บไว้ในบูตเซกเตอร์สำหรับแต่ละรายการพาร์ทิชัน ค่าที่เป็นไปได้: https://en.wikipedia.org/wiki/Partition_typeในตัวอย่างนี้เราสังเกต:
      • 7( sda1, 2และ3): ระบบไฟล์ที่รองรับ Windows สิ่ง Windows ที่ติดตั้งไว้ล่วงหน้าและพาร์ติชันการกู้คืนของ Lenovo sudo blkidป้ายกำกับช่วยในการระบุ
      • 5( sda4): พาร์ติชันหลักแบบขยายซึ่งจะมีโลจิคัลพาร์ติชันอื่น (เนื่องจากเราสามารถมีได้เพียง 4 พาร์ติชันหลักที่มี MBR)
      • 83( sda5, 7และ8): พาร์ติชันที่ Linux รองรับ สำหรับฉันหนึ่งhomeและสองรูทที่มีเวอร์ชัน Ubuntu แตกต่างกัน
      • 82( sd6): swap

fdiskยังสามารถอ่านsfdiskสคริปต์ด้วยIคำสั่งที่ "แหล่งที่มา" พวกเขาในช่วงfdiskเซสชั่นแบบโต้ตอบช่วยให้คุณปรับแต่งเพิ่มเติมก่อนที่จะเขียนพาร์ทิชัน

ทดสอบบน Ubuntu 16.04, sfdisk2.27.1

จัดรูปแบบและเติมพาร์ติชันไฟล์ภาพโดยไม่ต้อง sudo

นี่เป็นวิธีที่ดีในการเรียนรู้การใช้งานsfdiskโดยไม่ทำให้ฮาร์ดดิสก์ของคุณเสียหาย: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- สิทธิ์เข้า / 52850819 # 52850819


4
OMG มันยอดเยี่ยมมาก ฉันเคยใช้ fdisk มาก่อน แต่ถ้าคุณบังเอิญลงจอดตรงที่มีพาร์ติชั่นอยู่แล้วมันจะต้องการการยืนยันจากผู้ใช้ว่าโดยปกติแล้วมันไม่ต้องการซึ่งมันแย่มาก sfdisk วิเศษมากขอบคุณ!
TaborKelly

3
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
shrewmouse

55

fdiskอ่านจากstdinดังนั้นคุณก็จำเป็นต้องให้อาหารมันคำสั่งที่เหมาะสม ตัวอย่างเช่นต่อไปนี้ล้างตารางพาร์ติชันหากมีหนึ่งและทำให้ใหม่ที่มีพาร์ทิชันเดียวที่; ดิสก์ทั้งหมด:

(
echo o # Create a new empty DOS partition table
echo n # Add a new partition
echo p # Primary partition
echo 1 # Partition number
echo   # First sector (Accept default: 1)
echo   # Last sector (Accept default: varies)
echo w # Write changes
) | sudo fdisk

ฉันขอแนะนำให้คุณทำงานที่คุณต้องการบันทึกสิ่งที่คุณพิมพ์เพื่อให้คุณสามารถทำซ้ำได้


4
ในขณะที่ verbose เพิ่มเติมด้วยคำสั่ง echo กว่าคำตอบที่ยอมรับนี้ดูเหมือนว่าน้อยขลังและ obfuscated
Henry Heikkinen

1
โดยส่วนตัวฉันจะแนะนำให้ใช้printfแทนที่จะechoเป็นนิสัยในการใช้สิ่งที่ทำงานข้ามระบบอย่างสม่ำเสมอ
vastlysuperiorman

37

คุณสามารถทำได้ด้วยคำสั่งเพียงไม่กี่คำใช้ intros \ nแทนที่จะใช้ echos หลายตัว

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda

นี่มันสั้นกว่าคนอื่น ๆ แต่น่าเสียดายที่ดูเหมือนว่าจะใช้ได้กับการทุบตีเท่านั้น
bk138

มันทำงานกับขี้เถ้า / ไม่ว่างด้วย
kikeenrique

2
เป็น\nสิ่งจำเป็นอื่นหลังจากw?
Qian Chen

6
ใช้งานได้ แต่น่ากลัว :-)
Ciro Santilli 新疆改造中心法轮功六四事件

2
@ElgsQianChen: ไม่เพราะechoโดยอัตโนมัติยุติบรรทัดที่มีการขึ้นบรรทัดใหม่ (ถ้า-nตัวเลือกใช้)
Udo G

5

fdiskคุณสามารถสคริปต์

(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc

ที่สร้างพาร์ติชัน 200 MB ขึ้นไป /dev/sdc


คำตอบที่สง่างาม!
Gangadhar Jannu

5

การไพพ์คำสั่งไปยัง fdisk นั้นทำงานได้ดีเหมือนที่คนอื่นอธิบาย แต่วิธีนี้ดูดีและอ่านง่ายขึ้น:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

การไพพ์จากไฟล์ (ชั่วคราว) ก็ใช้งานได้:

fdisk /dev/sdc < /tmp/fdisk.cmds

อันนี้ได้รับการโหวตของฉัน มันสะอาดและไม่เสียกับการวิจารณ์
David Betz

5

สร้าง gpt disklabel ชนิดใหม่:

sudo /sbin/parted /dev/xvdf mklabel gpt --script

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

sudo /sbin/parted /dev/xvdf mkpart primary 0% 100% --script


ขอบคุณนี่เป็นคำตอบเดียวที่สะอาดสำหรับฉันเพราะมันไม่ได้รวมท่อ "space opera.docx" กับ fdisk
Benibr

1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda

2
ข้อผิดพลาดทั่วไปที่ผู้ใช้รายใหม่ทำคือการตอบโดยไม่มีรายละเอียดของวิธีการแก้ไขปัญหาจริง คำตอบควรมีรายละเอียดและรวมถึงการอ้างอิงตามความจำเป็น โปรดสละเวลาสักครู่เพื่อแก้ไขคำตอบของคุณเพื่อรวมรายละเอียดว่าทำไมคำตอบของคุณถึงถูกต้อง หากคุณต้องการความช่วยเหลือโปรดอ่านฉันจะเขียนคำตอบที่ดีได้อย่างไร . นอกจากนี้โปรดตระหนักว่าคุณได้โพสต์คำตอบสำหรับคำถามเก่า ๆ ที่มีคำตอบที่ยอมรับแล้ว แม้ว่าจะมีข้อผิดพลาดเกิดขึ้น แต่คุณอาจไม่ได้รับการตอบกลับจาก OP
CharlieRB

1
สิ่งนี้แตกต่างจาก: superuser.com/a/739586/128124หรือไม่
Ciro Santilli 新疆改造中心法轮功六四事件

0

สคริปต์ใช้fdiskเพื่อสร้างพาร์ติชั่นตามคำตอบของคนอื่น

เปลี่ยนสิ่งต่อไปนี้ในสคริปต์:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

ตัวอย่างการใช้งานจะได้รับหลังจากสคริปต์

#!/bin/bash
if [ $# -eq 0 ]
then
  echo "input the device"
  exit
fi

NUM_PARTITIONS=5
PARTITION_SIZE="+10G"    

SED_STRING="o"
TAIL="p
w
q
"

NEW_LINE="
"
LETTER_n="n"
EXTENDED_PART_NUM=4
TGTDEV=$1

SED_STRING="$SED_STRING$NEW_LINE"
for i in $(seq $NUM_PARTITIONS)
do
  if [ $i -lt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -eq $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE"
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -gt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
done
SED_STRING="$SED_STRING$TAIL"

sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

ทำงานด้วย:

sudo sh mk_partition.sh / dev / sdxxx


-2
#!/bin/sh
hdd="/dev/hda /dev/hdb /dev/hdc"
for i in $hdd;do
echo "n
p
1


w
"|fdisk $i;mkfs.ext3 "$i1";done 

คุณสามารถใช้สคริปต์นี้ เพียงให้แน่ใจว่าคุณกำหนดพาร์ทิชันของคุณเองที่hddกำหนด มีช่องว่าง 2 ช่องระหว่าง1และw; พวกเขาต้องอยู่ที่นั่นเพื่อรับค่าเริ่มต้น

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