Bir bash betiği kullanarak bir bölüm nasıl oluşturulur ve biçimlendirilir?


62

Bir bash betiği kullanarak bir bölüm oluşturmak ve biçimlendirmek için herhangi bir yolu var mı?

Fdisk ile yapılabileceğini düşünüyorum ama bash betiğinden komutları fdisk kabuğuna nasıl besleyeceğimi bilmiyorum, sonra fdisk kabuğundan çıkın.

Bir bölüm oluşturmak istiyorum ve bunu bash içinden ntfs ile biçimlendirmek istiyorum.

Yanıtlar:


70

Önceki önerilere benzer şekilde, fidsk'e yönlendirme komutları gibi, bu yaklaşımı müteakip bakımcılara ayrıntı bırakmak için faydalı buldum. Fdisk giriş yapmadan önce sed bit tüm yorumları çıkarır.

# 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
Tamamen katılıyorum. Çalışmanızı başkalarının okuması için belgeleyin.
Eric Duncan

1
Her satırda bir satır sekmesi olması gerektiğini unutmayın.
Stu

2
Eğer bir yerleştirerek misiniz büyük uyarı @Stu belirtildiği gibi bir sekme her komut karakteri satırında gerekli olduğunu? Bir süre hata ayıklamak zorunda kaldım, çünkü kopyala ve yapıştır sekmeleri yok sayar ve boşluklarla değiştirir, böylece regex komut satırlarıyla eşleşmez.
ceremcem

9
Sekmeler hakkında bir uyarı yapmak yerine, baştaki boşlukları (sadece sekmeler değil) silmek için sed'i değiştirdim ve fdisk komutlarından sonra bir sekme beklemedim. Bu daha iyi kesmeli ve yapıştırmalıdır. @ceremcem - iyi geribildirim ve size herhangi bir hata ayıklama zamanı neden olduğu için özür dilerim.
user2070305,

3
sfdiskdaha otomasyon dostudurfdisk
spuder

64

sfdisk

sfdisk Scripted sürümüdür fdisk

Bunun bir parçasıutil-linux , aynen olduğu gibi fdisk, kullanılabilirlik aynı olmalı.

Tüm diski alan tek bir bölüm içeren bir bölüm tablosu ile oluşturulabilir:

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

ve daha karmaşık bölümleme tabloları aşağıda açıklanmaktadır.

Örnek bir komut dosyası oluşturmak için disklerinizden birinin kurulumunu yapın:

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

Lenovo T430 Windows 7 / Ubuntu çift önyüklememdeki örnek çıktı:

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

Komut dosyasını bir dosyaya kaydettikten sonra, sdXşununla uygulayabilirsiniz :

sudo sfdisk /dev/sdX < sda.sfdisk

İçin sfdiskgirdi, sadece cihaz adları ihmal ve türün hatlarını kullanabilirsiniz:

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

Varsa yok sayılırlar ve aygıt adı komut satırı argümanından alınır.

Bazı açıklamalar:

  • başlık satırları: tümü isteğe bağlı:
  • bölümleme hatları:

    • start: bölümün başladığı diskin içindeki ofset.

      start çok iyi varsayılanlara sahiptir ve çoğu zaman ihmal edilebilir:

      • ilk satırda start2048, yani 1Mb (2048 + 512).
      • startilk ayrılmamış pozisyon için daha fazla varsayılan
    • size: man sfdiskDiyor ki: The default value of size indicates "as much as possible". Bu yüzden diski tek bir bölüm kullanımıyla doldurmak için:/dev/sda : start=2048, type=83

    • type: her bölüm girişi için önyükleme sektöründe depolanan sihirli bayt . Olabilecek değerler: https://en.wikipedia.org/wiki/Partition_type Bu örnekte şunları gözlemliyoruz:
      • 7( sda1, 2ve 3): Windows'un desteklediği dosya sistemleri. Önceden yüklenmiş Windows eşyaları ve Lenovo kurtarma bölümleri. sudo blkidetiketler onları tanımlamaya yardımcı olur.
      • 5( sda4): diğer mantıksal bölümleri içerecek olan genişletilmiş birincil bölüm (çünkü MBR ile yalnızca 4 birincil bölüm olabilir)
      • 83( sda5,, 7ve 8): Linux'un desteklediği bölümler. Benim için bir homeve farklı Ubuntu sürümleri ile iki kök
      • 82( sd6): takas

fdiskAyrıca sfdiskkomut dosyalarını I, etkileşimli bir fdiskoturum sırasında "kaynakları" sağlayan, bölüm yazmadan önce daha fazla özelleştirme yapabileceğiniz komutla okuyabilir .

Ubuntu'da test edildi 16.04, sfdisk2.27.1.

Bölümleri bir resim dosyası olmadan biçimlendirin ve doldurun sudo

Bu, sfdisksabit disklerinizi mahvetmeden kullanmayı öğrenmenin iyi bir yoludur : https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- ayrıcalıkları / 52850819 # 52850819


4
Omg bu şaşırtıcı. Daha önce fdisk'i kullandım ancak yanlışlıkla tam olarak bir bölümün olduğu yere iniyorsanız, kullanıcının genellikle ihtiyaç duymadığı, hangi emmek istediğini doğrulamak isteyecektir. sfdisk harika, teşekkür ederim!
TaborKelly

3
Bu kabul edilen cevap olmalıdır
shrewmouse

55

fdiskstdin'den okur bu yüzden sadece uygun komutları beslemeniz gerekir. Örneğin, aşağıdakiler varsa, bölüm tablosunu temizler ve tek bir bölümü olan yeni bir tane yapar; tüm 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

İstediğiniz görevi yapmanızı, yazdıklarınızı kaydetmenizi ve böylece çoğaltmanızı öneririz.


4
Yankı komutları ile kabul edilen cevaptan biraz daha ayrıntılı olsa da, bu daha az büyülü ve şaşkın görünüyor.
Henry Heikkinen

1
Şahsen printf, echosadece sistemler arasında tutarlı davranan bir şeyi kullanma alışkanlığı içinde olmak yerine kullanımını öneririm .
vastlysuperiorman

37

Bunu birkaç komutla yapabilirsiniz, çoklu eko yerine intros \ n kullanın.

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

Bu diğerlerinden daha özlü, ama ne yazık ki sadece bash ile çalışmak gibi görünüyor.
bk138

Ash / busybox ile de çalışıyor.
kikeenrique

2
Bir \nsonra gerekli wmi?
Qian Chen,

6
Bu çalışır, ama korkunç :-)
Ciro Santilli en son 9:15

2
@ElgsQianChen: hayır, çünkü echosatırı yeni satırla otomatik olarak sonlandırır ( -nseçenek kullanılmadığı sürece )
Udo G

5

Senaryo yazabilirsin fdisk.

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

Bu 200 MB'lık bir bölüm oluşturur. /dev/sdc


Zarif cevap!
Gangadhar Jannu

5

Fdisk'e yönlendirme komutları, diğer insanlar tarafından açıklandığı gibi çalışır, ancak bu şekilde biraz daha şık ve okunabilir:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

(Geçici) bir dosyadan borular da çalışır:

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

Bu benim oyumu alır. Temiz ve açık bir yorumla kirlenmemiş.
David Betz, 15

5

Yeni bir disklabel tipi gpt oluşturun:

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

Diski bölümlemek:

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


Teşekkürler, bu benim için tek temiz çözüm çünkü fdisk'e bir çeşit "space opera.docx" borulaması içermiyor.
Benibr

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

2
Yeni kullanıcıların yaptığı yaygın bir hata, sorunun nasıl çözüleceği ile ilgili detaylar olmadan cevap vermektir. Cevaplar ayrıntılı olmalı ve gerektiğinde referansları içermelidir. Lütfen cevabınızın neden geçerli olduğunu gösteren ayrıntıları eklemek için cevabınızı düzenlemek için birkaç dakikanızı ayırın. Yardıma ihtiyacınız olursa, Nasıl iyi bir cevap yazarım? 'I okuyun. . Ayrıca, kabul edilmiş bir cevabı olan çok eski bir soruya cevap yazdığınızı lütfen unutmayın. Bunu yaparken yanlış bir şey olmamasına rağmen, OP’den bir yanıt alamayabilirsiniz.
CharlieRB


0

Komut kullanan fdisk diğer insanların yanıtlara bağlı partitons oluşturun.

Komut dosyasında aşağıdakileri değiştirin:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

Örnek kullanım komut dosyasından sonra verilir.

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

koşmak:

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 

Bu betiği kullanabilirsiniz. Sadece hddtanımlandığı yerde kendi bölümlerinizi tanımladığınızdan emin olun . 1Ve arasında 2 boşluk var w; varsayılan değerleri almak için orada olmaları gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.