Как создать и отформатировать раздел, используя скрипт bash?

62

Есть ли способ создать и отформатировать раздел, используя скрипт bash?

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

Я хочу создать раздел, а затем отформатировать его в NTFS из Bash.

GlassGhost
источник

Ответы:

70

Как и в предыдущих предложениях, отправляющих команды в fidsk, я нашел этот подход полезным, чтобы оставить детали для последующих сопровождающих. Биты sed удаляют все комментарии, прежде чем 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
user2070305
источник
3
Я полностью согласен. Документируйте свою работу, чтобы другие могли ее прочитать.
Эрик Дункан
1
Обратите внимание, что вы должны иметь ведущую вкладку в каждой строке.
Stu
2
Не могли бы вы разместить большое предупреждение о том, что в каждой строке командных символов требуется вкладка, как упоминалось в @Stu? Мне пришлось некоторое время отлаживать только потому, что копирование и вставка игнорирует вкладки и заменяет их пробелами, поэтому регулярное выражение не совпадает с командной строкой.
ceremcem
9
Вместо предупреждения о вкладках я изменил sed для удаления начальных пробелов (не только вкладок) и не ожидал вкладку после команд fdisk. Это должно вырезать и вставлять лучше. @ceremcem - хороший отзыв и извините за то, что вызвали у вас какое-либо время отладки.
user2070305
3
sfdiskболее дружественен к автоматизации, чемfdisk
spuder
65

sfdisk

sfdisk это сценарий версии fdisk

Это частьutil-linux , так же как fdiskи доступность должна быть одинаковой.

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

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

и более сложные таблицы разделов описаны ниже.

Чтобы сгенерировать пример сценария, получите настройку одного из ваших дисков:

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

Пример вывода на моей двойной загрузке Lenovo T430 для Windows 7 / Ubuntu:

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, то есть 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): файловые системы , которая поддерживает 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

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
4
OMG это удивительно. Я использовал fdisk и раньше, но если вы случайно попадете именно туда, где уже есть раздел, он потребует от пользователя подтверждения, что он обычно не требуется, что отстой. Sfdisk это замечательно, спасибо!
TaborKelly
3
Это должен быть принятый ответ
shrewmouse
55

fdiskчитает из стандартного ввода, так что вам просто нужно дать ему соответствующие команды. Например, следующее очищает таблицу разделов, если она есть, и создает новую таблицу с одним разделом, который является; весь диск:

(
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

Я рекомендую вам делать то, что вы хотите, записывая то, что вы печатаете, чтобы вы могли воспроизвести его.

e40
источник
4
В то время как команды эха немного более многословны, чем принятый ответ, это кажется гораздо менее волшебным и запутанным.
Генри Хейккинен
1
Я лично предложил бы использовать printfвместо того, echoчтобы просто иметь привычку использовать что-то, что ведет себя последовательно во всех системах.
Чрезвычайно высший человек
37

Вы можете сделать это с помощью пары команд, используя intros \ n вместо нескольких echos.

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
kikeenrique
источник
Это более кратко, чем другие, но, к сожалению, похоже, работает только с Bash.
bk138
Это работает с ash / busybox тоже.
kikeenrique
2
\nНужен ли другой после w?
Цянь Чен
6
Это работает, но ужасно :-)
Чиро Сантилли 事件 '中心 法轮功 六四 事件
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

Брюс Дэвис
источник
Спасибо, это единственное чистое решение для меня, потому что оно не включает в себя передачу какого-то "space opera.docx" на fdisk.
Бенибр
1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
Диего Роберто Дос Сантос
источник
2
Распространенная ошибка, которую делают новые пользователи, состоит в том, чтобы ответить без деталей о том, как фактически решить проблему. Ответы должны быть подробными и включать ссылки по мере необходимости. Пожалуйста, потратьте несколько минут, чтобы отредактировать свой ответ, включив в него детали того, почему ваш ответ действителен Если вам нужна помощь, прочитайте Как я могу написать хороший ответ? , Также, пожалуйста, поймите, что вы разместили ответ на очень старые вопросы, на которые есть принятый ответ. Хотя в этом нет ничего плохого, вы можете не получить ответ от ОП.
CharlieRB
1
Это отличается от: superuser.com/a/739586/128124 ?
Чиро Сантилли 新疆 16 中心 法轮功 六四 事件
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; они должны быть там для принятия значений по умолчанию.

Шайлеш Сутар
источник