En ocasiones debemos redimensionar discos simples, los discos gestionados mediante LVM son mucho más sencillos de redimensionar. Pero en esta caso no contamos con ellos, vamos a proceder a un redimendionado sin pérdida de datos.
El escenario inicial es este:
[root@oradb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_oradb-lv_root
37G 6.7G 30G 19% /
tmpfs 1.9G 224K 1.9G 1% /dev/shm
/dev/sda1 485M 34M 426M 8% /boot
/dev/sdb1 1004M 19M 935M 2% /mnt
[root@oradb ~]# parted /dev/sdb unit s print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 4194304s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 2088449s 2088387s primary ext4
[root@oradb ~]# ls /mnt/ | wc -l
118
Es decir tenemos un HD /dev/sdb de 2GB (4194304 sectores*512 bytes), en estos momentos solo existe una partición de 1GB (2088387 sectores*512 bytes=1GB aproximadamente), que está montada y contiene 118 ficheros/directorios.
El disco se amplió a 2 GB pero el sistema de ficheros no ve todo este tamaño, porque tampoco se ha ampliado la partición.
El objetivo es ampliar /dev/sdb1 a 2GB, los pasos a seguir son:
1-Obtener la tabla de particiones actual de /dev/sdb
2-Desmontar el HD y modificar la tabla de particiones para redimensionar la partición /dev/sdb1
3-Redimensionar el sistema de ficheros de /dev/sdb1 y montar
Vamos por partes.
1-Obtener la tabla de particiones actual de /dev/sdb
Para evitar errores vamos utilizar la herramienta sfdisk (http://linux.die.net/man/8/sfdisk) que nos permite volcar la tabla de particiones sobre un fichero:
[root@oradb ~]# sfdisk /dev/sdb -d > partition_table.txt
[root@oradb ~]# cat partition_table.txt
# partition table of /dev/sdb
unit: sectors
/dev/sdb1 : start= 63, size= 2088387, Id=83
/dev/sdb2 : start= 0, size= 0, Id= 0
/dev/sdb3 : start= 0, size= 0, Id= 0
/dev/sdb4 : start= 0, size= 0, Id= 0
Todas las unidades con las que trabajamos son sectores.
2-Desmontar el HD y modificar la tabla de particiones para redimensionar la partición /dev/sdb1
Lo primero que hacemos es una copia del fichero obtenido en el punto anterior, para editar la nueva tabla de particiones
[root@oradb ~]# cp partition_table.txt partition_table_new.txt
Editamos la tabla quedando el fichero:
[root@oradb ~]# cat partition_table_new.txt
# partition table of /dev/sdb
unit: sectors
/dev/sdb1 : start= 63, size= 4185539, Id=83
/dev/sdb2 : start= 0, size= 0, Id= 0
/dev/sdb3 : start= 0, size= 0, Id= 0
/dev/sdb4 : start= 0, size= 0, Id= 0
El número 4185539 que es el tamaño en sectores de la partición, se ha calculado de la siguiente forma.
La ampliación del HD ha pasado de 1GB originalmente a 2GB, por tanto tenemos que calcular el incremento de 1 GB en sectores:
1GB=1024*1024*1024=1073741824 bytes
Tamaño del sector 512 bytes por tanto:
1073741824/512=2097152 sectores
Que sumamos a la salida de sfdisk incial quedando:
2088387 (valor inicial)+2097152 (valor increment)=4185539 (número de sectores que tendrá la partición)
Desmontamos, escribimos la nueva tabla de partición y forzamos una nueva lectura:
[root@oradb ~]# umount /dev/sdb1
[root@oradb ~]# sfdisk -f /dev/sdb < partition_table_new.txt
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 261 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/sdb1 0+ 129 130- 1044193+ 83 Linux
/dev/sdb2 0 - 0 0 0 Empty
/dev/sdb3 0 - 0 0 0 Empty
/dev/sdb4 0 - 0 0 0 Empty
New situation:
Warning: The partition table looks like it was made
for C/H/S=*/139/8 (instead of 261/255/63).
For this listing I'll assume that geometry.
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sdb1 63 4185601 4185539 83 Linux
start: (c,h,s) expected (0,7,8) found (0,1,1)
end: (c,h,s) expected (1023,138,8) found (260,138,8)
/dev/sdb2 0 - 0 0 Empty
/dev/sdb3 0 - 0 0 Empty
/dev/sdb4 0 - 0 0 Empty
Warning: partition 1 does not end at a cylinder boundary
Successfully wrote the new partition table
Re-reading the partition table ...
BLKRRPART: Device or resource busy
The command to re-read the partition table failed.
Run partprobe(8), kpartx(8) or reboot your system now,
before using mkfs
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
[root@oradb ~]# partprobe /dev/sdb
3-Redimensionar el sistema de ficheros de /dev/sdb1 y montar
Comprobamos la partición con e2fsck (http://linux.die.net/man/8/e2fsck), redimensionamos con resize2fs (http://linux.die.net/man/8/resize2fs) y montamos:
[root@oradb ~]# e2fsck -f /dev/sdb1
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdb1: 128/65280 files (0.0% non-contiguous), 8878/261048 blocks
[root@oradb ~]# resize2fs /dev/sdb1
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/sdb1 to 523192 (4k) blocks.
The filesystem on /dev/sdb1 is now 523192 blocks long.
[root@oradb ~]# mount /dev/sdb1 /mnt
[root@oradb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_oradb-lv_root
37G 6.7G 30G 19% /
tmpfs 1.9G 224K 1.9G 1% /dev/shm
/dev/sda1 485M 34M 426M 8% /boot
/dev/sdb1 2.0G 19M 1.9G 1% /mnt
Podemos ver que los ficheros que teníamos anteriormente siguen existiendo:
[root@oradb ~]# ls /mnt/ | wc -l
118
No es algo tan bonito como trabajar con LVM, pero es lo que hay 🙂