Làm cách nào để tạo và định dạng phân vùng bằng tập lệnh bash?


59

Có cách nào để tạo và định dạng phân vùng bằng cách sử dụng tập lệnh bash không?

Tôi nghĩ rằng nó có thể được thực hiện với fdisk nhưng tôi không biết cách đưa các lệnh từ tập lệnh bash vào trình bao fdisk sau đó thoát khỏi trình bao fdisk.

Tôi muốn tạo một phân vùng sau đó định dạng nó thành ntfs từ bên trong bash.

Câu trả lời:


69

Tương tự như các đề xuất trước đây, các lệnh đường ống đến fidsk, tôi thấy cách tiếp cận này hữu ích để để lại chi tiết cho các nhà bảo trì tiếp theo. Các bit sed loại bỏ tất cả các ý kiến ​​trước khi fdisk nhận được đầu vào.

# 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
Tôi hoàn toàn đồng ý. Tài liệu công việc của bạn cho người khác đọc.
Eric Duncan

1
Lưu ý bạn phải có một tab hàng đầu trên mỗi dòng.
Stu

2
Bạn có phiền khi đặt một cảnh báo lớn rằng một tab được yêu cầu trên mỗi dòng ký tự lệnh như @Stu đã đề cập không? Tôi đã phải gỡ lỗi trong một thời gian chỉ vì sao chép và dán bỏ qua các tab và thay thế chúng bằng khoảng trắng, do đó regex không khớp với các dòng lệnh.
ceremcem

9
Thay vì cảnh báo về các tab, tôi đã sửa đổi sed để loại bỏ khoảng trắng hàng đầu (không chỉ các tab) và không mong đợi một tab sau các lệnh fdisk. Điều này nên cắt và dán tốt hơn. @ceremcem - Phản hồi tốt và xin lỗi đã gây ra cho bạn bất kỳ thời gian gỡ lỗi nào.
dùng2070305

3
sfdiskthân thiện với tự động hóa hơnfdisk
spuder 2/2/2017

59

sfdisk

sfdisk là phiên bản kịch bản của fdisk

Nó là một phần củautil-linux , giống như fdisk, vì vậy tính khả dụng nên giống nhau.

Một bảng phân vùng với một phân vùng duy nhất lấy toàn bộ đĩa có thể được tạo bằng:

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

và các bảng phân vùng phức tạp hơn được giải thích dưới đây.

Để tạo tập lệnh mẫu, hãy thiết lập một trong các đĩa của bạn:

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

Đầu ra mẫu trên khởi động kép Lenovo T430 Windows 7 / Ubuntu của tôi:

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

Khi bạn đã lưu tập lệnh vào một tệp, bạn có thể áp dụng tập lệnh đó sdXvới:

sudo sfdisk /dev/sdX < sda.sfdisk

Đối với sfdiskđầu vào, bạn chỉ có thể bỏ qua tên thiết bị và sử dụng các dòng loại:

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

Chúng chỉ bị bỏ qua nếu có và tên thiết bị được lấy từ đối số dòng lệnh.

Một số giải thích:

  • dòng tiêu đề: tất cả tùy chọn:
  • dòng phân vùng:

    • start: offset bên trong đĩa mà phân vùng bắt đầu.

      start có mặc định rất tốt và thường có thể bị bỏ qua:

      • trên dòng đầu tiên, startlà 2048, tức là 1Mb (2048 + 512), là mặc định lành mạnh cho khả năng tương thích đĩa
      • tiếp tục startmặc định cho vị trí chưa được phân bổ đầu tiên
    • size: man sfdisknói : The default value of size indicates "as much as possible". Vì vậy, để lấp đầy đĩa với một phân vùng duy nhất sử dụng:/dev/sda : start=2048, type=83

    • type: byte ma thuật được lưu trữ trên khu vực khởi động cho mỗi mục phân vùng . Các giá trị có thể có: https://en.wikipedia.org/wiki/Partition_type Trong ví dụ này, chúng tôi quan sát:
      • 7( sda1, 23): hệ thống tập tin mà Windows hỗ trợ. Công cụ Windows được cài đặt sẵn và phân vùng phục hồi Lenovo. sudo blkidnhãn giúp xác định chúng.
      • 5( sda4): phân vùng chính mở rộng, sẽ chứa các phân vùng logic khác (vì chúng tôi chỉ có thể có 4 phân vùng chính với MBR)
      • 83( sda5, 78): các phân vùng mà Linux hỗ trợ. Đối với tôi một homevà hai gốc với các phiên bản Ubuntu khác nhau
      • 82( sd6): hoán đổi

fdiskcũng có thể đọc sfdiskcác tập lệnh bằng Ilệnh, "nguồn" chúng trong một fdiskphiên tương tác , cho phép bạn tùy chỉnh thêm trước khi viết phân vùng.

Đã thử nghiệm trên Ubuntu 16.04, sfdisk2.27.1.

Định dạng và điền vào các phân vùng một tệp hình ảnh mà không có sudo

Đây là một cách tốt để học cách sử dụng sfdiskmà không làm hỏng đĩa cứng của bạn: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- đặc quyền / 52850819 # 52850819


2
OMG điều này là tuyệt vời. Tôi đã sử dụng fdisk trước đây nhưng nếu bạn vô tình hạ cánh chính xác nơi đã có phân vùng, nó sẽ muốn xác minh từ người dùng mà nó không thường yêu cầu, điều đó thật tệ. sfdisk là tuyệt vời, cảm ơn bạn!
TaborKelly

2
Đây phải là câu trả lời được chấp nhận
shrewmouse

55

fdiskđọc từ stdin vì vậy bạn chỉ cần cung cấp cho nó các lệnh thích hợp. Ví dụ, phần sau sẽ xóa bảng phân vùng, nếu có một bảng và tạo một bảng mới có một phân vùng duy nhất là; toàn bộ đĩa:

(
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

Tôi khuyên bạn nên thực hiện công việc bạn muốn, ghi lại những gì bạn nhập để bạn có thể sao chép nó.


4
Mặc dù dài dòng hơn một chút với các lệnh echo so với câu trả lời được chấp nhận, nhưng điều này có vẻ ít ma thuật và khó hiểu hơn nhiều.
Henry Heikkinen

1
Cá nhân tôi sẽ đề nghị sử dụng printfthay vì echochỉ theo thói quen sử dụng một cái gì đó hoạt động nhất quán trên các hệ thống.
differlysuperiorman

37

Bạn có thể làm điều đó chỉ với một vài lệnh, sử dụng intros \ n thay vì nhiều echos.

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

Điều này là ngắn gọn hơn những người khác, nhưng tiếc là dường như chỉ hoạt động với bash.
bk138

Nó cũng hoạt động với ash / busybox.
kikeenrique

2
Là một \ncần thiết sau khi w?
Qian Chen

6
Điều này hoạt động, nhưng thật kinh khủng :-)
Ciro Santilli 改造 心 心 六四

2
@ElgsQianChen: không, vì echotự động chấm dứt dòng với một dòng mới (trừ khi -nsử dụng tùy chọn)
Udo G

5

Bạn có thể viết kịch bản fdisk.

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

Điều đó tạo ra một phân vùng 200 MB trên /dev/sdc


Câu trả lời tao nhã!
Gangadhar Jannu

5

Các lệnh đường ống đến fdisk hoạt động tốt như được giải thích bởi những người khác, nhưng cách này thanh lịch và dễ đọc hơn một chút:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

Đường ống từ một tệp (tạm thời) cũng hoạt động:

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

Điều này nhận được phiếu bầu của tôi. Nó sạch sẽ và không bị ô nhiễm với một bài bình luận đang chạy.
David Betz

5

Tạo một loại đĩa mới gpt:

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

Phân vùng đĩa:

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


Cảm ơn bạn, đây là giải pháp sạch duy nhất đối với tôi vì nó không bao gồm đường ống một số loại "không gian opera.docx" đến fdisk.
Benibr

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

2
Một lỗi phổ biến mà người dùng mới mắc phải là trả lời mà không có chi tiết về cách thực sự giải quyết vấn đề. Câu trả lời nên được chi tiết và bao gồm các tài liệu tham khảo, khi cần thiết. Vui lòng dành vài phút để chỉnh sửa câu trả lời của bạn để bao gồm chi tiết lý do tại sao câu trả lời của bạn hợp lệ. Nếu bạn cần giúp đỡ, hãy đọc Làm thế nào để tôi viết một câu trả lời hay? . Ngoài ra, xin vui lòng nhận ra rằng bạn đã đăng một câu trả lời cho một câu hỏi rất cũ trong đó có một câu trả lời được chấp nhận. Mặc dù không có gì sai khi làm như vậy, nhưng bạn có thể không nhận được phản hồi từ OP.
CharlieRB

1
Điều này có khác với: superuser.com/a/739586/128124 không?
Ciro Santilli 心 心

0

Kịch bản sử dụng fdisk để tạo partitons dựa trên câu trả lời của người khác.

Thay đổi nội dung sau trong tập lệnh:

NUM_PARTITIONS = 5

PHẦN THAM GIA = "+ 10G"

Sử dụng ví dụ được đưa ra sau kịch bản.

#!/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

chạy với:

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 

Bạn có thể sử dụng tập lệnh này. Chỉ cần chắc chắn rằng bạn xác định phân vùng của riêng bạn, nơi hddđược xác định. Có 2 khoảng trống giữa 1w; họ cần phải ở đó để lấy các giá trị mặc định.

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.