Як створити та відформатувати розділ за допомогою скрипту bash?


62

Чи є спосіб створити і відформатувати розділ, використовуючи скрипт bash?

Я думаю, що це можна зробити за допомогою fdisk, але я не знаю, як подавати команди із скрипту bash в оболонку fdisk, а потім вийти з оболонки fdisk.

Я хочу створити розділ, а потім відформатувати його в ntfs зсередини bash.

Відповіді:


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
Зверніть увагу, що у кожному рядку потрібно мати провідну вкладку.
Ст

2
Чи не заперечуєте ви розмістити велике попередження про те, що в кожному рядку символьних команд потрібна вкладка, як згадується @Stu? Мені довелося налагоджувати деякий час лише тому, що копіювати та вставляти вкладки ігнорує та замінює їх пробілами, таким чином, регулярний вираз не збігається з командними рядками.
ceremcem

9
Замість попередження про вкладки я змінив sed, щоб відкинути провідний пробіл (а не лише вкладки) і не очікувати вкладки після команд fdisk. Це слід краще різати та наклеювати. @ceremcem - хороший відгук і, на жаль, викликав у вас будь-який час налагодження.
користувач2070305

3
sfdiskє більш зручним для автоматизації, ніжfdisk
спудер

65

sfdisk

sfdisk це сценарій версії fdisk

Він є частиноюutil-linux , як fdiskі тому, тому доступність має бути однаковою.

Таблицю розділів з одним розділом, що займає весь диск, можна створити за допомогою:

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

і більш складні таблиці розділів пояснюються нижче.

Щоб створити приклад сценарію, отримайте налаштування одного з ваших дисків:

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

Приклад виводу на моєму подвійному завантаженні Windows 7 / Ubuntu Lenovo T430:

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: зміщення всередині диска, на якому запускається розділ.

      start має дуже хороші параметри за замовчуванням, і їх часто можна заборонити:

      • на першому рядку start- 2048, тобто 1 Мбіт (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): своп

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
Це має бути прийнята відповідь
майстер

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

Це більш лаконічно, ніж інші, але, на жаль, здається, працює лише з bash.
bk138

Він також працює з золом / busbox.
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 МБ розділ /dev/sdc


Елегантна відповідь!
Гангадхар Яну

5

Команди для передачі файлів fdisk добре працюють, як пояснюють інші, але цей спосіб трохи більш елегантний і читабельний:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

Трубопровід з (тимчасового) файлу також працює:

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

Цей отримує мій голос. Це чисто і не забруднене бігаючим коментарем.
Девід Бетц

5

Створіть новий gpt типу disklabel:

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

Розділіть диск:

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


Дякую, це єдине чисте рішення для мене, тому що воно не включає в себе перенесення файлів на якийсь "космічний опер.docx".
Бенібр

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

2
Поширена помилка, яку роблять нові користувачі, - відповідати без деталей, як реально вирішити проблему. Відповіді мають бути детальними та включати посилання за потребою. Будь-ласка, знайдіть кілька хвилин, щоб відредагувати свою відповідь, щоб включити подробиці, чому ваша відповідь є дійсною. Якщо вам потрібна допомога, читайте Як я можу написати гарну відповідь? . Крім того, будь ласка, розумійте, що ви розмістили відповідь на дуже старі питання, на які є прийнята відповідь. Хоча зауваження в цьому не так, ви, можливо, не отримаєте відповіді від ОП.
CharlieRB


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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.