Discos virtuales para aprender a particionar

Discos virtuales para aprender a particionar

Una de las primeras cosas que deben conocer los aprendices de administradores de sistemas es el particionado de discos duros. El particionado de discos es el procedimiento que se utiliza para dividir un disco duro en varios “trozos”. Cada uno de estos “trozos”, denominados particiones, puede utilizarse para alojar un sistema de ficheros diferente y por tanto permite una gestión mucho más adecuada del almacenamiento, sobre todo cuando el tamaño de los discos es grande.

Para hacer prácticas de particionado de discos, lo lógico es utilizar un disco duro auxiliar en el que no haya ninguna información relevante y en este entrada se explica cómo hacerlo en GNU/Linux mediante un disco duro virtual, que en este caso no es más que un fichero de imagen en formato raw como los que se utilizan habitualmente en sistemas virtuales.

Creación del disco virtual

Los discos duros son dispositivos de bloque en los que la información se mueve en bloques de un determinado tamaño, no bit a bit, siendo 512 bytes el tamaño más habitual de estos bloques. Por tanto, un disco duro virtual debe crearse con un número exacto de sectores (un múltiplo de 512 bytes). De esta manera, si queremos crear un disco virtual de 1 GiB con bloques de 512 bytes, tendremos un total de 2097152 bloques:

1

2

3

1 GiB = 2^30 bytes

1 bloque = 512 bytes = 2^9 bytes

2^30/2^9 = 2^21 = 2097152

Ahora utilizamos la instrucción dd para crear el fichero de la siguiente manera:

1

$ dd if=/dev/zero of=disco-virtual.img bs=512 count=2097152

que producirá como resultado un fichero de nombre disco-virtual.img, de 1 GiB de tamaño y “vacío” (lleno de ceros):

1

2

$ ls -hl

-rw-r--r--  1 alberto alberto 1,0G ene 19 16:59 disco-virtual.img

Para que el sistema trate el fichero como un dispositivo de bloques y no como un fichero normal, vamos a utilizar la instrucción losetup que asocia el fichero que le demos al primer dispositivo loop disponible, procedimiento que deberemos realizar como root:

1

2

# losetup -vf disco-virtual.img

Loop device is /dev/loop0

En el paso anterior hemos utilizado el parámetro -v (verbose) para saber el dispositivo al que se ha asociado el disco virtual (/dev/loop0 en este caso) y -f para asociar el primer dispositivo loop libre al disco virtual.

Creación de MBR y particionado con fdisk

El siguiente ingrediente a utilizar es fdisk. Con él, crearemos una tabla de particiones tipo DOS, conocida como Master Boot Record (MBR). Para ello, tras ejecutar fdisk sobre el dispositivo /dev/loop0, utilizaremos la opción “o” de dicho comando que nos crea una tabla de particiones DOS vacía y una vez ejecutada dicha opción, guardaremos los datos seleccionando la opción “w”:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

# fdisk /dev/loop0

El dispositivo no contiene una tabla de particiones DOS válida ni una etiqueta de disco Sun o SGI o OSF

Building a new DOS disklabel with disk identifier 0x107979b1.

Changes will remain in memory only, until you decide to write them.

After that, of course, the previous content won't be recoverable.

 

Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite)

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').

 

Orden (m para obtener ayuda): o

Building a new DOS disklabel with disk identifier 0x76be0987.

Changes will remain in memory only, until you decide to write them.

After that, of course, the previous content won't be recoverable.

 

Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite)

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').

 

Orden (m para obtener ayuda): w

¡Se ha modificado la tabla de particiones!

 

Llamando a ioctl() para volver a leer la tabla de particiones.

 

WARNING: Re-reading the partition table failed with error 22: Argumento inválido.

The kernel still uses the old table. The new table will be used at

the next reboot or after you run partprobe(8) or kpartx(8)

Se están sincronizando los discos.

Ya tenemos nuestro fichero disco-virtual asociado al dispositivo /dev/loop0 y con un MBR escrito en su primer bloque. Podemos hacer uso de fdisk de forma habitual y crear las particiones que estimemos necesarias, por ejemplo:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

# fdisk /dev/loop0

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').

 

Orden (m para obtener ayuda): n

Acción de la orden

e   Partición extendida

   p   Partición primaria (1-4)

p

Número de partición (1-4): 1

Primer cilindro (1-130, valor predeterminado 1): 1

Last cilindro, +cilindros or +size{K,M,G} (1-130, valor predeterminado 130): +250M

 

Orden (m para obtener ayuda): n

Acción de la orden

e   Partición extendida

   p   Partición primaria (1-4)

e

Número de partición (1-4): 2

Primer cilindro (34-130, valor predeterminado 34): 34

Last cilindro, +cilindros or +size{K,M,G} (34-130, valor predeterminado 130):

Se está utilizando el valor predeterminado 130

 

Orden (m para obtener ayuda): n

Acción de la orden

l   Partición lógica (5 o superior)

   p   Partición primaria (1-4)

l

Primer cilindro (34-130, valor predeterminado 34):

Se está utilizando el valor predeterminado 34

Last cilindro, +cilindros or +size{K,M,G} (34-130, valor predeterminado 130): +300M

 

Orden (m para obtener ayuda): p

 

Disco /dev/loop0: 1073 MB, 1073741824 bytes

255 heads, 63 sectors/track, 130 cylinders

Units = cilindros of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x76be0987

 

   Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema

/dev/loop0p1               1          33      265041   83  Linux

/dev/loop0p2              34         130      779152+   5  Extendida

/dev/loop0p5              34          72      313236   83  Linux

Orden (m para obtener ayuda): w

¡Se ha modificado la tabla de particiones!

 

Llamando a ioctl() para volver a leer la tabla de particiones.

 

WARNING: Re-reading the partition table failed with error 22: Argumento inválido.

The kernel still uses the old table. The new table will be used at

the next reboot or after you run partprobe(8) or kpartx(8)

Se están sincronizando los discos.

Sin embargo el último mensaje nos indica que las particiones recién creadas no están disponibles hasta que reiniciemos o hasta que forcemos al sistema a releer la tabla de particiones con partprobe o kpartx. Vamos a utilizar esta última opción, para lo que deberemos instalar el paquete kpartx previamente y cargar en memoria el módulo dm-mod:

1

# modprobe dm-mod

Ahora utilizamos kpartx para asociar las particiones a dispositivos tipo mapper:

1

2

3

4

5

6

7

8

9

10

# kpartx -av /dev/loop0

add map loop0p1 (254:7): 0 530082 linear /dev/loop0 63

add map loop0p2 (254:8): 0 1558305 linear /dev/loop0 530145

add map loop0p5 : 0 626472 linear 254:8 63

# ls -l /dev/mapper/

total 0

crw------- 1 root root 10, 59 ene 19 16:04 control

lrwxrwxrwx 1 root root      7 ene 19 17:40 loop0p1 -> ../dm-0

lrwxrwxrwx 1 root root      7 ene 19 17:40 loop0p2 -> ../dm-1

lrwxrwxrwx 1 root root      7 ene 19 17:40 loop0p5 -> ../dm-2

Y podremos utilizar estos últimos para formatearlos, montarlos,etc.