बैश स्क्रिप्ट का उपयोग करके विभाजन कैसे बनाएं और प्रारूपित करें?


62

क्या बैश स्क्रिप्ट का उपयोग करके विभाजन बनाने और प्रारूपित करने का कोई तरीका है?

मुझे लगता है कि यह fdisk के साथ किया जा सकता है, लेकिन मुझे नहीं पता कि कैसे bash स्क्रिप्ट से कमांड को fdisk शेल में फीड किया जाए और फिर fdisk शेल से बाहर निकलें।

मैं एक विभाजन बनाना चाहता हूँ तो इसे bash के भीतर से ntfs में प्रारूपित करें।

जवाबों:


70

पिछले सुझावों के समान, पाइपिंग आदेशों को fidsk करने के लिए, मैंने इस दृष्टिकोण को बाद के अनुरक्षकों के लिए विवरण छोड़ने के लिए उपयोगी पाया है। 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
मैं पूरी तरह से सहमत। दूसरों को पढ़ने के लिए अपने काम का दस्तावेज़ दें।
एरिक डंकन

1
ध्यान दें कि आपके पास प्रत्येक पंक्ति में एक अग्रणी टैब होना चाहिए।
Stu

2
क्या आप एक बड़ी चेतावनी देना चाहेंगे कि प्रत्येक कमांड वर्ण रेखा पर एक टैब की आवश्यकता है जैसा कि @Stu का उल्लेख किया गया है? मुझे थोड़ी देर के लिए डिबग करना पड़ा क्योंकि कॉपी-एंड-पेस्ट टैब को अनदेखा करता है और उन्हें रिक्त स्थान के साथ बदल देता है, इस प्रकार रीगेक्स कमांड लाइनों के साथ मेल नहीं खाता है।
सेरेमसी

9
टैब के बारे में चेतावनी के बजाय, मैंने प्रमुख व्हाट्सएप (न सिर्फ टैब) को छोड़ने के लिए sed को संशोधित किया है और न ही fdisk कमांड के बाद टैब की अपेक्षा की है। यह बेहतर कट और पेस्ट करना चाहिए। @ceremcem - अच्छी प्रतिक्रिया और आपको किसी भी डिबग समय के लिए खेद है।
15:20 बजे user2070305

3
sfdiskसे अधिक स्वचालन के अनुकूल हैfdisk
स्पूडर

65

sfdisk

sfdisk का एक स्क्रिप्टेड संस्करण है fdisk

यहutil-linux उसी तरह का हिस्सा है , fdiskइसलिए उपलब्धता समान होनी चाहिए।

एक एकल विभाजन वाली एक विभाजन तालिका जिसमें संपूर्ण डिस्क होती है, को इसके साथ बनाया जा सकता है:

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

और अधिक जटिल विभाजन सारणी नीचे बताई गई है।

एक उदाहरण स्क्रिप्ट उत्पन्न करने के लिए, अपने एक डिस्क का सेटअप प्राप्त करें:

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

मेरे लेनोवो T430 विंडोज 7 / उबंटू दोहरे बूट पर नमूना आउटपुट:

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(एमबीआर) पुरानी एक व्यापक रूप से समर्थित एक, 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: उस डिस्क के अंदर ऑफसेट जिस पर विभाजन शुरू होता है।

      start बहुत अच्छी चूक है, और अक्सर इसे हटाया जा सकता है:

      • पहली पंक्ति में, start2048, यानी 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): फ़ाइल सिस्टम विंडोज का समर्थन करता है। पूर्वस्थापित विंडोज सामान और लेनोवो रिकवरी विभाजन। sudo blkidलेबल उन्हें पहचानने में मदद करते हैं।
      • 5( sda4): विस्तारित प्राथमिक विभाजन, जिसमें अन्य तार्किक विभाजन शामिल होंगे (क्योंकि हम एमबीआर के साथ केवल 4 प्राथमिक विभाजन कर सकते हैं)
      • 83( sda5, 7और 8): विभाजन जो लिनक्स का समर्थन करता है। मेरे लिए एक home, और अलग-अलग उबंटू संस्करणों के साथ दो जड़ें
      • 82( sd6): स्वैप

fdiskकमांड के sfdiskसाथ स्क्रिप्ट भी पढ़ सकते हैं I, जो एक इंटरैक्टिव fdiskसत्र के दौरान उन्हें "स्रोत" देता है, जिससे आपको विभाजन लिखने से पहले और अधिक अनुकूलन की अनुमति मिलती है।

उबंटू 16.04, sfdisk2.27.1 पर परीक्षण किया गया ।

विभाजन और छवि फ़ाइल के बिना पॉप्युलेट करें sudo

यह sfdiskअपनी हार्ड डिस्क को उड़ाने के बिना उपयोग करने के लिए सीखने का एक अच्छा तरीका है : https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root-ro विशेषाधिकार / 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
जबकि स्वीकृत उत्तर की तुलना में प्रतिध्वनि के साथ थोड़ी अधिक क्रिया, यह बहुत कम जादुई और अस्पष्ट लगता है।
हेनरी हेककिनन

1
मैं व्यक्तिगत रूप printfसे echoकेवल कुछ का उपयोग करने की आदत में रहने की सलाह दूंगा जो कि पूरे सिस्टम में लगातार व्यवहार करता है।
विशाललसुपरियोर्मैन

37

आप इसे केवल एक-दो कमांड के साथ कर सकते हैं, कई इको के बजाय इंट्रो \ n का उपयोग कर सकते हैं ।

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

यह दूसरों की तुलना में अधिक प्रचलित है, लेकिन दुर्भाग्य से केवल बैश के साथ काम करने लगता है।
bk138

यह राख / व्यस्त बॉक्स के साथ भी काम कर रहा है।
कीकेन्रिएक

2
के \nबाद एक और की जरूरत है w?
कियान चेन

6
यह काम करता है, लेकिन भयानक है :-)
Ciro Santilli 改造 hor hor hor hor

2
@ElgsQianChen: नहीं, क्योंकि echoस्वचालित रूप से एक नई रेखा के साथ लाइन समाप्त हो जाती है (जब तक कि -nविकल्प का उपयोग नहीं किया जाता है)
Udo G

5

आप स्क्रिप्ट कर सकते हैं fdisk

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

यह 200 एमबी विभाजन बनाता है /dev/sdc


सुरुचिपूर्ण जवाब!
गंगाधर जन्नू

5

अन्य लोगों द्वारा समझाया गया fdisk को कमांडिंग पाइपिंग अच्छी तरह से काम करता है, लेकिन इस तरह से थोड़ा और अधिक सुरुचिपूर्ण और पठनीय है:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

अस्थायी (अस्थायी) फ़ाइल से पाइपिंग भी काम करती है:

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

यह मेरा वोट हो जाता है। यह साफ है और चल रहे कमेंट्री से प्रदूषित नहीं है।
डेविड बेट्ज़

5

एक नया डिस्कलेबेल प्रकार gpt बनाएँ:

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

डिस्क को विभाजन:

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


धन्यवाद, यह मेरे लिए एकमात्र स्वच्छ समाधान है, क्योंकि इसमें कुछ प्रकार के "स्पेस ऑपरोडा। Xx" को fdisk करने के लिए शामिल नहीं किया गया है।
बेनिब्रिज

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

2
एक सामान्य गलती जो नए उपयोगकर्ता करते हैं, वह इस बात का विवरण दिए बिना है कि वास्तव में समस्या का समाधान कैसे किया जाए। उत्तरों को विस्तृत होना चाहिए और आवश्यकतानुसार संदर्भों को शामिल करना चाहिए। आपका उत्तर मान्य क्यों है, इसका विवरण शामिल करने के लिए कृपया अपने उत्तर को संपादित करने के लिए कुछ मिनट लें। यदि आपको कुछ सहायता की आवश्यकता है, तो पढ़ें मैं एक अच्छा उत्तर कैसे लिखूं? । इसके अलावा, कृपया महसूस करें कि आपने बहुत पुराने प्रश्नों का उत्तर दिया है, जिसमें एक स्वीकृत उत्तर है। हालाँकि ऐसा करने में गलत है, आपको ओपी से प्रतिक्रिया नहीं मिल सकती है।
चार्लीआरबी


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; उन्हें डिफ़ॉल्ट मान लेने के लिए वहाँ रहने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.