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

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

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

Creo que se puede hacer con fdisk pero no sé cómo introducir 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 a ntfs desde bash.

Respuestas (10)

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

Al igual que las sugerencias anteriores, canalizar los comandos a fidsk, he encontrado este enfoque útil para dejar los detalles para los mantenedores posteriores. Los bits de 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]*\).*//' << 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 es una versión con script de fdisk Es parte de util-linux , al igual que fdisk, por lo que la disponibilidad debería ser la misma.

Se puede crear una tabla de particiones con una sola partición que ocupe todo el disco con:

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

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

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 tengas el script guardado en un archivo, puedes aplicarlo a sdX con:

sudo sfdisk /dev/sdX < sda.sfdisk

Para la entrada de sfdisk, puedes simplemente omitir los nombres de los dispositivos, y utilizar líneas del 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 comandos.

Algunas explicaciones:

fdisk también puede leer las líneas de partición con el comando sfdisk, que las “origina” durante una sesión interactiva I, permitiéndole una mayor personalización antes de escribir la partición.

Probado en Ubuntu 16.04, fdisk 2.27.1.

Formatear y poblar las particiones un archivo de imagen sin sfdisk

Esta es una buena forma de aprender a usar sudo sin reventar tus discos duros: 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 lee de stdin por lo que sólo hay que alimentarlo con los comandos adecuados. Por ejemplo, lo siguiente borra la tabla de particiones, si hay una, y hace una nueva que tiene una sola partición que es el; disco entero:

(
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 quieras, grabando lo que escribes para poder reproducirlo.

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

Puedes hacerlo con sólo un par de comandos, usa intros \n en lugar de múltiples echos.

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

La canalización de los comandos a fdisk funciona bien, tal y como han explicado otras personas, pero de esta manera es un poco más elegante y legible:

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
5
5
5
2012-06-08 15:42:12 +0000

Puedes hacer el script fdisk.

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

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

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

Crear una nueva etiqueta de disco tipo gpt:

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

Particionar el disco:

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

El script utiliza fdisk para crear partitons basados en las respuestas de otras personas.

Cambia lo siguiente en el script:

NUM_PARTITIONS =5

PARTITION_SIZE =“+10G”

El ejemplo de uso se da después del script.

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

ejecutar con:

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

Puede utilizar este script. Sólo asegúrese de definir sus propias particiones donde se define hdd. Hay 2 espacios en blanco entre 1 y w; tienen que estar ahí para tomar los valores por defecto.