Bagaimana cara membuat dan memformat partisi menggunakan skrip bash?

62

Apakah ada cara untuk membuat dan memformat partisi menggunakan skrip bash?

Saya pikir itu bisa dilakukan dengan fdisk tapi saya tidak tahu bagaimana memberi makan perintah dari skrip bash ke shell fdisk kemudian keluar dari shell fdisk.

Saya ingin membuat partisi kemudian memformatnya ke ntfs dari dalam bash.

GlassGhost
sumber

Jawaban:

70

Mirip dengan saran sebelumnya, perintah piping ke fidsk, saya menemukan pendekatan ini berguna untuk meninggalkan detail untuk pengelola berikutnya. Bit sed menghapus semua komentar sebelum fdisk mendapatkan input.

# 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
pengguna2070305
sumber
3
Saya sangat setuju. Dokumentasikan pekerjaan Anda untuk dibaca orang lain.
Eric Duncan
1
Perhatikan bahwa Anda harus memiliki tab utama di setiap baris.
Stu
2
Maukah Anda menempatkan peringatan besar bahwa tab diperlukan pada setiap baris karakter perintah seperti yang disebutkan @Stu? Saya harus men-debug untuk sementara waktu hanya karena copy-and-paste mengabaikan tab dan menggantinya dengan spasi, sehingga regex tidak cocok dengan baris perintah.
ceremcem
9
Alih-alih peringatan tentang tab, saya telah memodifikasi sed untuk membuang spasi putih (bukan hanya tab) dan tidak mengharapkan tab setelah perintah fdisk. Ini harus memotong dan menempel lebih baik. @ceremcem - umpan balik yang baik dan maaf telah menyebabkan Anda memiliki waktu debug.
user2070305
3
sfdisklebih ramah otomatisasi daripadafdisk
spuder
65

sfdisk

sfdisk adalah versi Script dari fdisk

Itu adalah bagian dariutil-linux , sama seperti fdisk, jadi ketersediaannya harus sama.

Tabel partisi dengan satu partisi yang mengambil seluruh disk dapat dibuat dengan:

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

dan tabel partisi yang lebih kompleks dijelaskan di bawah ini.

Untuk membuat skrip contoh, dapatkan penyetelan salah satu disk Anda:

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

Contoh hasil pada dual boot Lenovo T430 Windows 7 / Ubuntu saya:

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

Setelah skrip disimpan ke file, Anda dapat menerapkannya sdXdengan:

sudo sfdisk /dev/sdX < sda.sfdisk

Untuk sfdiskinput, Anda bisa menghilangkan nama perangkat, dan menggunakan garis tipe:

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

Mereka hanya diabaikan jika ada, dan nama perangkat diambil dari argumen baris perintah.

Beberapa penjelasan:

  • baris tajuk: semua opsional:
  • garis partisi:

    • start: offset di dalam disk tempat partisi dimulai.

      start memiliki standar yang sangat baik, dan sering dapat dinonaktifkan:

      • pada baris pertama, startadalah 2048, yaitu 1Mb (2048 + 512), yang merupakan standar waras untuk kompatibilitas disk
      • lebih lanjut startdefault ke posisi tidak terisi pertama
    • size: man sfdiskMengatakan: The default value of size indicates "as much as possible". Jadi untuk mengisi disk dengan menggunakan satu partisi:/dev/sda : start=2048, type=83

    • type: byte ajaib disimpan di sektor boot untuk setiap entri partisi . Nilai yang mungkin: https://en.wikipedia.org/wiki/Partition_type Pada contoh ini kita amati:
      • 7( sda1, 2dan 3): sistem file yang didukung Windows. Barang-barang Windows yang sudah diinstal sebelumnya dan partisi pemulihan Lenovo. sudo blkidlabel membantu mengidentifikasi mereka.
      • 5( sda4): extended primary partisi, yang akan berisi partisi logical lainnya (karena kita hanya dapat memiliki 4 partisi primary dengan MBR)
      • 83( sda5,, 7dan 8): partisi yang didukung Linux. Bagi saya satu home, dan dua root dengan versi Ubuntu yang berbeda
      • 82( sd6): swap

fdiskjuga dapat membaca sfdiskskrip dengan Iperintah, yang "sumber" mereka selama fdisksesi interaktif , memungkinkan Anda penyesuaian lebih lanjut sebelum menulis partisi.

Diuji pada Ubuntu 16.04, sfdisk2.27.1.

Format dan isi partisi tanpa file gambar sudo

Ini adalah cara yang baik untuk belajar menggunakan sfdisktanpa meledakkan hard disk Anda: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- hak istimewa / 52850819 # 52850819

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
4
OMG ini luar biasa. Saya telah menggunakan fdisk sebelumnya, tetapi jika Anda secara tidak sengaja mendarat tepat di mana sudah ada partisi, ia akan membutuhkan verifikasi dari pengguna yang biasanya tidak diperlukan, yang menyebalkan. sfdisk luar biasa, terima kasih!
TaborKelly
3
Ini seharusnya jawaban yang diterima
shrewmouse
55

fdiskmembaca dari stdin sehingga Anda hanya perlu memberinya perintah yang sesuai. Misalnya, berikut ini membersihkan tabel partisi, jika ada, dan membuat yang baru yang memiliki partisi tunggal yaitu; seluruh disk:

(
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

Saya sarankan Anda melakukan tugas yang Anda inginkan, merekam apa yang Anda ketik sehingga Anda dapat mereproduksinya.

e40
sumber
4
Meskipun sedikit lebih verbose dengan perintah gema daripada jawaban yang diterima, ini tampaknya jauh kurang ajaib dan dikaburkan.
Henry Heikkinen
1
Saya pribadi akan menyarankan penggunaan printfbukan echohanya menjadi kebiasaan menggunakan sesuatu yang berperilaku konsisten di seluruh sistem.
vastlysuperiorman
37

Anda dapat melakukannya hanya dengan beberapa perintah, gunakan intro \ n alih-alih beberapa gema.

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
kikeenrique
sumber
Ini lebih singkat daripada yang lain, tetapi sayangnya tampaknya hanya bekerja dengan bash.
bk138
Ini bekerja dengan ash / busybox juga.
kikeenrique
2
Apakah \ndiperlukan lagi setelah w?
Qian Chen
6
Ini bekerja, tetapi mengerikan :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
2
@ ElgsQianChen: tidak, karena echosecara otomatis mengakhiri garis dengan baris baru (kecuali jika -nopsi digunakan)
Udo G
5

Anda bisa skrip fdisk.

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

Itu menciptakan partisi 200 MB pada /dev/sdc

ron
sumber
Jawaban elegan!
Gangadhar Jannu
5

Perintah piping ke fdisk berfungsi dengan baik seperti yang dijelaskan oleh orang lain, tetapi cara ini sedikit lebih elegan dan mudah dibaca:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

Pemipaan dari file (sementara) juga berfungsi:

fdisk /dev/sdc < /tmp/fdisk.cmds
sinar
sumber
Yang ini mendapat suara saya. Ini bersih dan tidak tercemar dengan komentar berjalan.
David Betz
5

Buat disklabel tipe baru gpt:

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

Partisi disk:

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

Bruce Davis
sumber
Terima kasih, ini adalah satu-satunya solusi bersih bagi saya karena itu tidak termasuk pemipaan semacam "space opera.docx" ke fdisk.
Benibr
1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
Diego Roberto Dos Santos
sumber
2
Kesalahan umum yang dilakukan pengguna baru adalah menjawab tanpa rincian tentang bagaimana sebenarnya menyelesaikan masalah. Jawaban harus rinci dan termasuk referensi, sesuai kebutuhan. Harap luangkan beberapa menit untuk mengedit jawaban Anda untuk memasukkan perincian mengapa jawaban Anda valid. Jika Anda butuh bantuan, baca Bagaimana cara saya menulis jawaban yang baik? . Selain itu, harap perhatikan bahwa Anda telah mengirim jawaban untuk pertanyaan yang sangat lama yang memiliki jawaban yang diterima. Meskipun ada yang salah dengan melakukan hal itu, Anda mungkin tidak mendapatkan respons dari OP.
CharlieRB
1
Apakah ini berbeda dengan: superuser.com/a/739586/128124 ?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
0

Script menggunakan fdisk untuk membuat partitons berdasarkan jawaban orang lain.

Ubah yang berikut dalam skrip:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

Contoh penggunaan diberikan setelah skrip.

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

jalankan dengan:

sudo sh mk_partition.sh / dev / sdxxx

Paul Justin
sumber
-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 

Anda dapat menggunakan skrip ini. Pastikan Anda mendefinisikan partisi Anda sendiri di mana hdddidefinisikan. Ada 2 ruang kosong antara 1dan w; mereka harus ada di sana untuk mengambil nilai default.

Shailesh Sutar
sumber