2011-09-05 21:38:11 +0000 2011-09-05 21:38:11 +0000
67
67

Как создать и отформатировать раздел с помощью скрипта bash?

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

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

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

Ответы (10)

72
72
72
2015-10-10 03:03:55 +0000

По аналогии с предыдущими предложениями, командами на конвейер для 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]*\).*//' << 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
68
68
68
2016-10-08 17:30:51 +0000

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: только информативно я думаю
  • строки разделов:

fdisk также может читать сценарии sfdisk командой I, которая “исходит” их во время интерактивного сеанса fdisk, позволяя вам дополнительно настроить перед записью раздела.

Протестировано на Ubuntu 16.04, sfdisk 2.27.1.

Форматирование и заполнение разделов файлом образа без sudo

Это хороший способ научиться использовать sfdisk без взрыва жестких дисков: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root-privileges/52850819#52850819

56
56
56
2011-09-06 03:34:53 +0000

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

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

37
37
37
2014-04-09 12:53:18 +0000

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

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
5
5
5
2015-02-25 15:44:20 +0000

Подводка команд к fdisk работает так же хорошо, как и объясняют другие люди, но этот способ немного более элегантный и читабельный:

fdisk /dev/sdc <<EOF
n
p
1

w
EOF

Также работает “Трубопровод из (временного) файла”:

fdisk /dev/sdc < /tmp/fdisk.cmds
5
5
5
2012-06-08 15:42:12 +0000

Вы можете написать сценарий fdisk.

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

Это создает раздел размером 200 МБ на /dev/sdc.

5
5
5
2017-10-06 19:03:35 +0000

Создайте новую дисковую метку типа gpt:

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

Разбить диск на разделы:

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

1
1
1
2016-03-23 19:29:01 +0000
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
0
0
0
2017-07-14 12:07:51 +0000

Скрипт использует 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]*\).*//' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

выполняется с:

sudo sh mk_partition.sh /dev/sdxxx.

-2
-2
-2
2016-07-15 12:49:49 +0000
#!/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. Между 1 и w есть 2 пустых пробела; они должны быть там, чтобы принять значения по умолчанию.