¿Cómo crear y formatear una partición usando un script bash?


62

¿Hay alguna forma de crear y formatear una partición usando un script bash?

Creo que se puede hacer con fdisk, pero no sé cómo alimentar los comandos del script bash en el shell de fdisk y luego salir del shell de fdisk.

Quiero crear una partición y luego formatearla en ntfs desde bash.

Respuestas:


70

De manera similar a las sugerencias anteriores, los comandos de canalización a fidsk, he encontrado este enfoque útil para dejar detalles para los mantenedores posteriores. Los bits sed eliminan todos los comentarios antes de que fdisk reciba la entrada.

# 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
Estoy completamente de acuerdo. Documente su trabajo para que otros lo lean.
Eric Duncan

1
Tenga en cuenta que debe tener una pestaña inicial en cada línea.
Stu

2
¿Le importaría colocar una gran advertencia de que se requiere una pestaña en cada línea de caracteres de comando como se menciona en @Stu? Tuve que depurar por un tiempo solo porque copiar y pegar ignora las pestañas y las reemplaza con espacios, por lo tanto, la expresión regular no coincide con las líneas de comando.
ceremcem

99
En lugar de una advertencia sobre las pestañas, he modificado el sed para descartar los espacios en blanco iniciales (no solo las pestañas) y no esperar una pestaña después de los comandos de fdisk. Esto debería cortar y pegar mejor. @ceremcem: buenos comentarios y lamento haberle ocasionado algún tiempo de depuración.
user2070305

3
sfdiskes más amigable con la automatización quefdisk
2017

65

sfdisk

sfdisk es una versión de Scripted fdisk

Es parte deutil-linux , al igual que fdisk, por lo que la disponibilidad debería ser la misma.

Se puede crear una tabla de particiones con una única partición que tome todo el disco con:

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

y las tablas de partición más complejas se explican a continuación.

Para generar un script de ejemplo, obtenga la configuración de uno de sus discos:

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

Ejemplo de salida en mi Lenovo T430 Windows 7 / Ubuntu dual boot:

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

Una vez que tenga el script guardado en un archivo, puede aplicarlo sdXcon:

sudo sfdisk /dev/sdX < sda.sfdisk

Para la sfdiskentrada, puede omitir los nombres de los dispositivos y usar líneas de tipo:

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

Simplemente se ignoran si están presentes, y el nombre del dispositivo se toma del argumento de la línea de comando.

Algunas explicaciones:

  • líneas de encabezado: todas opcionales:
  • líneas de partición:

    • start: desplazamiento dentro del disco en el que comienza la partición.

      start tiene valores predeterminados muy buenos y, a menudo, se puede omitir:

      • en la primera línea, startes 2048, es decir, 1Mb (2048 + 512), que es un valor predeterminado sensato para la compatibilidad de discos
      • más startpredeterminado a la primera posición no asignada
    • size: man sfdiskDice: The default value of size indicates "as much as possible". Entonces, para llenar el disco con una sola partición, use:/dev/sda : start=2048, type=83

    • type: byte mágico almacenado en el sector de arranque para cada entrada de partición . Valores posibles: https://en.wikipedia.org/wiki/Partition_type En este ejemplo observamos:
      • 7( sda1, 2y 3): sistemas de archivos que admite Windows. Cosas de Windows preinstaladas y particiones de recuperación de Lenovo. sudo blkidLas etiquetas ayudan a identificarlos.
      • 5( sda4): partición primaria extendida, que contendrá otras particiones lógicas (porque solo podemos tener 4 particiones primarias con MBR)
      • 83( sda5,, 7y 8): particiones que soporta Linux. Para mí home, una y dos raíces con diferentes versiones de Ubuntu
      • 82( sd6): intercambio

fdiskTambién puede leer sfdisksecuencias de comandos con el Icomando, que las "fuente" durante una fdisksesión interactiva , lo que le permite una mayor personalización antes de escribir la partición.

Probado en Ubuntu 16.04, sfdisk2.27.1.

Formatear y llenar las particiones de un archivo de imagen sin sudo

Esta es una buena manera de aprender a usar sfdisksin explotar sus discos duros: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- privilegios / 52850819 # 52850819


44
Dios mío, esto es increíble. He usado fdisk antes, pero si accidentalmente aterrizas exactamente donde ya hay una partición, querrá una verificación del usuario que generalmente no requiere, lo que apesta. sfdisk es maravilloso, gracias!
TaborKelly

3
Esta debería ser la respuesta aceptada
musaraña

55

fdisklee desde stdin por lo que solo necesita alimentarlo con los comandos apropiados. Por ejemplo, lo siguiente borra la tabla de particiones, si hay una, y crea una nueva que tiene una única partición que es; disco completo:

(
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

Te recomiendo que hagas la tarea que deseas, grabando lo que escribes para poder reproducirlo.


44
Si bien es un poco más detallado con los comandos de eco que la respuesta aceptada, esto parece mucho menos mágico y ofuscado.
Henry Heikkinen

1
Yo personalmente sugeriría el uso de, en printflugar de echosimplemente, tener la costumbre de usar algo que se comporta de manera consistente en todos los sistemas.
vastlysuperiorman

37

Puede hacerlo con solo un par de comandos, use introducciones \ n en lugar de múltiples ecos.

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

Esto es más conciso que los otros, pero desafortunadamente parece que solo funciona con bash.
bk138

También funciona con ash / busybox.
kikeenrique

2
¿Se \nnecesita otro después del w?
Qian Chen

66
Esto funciona, pero es horrible :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

2
@ElgsQianChen: no, porque echotermina automáticamente la línea con una nueva línea (a menos que -nse use la opción)
Udo G

5

Puedes guión fdisk.

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

Eso crea una partición de 200 MB en /dev/sdc


Elegante respuesta!
Gangadhar Jannu

5

Los comandos de canalización a fdisk funcionan bien como lo explican otras personas, pero de esta manera son un poco más elegantes y legibles:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

La canalización desde un archivo (temporal) también funciona:

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

Éste tiene mi voto. Está limpio y no está contaminado con un comentario corriente.
David Betz

5

Cree un nuevo tipo de etiqueta de disco gpt:

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

Particionar el disco:

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


Gracias, esta es la única solución limpia para mí porque no incluye la conexión de algún tipo de "space opera.docx" a fdisk.
Benibr

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

2
Un error común que cometen los nuevos usuarios es responder sin detalles sobre cómo realmente resuelve el problema. Las respuestas deben ser detalladas e incluir referencias, según sea necesario. Dedique unos minutos a editar su respuesta para incluir detalles de por qué su respuesta es válida. Si necesita ayuda, lea ¿Cómo escribo una buena respuesta? . Además, tenga en cuenta que ha publicado una respuesta a una pregunta muy antigua que tiene una respuesta aceptada. Aunque hay errores al hacerlo, es posible que no reciba una respuesta del OP.
CharlieRB


0

El script usa fdisk para crear particiones basadas en las respuestas de otras personas.

Cambie lo siguiente en el script:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

Ejemplo de uso se da después de la secuencia de comandos.

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

corre con:

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 

Puedes usar este script. Solo asegúrese de definir sus propias particiones donde hddse define. Hay 2 espacios en blanco entre 1y w; necesitan estar allí para tomar valores predeterminados.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.