Jak utworzyć i sformatować partycję za pomocą skryptu bash?

62

Czy jest jakiś sposób na utworzenie i sformatowanie partycji za pomocą skryptu bash?

Myślę, że można to zrobić za pomocą fdisk, ale nie wiem, jak podać polecenia ze skryptu bash do powłoki fdisk, a następnie wyjść z powłoki fdisk.

Chcę utworzyć partycję, a następnie sformatować ją do NTFS z poziomu bash.

GlassGhost
źródło

Odpowiedzi:

70

Podobne do poprzednich sugestii, wysyłania poleceń do Fidsk, uznałem to podejście za przydatne do pozostawienia szczegółów kolejnym opiekunom. Bity sed usuwają wszystkie komentarze, zanim fdisk otrzyma dane wejściowe.

# 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
źródło
3
Całkowicie się zgadzam. Udokumentuj swoją pracę, aby inni mogli ją przeczytać.
Eric Duncan
1
Uwaga: w każdej linii musi znajdować się tabulator wiodący.
Stu,
2
Czy miałbyś coś przeciwko umieszczeniu dużego ostrzeżenia, że tabulator jest wymagany w każdej linii znaków polecenia, jak wspomniano w @Stu? Musiałem debugować przez chwilę tylko dlatego, że kopiowanie i wklejanie ignoruje tabulatory i zastępuje je spacjami, dlatego też wyrażenie regularne nie pasuje do wiersza poleceń.
ceremonie
9
Zamiast ostrzeżenia o kartach zmodyfikowałem sed, aby odrzucić wiodące białe znaki (nie tylko tabulatory) i nie oczekuję tabulacji po poleceniach fdisk. To powinno lepiej wyciąć i wkleić. @ceremcem - dobre opinie i przepraszam, że spowodowałem ci czas debugowania.
user2070305 10.04.16
3
sfdiskjest bardziej przyjazny dla automatyzacji niżfdisk
spuder
65

sfdisk

sfdisk jest skryptową wersją fdisk

Jest to częśćutil-linux , podobnie jak fdisk, więc dostępność powinna być taka sama.

Tablicę partycji z pojedynczą partycją, która zajmuje cały dysk, można utworzyć za pomocą:

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

bardziej złożone tabele partycji wyjaśniono poniżej.

Aby wygenerować przykładowy skrypt, pobierz konfigurację jednego z dysków:

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

Przykładowe dane wyjściowe mojego podwójnego rozruchu 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

Po zapisaniu skryptu w pliku możesz go zastosować do sdX:

sudo sfdisk /dev/sdX < sda.sfdisk

Do sfdiskwprowadzania danych możesz po prostu pominąć nazwy urządzenia i użyć wierszy typu:

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

Są one po prostu ignorowane, jeśli są obecne, a nazwa urządzenia jest pobierana z argumentu wiersza poleceń.

Kilka wyjaśnień:

  • linie nagłówka: wszystkie opcjonalne:
  • linie podziału:

    • start: przesunięcie wewnątrz dysku, na którym zaczyna się partycja.

      start ma bardzo dobre wartości domyślne i często można je pominąć:

      • w pierwszym wierszu startjest 2048, tj. 1 Mb (2048 + 512), co jest rozsądnym domyślnym ustawieniem dla zgodności dysku
      • dalej startdomyślnie do pierwszej nieprzydzielonej pozycji
    • size: man sfdiskMówi: The default value of size indicates "as much as possible". Aby wypełnić dysk pojedynczą partycją, użyj:/dev/sda : start=2048, type=83

    • type: bajt magiczny przechowywany w sektorze rozruchowym dla każdej pozycji partycji . Możliwe wartości: https://en.wikipedia.org/wiki/Partition_type Na tym przykładzie obserwujemy:
      • 7( sda1, 2A 3): systemy plików, które obsługuje Windows. Zainstalowane fabrycznie elementy systemu Windows i partycje odzyskiwania Lenovo. sudo blkidetykiety pomagają je zidentyfikować.
      • 5( sda4): rozszerzona partycja podstawowa, która będzie zawierać inne partycje logiczne (ponieważ możemy mieć tylko 4 partycje podstawowe z MBR)
      • 83( sda5, 7i 8): partycje obsługiwane przez system Linux. Dla mnie jeden homei dwa korzenie z różnymi wersjami Ubuntu
      • 82( sd6): zamiana

fdiskmoże również czytać sfdiskskrypty za pomocą Ipolecenia, które „źródło” je podczas fdisksesji interaktywnej , co pozwala na dalsze dostosowanie przed zapisaniem partycji.

Testowane na Ubuntu 16.04, sfdisk2.27.1.

Sformatuj i wypełnij partycje plikiem obrazu bez sudo

Jest to dobry sposób na naukę używania sfdiskbez wysadzania dysków twardych: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- uprawnienia / 52850819 # 52850819

Ciro Santilli
źródło
4
OMG, to jest niesamowite. Użyłem już fdisk, ale jeśli przypadkowo wylądujesz dokładnie tam, gdzie jest już partycja, będzie potrzebować weryfikacji od użytkownika, której zwykle nie potrzebuje, co jest do bani. sfdisk jest cudowny, dziękuję!
TaborKelly,
3
To powinna być zaakceptowana odpowiedź
shrewmouse
55

fdiskczyta ze standardowego wejścia, więc wystarczy podać odpowiednie polecenia. Na przykład, poniższe czyści tabelę partycji, jeśli taka istnieje, i tworzy nową, która ma jedną partycję, którą jest; cały dysk:

(
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

Zalecam wykonanie żądanego zadania, rejestrowanie wpisywanego tekstu, aby można go było odtworzyć.

e40
źródło
4
Podczas gdy komendy echa są nieco bardziej szczegółowe, niż odpowiedź zaakceptowana, wydaje się to mniej magiczne i zaciemnione.
Henry Heikkinen,
1
Osobiście sugerowałbym użycie printfzamiast echozwyczajnego używania czegoś, co zachowuje się konsekwentnie w różnych systemach.
vastlysuperiorman
37

Możesz to zrobić za pomocą kilku poleceń, użyj intros \ n zamiast wielu ech.

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
kikeenrique
źródło
Jest to bardziej zwięzłe niż inne, ale niestety wydaje się, że działa tylko z bash.
bk138
Działa również z ash / busybox.
kikeenrique,
2
Czy \npotrzebna jest kolejna po w?
Qian Chen,
6
To działa, ale jest okropne :-)
Ciro Santilli 9 改造 中心 法轮功 法轮功 六四 事件
2
@ElgsQianChen: nie, ponieważ echoautomatycznie kończy linię znakiem nowej linii (chyba że -nużyto opcji)
Udo G
5

Możesz pisać fdisk.

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

To tworzy partycję 200 MB /dev/sdc

Ron
źródło
Elegancka odpowiedź!
Gangadhar Jannu,
5

Polecenia pipowania do fdisk działają dobrze, jak wyjaśnione przez innych ludzi, ale w ten sposób są nieco bardziej eleganckie i czytelne:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

Piping z (tymczasowego) pliku działa również:

fdisk /dev/sdc < /tmp/fdisk.cmds
Promień
źródło
Ten dostaje mój głos. Jest czysty i nie jest zanieczyszczony bieżącym komentarzem.
David Betz,
5

Utwórz nowy typ etykiety dysku gpt:

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

Podziel dysk na partycje:

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

Bruce Davis
źródło
Dziękuję, to jest dla mnie jedyne czyste rozwiązanie, ponieważ nie obejmuje przesyłania jakiejś „kosmicznej opery.docx” do fdisk.
Benibr
1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
Diego Roberto Dos Santos
źródło
2
Częstym błędem popełnianym przez nowych użytkowników jest udzielanie odpowiedzi bez szczegółowych informacji na temat sposobu rozwiązania problemu. Odpowiedzi powinny być szczegółowe i zawierać odniesienia, w razie potrzeby. Poświęć kilka minut na edycję odpowiedzi, aby podać szczegóły, dlaczego odpowiedź jest ważna. Jeśli potrzebujesz pomocy, przeczytaj Jak napisać dobrą odpowiedź? . Pamiętaj też, że masz odpowiedź na bardzo stare pytania, na które odpowiedź została zaakceptowana. Chociaż nie ma w tym nic złego, możesz nie otrzymać odpowiedzi z PO.
CharlieRB,
1
Czy różni się to od: superuser.com/a/739586/128124 ?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
0

Skrypt używa fdisk do tworzenia partycji na podstawie odpowiedzi innych osób.

Zmień następujące elementy w skrypcie:

NUM_PARTITIONS = 5

PARTITION_SIZE = „+ 10G”

Przykładowe użycie podano po skrypcie.

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

Biegnij z:

sudo sh mk_partition.sh / dev / sdxxx

Paul Justin
źródło
-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 

Możesz użyć tego skryptu. Po prostu upewnij się, że zdefiniowałeś własne partycje, w których hddjest zdefiniowany. Istnieją 2 puste miejsca między 1i w; muszą tam być, aby przyjmować wartości domyślne.

Shailesh Sutar
źródło