Mostrando las entradas con la etiqueta sistema de archivos. Mostrar todas las entradas
Mostrando las entradas con la etiqueta sistema de archivos. Mostrar todas las entradas

domingo, 3 de octubre de 2010

Migración de sistema basado en UFS a ZFS en Solaris 10

En la entrada anterior vimos a grandes rasgos, cómo crear un ZFS y mencioné algunas de sus ventajas con respecto al tradicional UFS. En esta ocasión vamos a ver cómo migrar nuestro sistema montado sobre UFS a ZFS.

Para esto requiero un disco libre, en el cual, voy a crear el pool que va a contener el sistema, en mi caso, estoy utilizando Solaris 10 en x86, por lo que debo inicializar el disco con fdisk:

fdisk c1t1d0p0
No fdisk table exists. The default partition for the disk is:

  a 100% "SOLARIS System" partition

Type "y" to accept the default partition,  otherwise type "n" to edit the
partition table.
y

Creo una partición:

format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c1t1d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@1,0
Specify disk (enter its number): 1
selecting c1t1d0
[disk formatted]

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> p

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition> p
Current partition table (original):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0

partition> 0
Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 1
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 2606e
partition> p
Current partition table (unnamed):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       1 - 2606       19.96GB    (2606/0/0) 41865390
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0

partition> label
Ready to label disk, continue? y

partition> q

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> q

Como va a contener el sistema operativo debo hacerlo booteable:

fdisk -b /usr/lib/fs/ufs/mboot /dev/rdsk/c1t1d0p0
             Total disk size is 2610 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    Solaris2          1  2609    2609    100

SELECT ONE OF THE FOLLOWING:
   1. Create a partition
   2. Specify the active partition
   3. Delete a partition
   4. Change between Solaris and Solaris2 Partition IDs
   5. Exit (update disk configuration and exit)
   6. Cancel (exit without updating disk configuration)
Enter Selection: 5

installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t1d0s0
stage1 written to partition 0 sector 0 (abs 16065)
stage2 written to partition 0, 272 sectors starting at 50 (abs 16115)

Creamos el pool:

zpool create rpool c1t1d0s0

Ahora vamos a utilizar el Live Upgrade para iniciar esta migración, lo primero es crear un ambiente de booteo (Boot Environment) utilizando el comando lucreate:

lucreate -c BE_ufs_1009 -n BE_zfs_1009 -p rpool

Estos parámetros indican lo siguiente:

  • -c BE_ufs_1009: Es una identificación con la que vamos a nombrar el ambiente actual, es completamente a discreción. Para esta denominación en particular, estoy utilizando una muy común, BE es por boot environment, ufs por el sistema de archivo actual y 1009 por el release de Solaris.
  • -n BE_zfs_1009: Es la identificación del nuevo ambiente.
  • -p rpool: El pool que va a contener el nuevo ambiente.

Lo ejecutamos, van a aparecer algunos errores y advertencias que tienen que ver con el hecho de que es la primera vez que estamos definiendo ambiente de booteo.

Una vez concluido este proceso, revisamos los ambientes de booteo con lustatus:

lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
BE_ufs_1009                yes      yes    yes       no     -
BE_zfs_1009                yes      no     no        yes    -

Observen que el ambiente zfs aparece como completo, es muy importante que tenga este estatus. Ahora vamos a activar el nuevo ambiente con luactivate:

luactivate BE_zfs_1009
Generating boot-sign, partition and slice information for PBE <BE_ufs_1009>
A Live Upgrade Sync operation will be performed on startup of boot environment <BE_zfs_1009>.

Generating boot-sign for ABE <BE_zfs_1009>
NOTE: File </etc/bootsign> not found in top level dataset for BE <BE_zfs_1009>
Generating partition and slice information for ABE <BE_zfs_1009>
Boot menu exists.
Generating multiboot menu entries for PBE.
Generating multiboot menu entries for ABE.
Disabling splashimage
Re-enabling splashimage
No more bootadm entries. Deletion of bootadm entries is complete.
GRUB menu default setting is unaffected
Done eliding bootadm entries.

**********************************************************************

The target boot environment has been activated. It will be used when you
reboot. NOTE: You MUST NOT USE the reboot, halt, or uadmin commands. You
MUST USE either the init or the shutdown command when you reboot. If you
do not use either init or shutdown, the system will not boot using the
target BE.

**********************************************************************

In case of a failure while booting to the target BE, the following process
needs to be followed to fallback to the currently working boot environment:

1. Boot from the Solaris failsafe or boot in Single User mode from Solaris
Install CD or Network.

2. Mount the Parent boot environment root slice to some directory (like
/mnt). You can use the following command to mount:

     mount -Fufs /dev/dsk/c1t0d0s0 /mnt

3. Run <luactivate> utility with out any arguments from the Parent boot
environment root slice, as shown below:

     /mnt/sbin/luactivate

4. luactivate, activates the previous working boot environment and
indicates the result.

5. Exit Single User mode and reboot the machine.

**********************************************************************

Modifying boot archive service
Propagating findroot GRUB for menu conversion.
File </etc/lu/installgrub.findroot> propagation successful
File </etc/lu/stage1.findroot> propagation successful
File </etc/lu/stage2.findroot> propagation successful
File </etc/lu/GRUB_capability> propagation successful
Deleting stale GRUB loader from all BEs.
File </etc/lu/installgrub.latest> deletion successful
File </etc/lu/stage1.latest> deletion successful
File </etc/lu/stage2.latest> deletion successful
Activation of boot environment <BE_zfs_1009> successful.

Aparecen otros errores y advertencias e incluside nos da indicaciones de qué hacer en caso de falla, reiniciamos el sistema operativo:

shutdown -i6 -g0 –y

En el menú del GRUB elegimos la opción que corresponde a nuestro ambiente de booteo y de no ocurrir ningún error deberá iniciar el sistema operativo en forma correcta. Si observamos a los filesystem montados observamos lo siguiente:

df -h
Filesystem             size   used  avail capacity  Mounted on
rpool/ROOT/BE_zfs_1009
                        20G   4.1G    13G    24%    /
/devices                 0K     0K     0K     0%    /devices
ctfs                     0K     0K     0K     0%    /system/contract
proc                     0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
swap                   2.3G   348K   2.3G     1%    /etc/svc/volatile
objfs                    0K     0K     0K     0%    /system/object
sharefs                  0K     0K     0K     0%    /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap1.so.1
                        17G   4.1G    13G    24%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
swap                   2.3G    40K   2.3G     1%    /tmp
swap                   2.3G    24K   2.3G     1%    /var/run
/dev/dsk/c1t0d0s5      2.9G   3.0M   2.9G     1%    /export/home
rpool                   20G    35K    13G     1%    /rpool
rpool/ROOT              20G    21K    13G     1%    /rpool/ROOT

Sólo aparece /export/home en UFS, lo migramos en forma manual:

umount /export/home
rmdir /export/home
zfs create -o mountpoint=/export/home rpool/home
cd /export/home
ufsdump 0cf - /dev/dsk/c1t0d0s5 | ufsrestore rf -

Eliminamos del vfstab la línea que corresponde al /export/home y listo, ya podemos eliminar el ambiente de booteo anterior:

ludelete -f BE_ufs_1009

Nuevamente reiniciamos sistema operativo y comprobamos que inicie sin problemas.

Con esto queda como concluida la migración a ZFS, aprovechando que me queda un disco duro libre, voy a “espejear” mi sistema, es muy sencillo, por medio del comando format, borro todas las particiones del disco que quedo libre (disco 0) y creo una con todo el espacio disponible, después, la agrego al pool de datos:

zpool attach -f rpool c1t1d0s0 c1t0d0s0

Y como punto final, reinstalamos el grub en c1t0d0s0:

installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t0d0s0

Podemos monitorear el progreso de sincronización con zpool status:

zpool status
  pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h4m, 48.94% done, 0h4m to go
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c1t1d0s0  ONLINE       0     0     0
            c1t0d0s0  ONLINE       0     0     0  2.23G resilvered

errors: No known data errors

miércoles, 8 de septiembre de 2010

Creando un nuevo filesystem en Solaris

Para este ejemplo voy a utilizar la partición creada en la entrada anterior.

La partición la tenemos identificada como c1t1d0s0, es muy importante tener bien claro cuál es la partición que debemos utilizar, una confusión puede ocasionar la destrucción de un filesystem con datos y, si les ocurre lo que a mí alguna vez, para acabarla de amolar no había respaldo.

Una vez identificada la partición, debemos tener claro cuál es el “raw device” que le corresponde, normalmente a cada partición se le asocia con 2 dispositivos, el “raw” o carácter (/dev/rdsk/c?t?d?s?), y el de bloque (/dev/dsk/c?t?d?s?), podríamos decir de una manera sencilla que el raw es el que vamos a utilizar para operaciones de mantenimiento (crear, borrar, modificar, etc.) y el de bloques para las operaciones de acceso a la información (montar, desmontar, respaldar, etc.) el dispositivo que utilizaremos en el ejemplo es: /dev/rdsk/c1t1d0s0

El comando que nos permite crear nuevos filesystems es mkfs, sin embargo, para el caso de filesystems UFS lo recomendable es utilizar newfs, el cual, es uno de los llamados comandos “frontend” el cual va a invocar a mkfs con los parámetros correctos para UFS. En su forma más simple, solamente necesitamos darle como parámetro el raw device en que se va a crear el filesystem: newfs /dev/rdsk/c1t1d0s0

[root@solaris10:~] newfs /dev/rdsk/c1t1d0s0
newfs: construct a new file system /dev/rdsk/c1t1d0s0: (y/n)? y
Warning: 870 sector(s) in last cylinder unallocated
/dev/rdsk/c1t1d0s0:     20980890 sectors in 3415 cylinders of 48 tracks, 128 sectors
        10244.6MB in 214 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
 20055584, 20154016, 20252448, 20350880, 20449312, 20547744, 20646176,
 20744608, 20843040, 20941472

Lo siguiente es montar el filesystem para poder tener acceso a él, suponiendo que requerimos que el punto de montaje sea /apache, primero creamos el directorio con mkdir y montamos el filesystem con el comando mount

[root@solaris10:~] mkdir /apache
[root@solaris10:~] mount /dev/dsk/c1t1d0s0 /apache

Aquí podemos observar en el comando mount que el dispositivo que utilizamos en este caso es el de bloque, no es necesario el indicarle que tipo de filesystem es ya que, por default, Solaris asume que un filesystem de disco es UFS.

Finalmente, para que la siguiente vez que reiniciemos el sistema operativo monte automáticamente este filesystem, debemos agregarlo al archivo /etc/vfstab de esta forma:

/dev/dsk/c1t1d0s0   /dev/rdsk/c1t1d0s0   /apache  ufs  2  yes     -

Lo primero es el dispositivo de bloque, después el raw, continua el punto de montaje, sigue el tipo de filesystem, un número que indica en qué momento se le ejecuta un fsck, si se va a montar en forma automático o no y por al final las opciones de montaje. Si alguno de los parámetros no aplica o se desean las opciones por default se sustituye por “-“.

martes, 7 de septiembre de 2010

Definir particiones con format en Solaris

El comando format nos permite definir particiones en los discos duros, las cuales pueden contener un filesystem o pueden ser utilizados como swap e inclusive pueden formar parte de un administrador de volúmenes.

Al ejecutar format lo primero que aparece es una lista de discos que son reconocidos por el sistema.

[root@solaris10:~] format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c1t1d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@1,0
Specify disk (enter its number): 1


Elegimos el disco, en este caso el 1 y procedemos con el siguiente paso:

selecting c1t1d0
[disk formatted]


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> p


En esta parte indicamos que comando es el que vamos a emplear con el disco seleccionado, en este caso, le damos una "p" para seleccionar el comando partition

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition> p


En partition lo primero que nos presenta es un menú con las diferentes operaciones que podemos realizar con la tabla de particiones, prácticamente las únicas que nos son útiles para este caso son del 0 al 7, print y label. Por supuesto que antes de realizar cualquier modificación a la tabla de particiones, debemos revisar cómo se encuentra utilizando la letra "p" de print.

Current partition table (original):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0


Ya que para este ejemplo estoy utilizando un Solaris x86 aparecen 2 particiones, la 8 y la 9, las cuales estan reservadas, cuando esto lo realizamos en una SPARC esto no aparece.



La partición 2 es una representación del total del disco, esta no debe ser modificada.


El resto: 0, 1, 3, 4, 5, 6 y 7 son las que tenemos disponibles, para este ejemplo, vamos a definir la partición 0 con 10 Gb, por lo que damos un "0" y enter.


Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 1
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 10gb


Lo primero que nos pregunta es el tag, si le damos ? nos da una lista de las opciones disponibles, generalmente utilizo unassigned, puede ser cualquiera. Para flags hay dos letras, la primera puede ser "w" que indica que es de lectura escritura y la "r" solo lectura, la segunda puede ser "m" que indica que puede ser montado y la "u" que indica que no. En la siguiente indicamos el cilindro con el que vamos a iniciar, aquí si debemos ser muy cuidadosos y revisar muy bien la geometría de las particiones para evitar que unas se "empalmen" con otras. La última opción es el tamaño de la partición, en este caso los 10 Gb que requerimos.

Una vez realizado todo esto, procedemos a revisar con el comando print.

Current partition table (unnamed):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       1 - 1306       10.00GB    (1306/0/0) 20980890
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0
Si no encontramos ningún problema procedemos a guardar los cambios "etiquetando" con el comando label.



Ready to label disk, continue? y

El término etiquetar se refiere a que la tabla de particiones forma parte de la VTOC, también llamada etiqueta del disco, por lo que los cambios en la tabla implican un cambio en dicha etiqueta.

Por último salimos del comando partition con "q" y nuevamente otra "q" para salir de format.

El disco que modificamos es el c1t1d0 y la partición que creamos es "0" por lo que el nombre completo con el que lo va a reconocer el sistema es c1t1d0s0, posteriormente vamos a crear un nuevo filesystem con esta partición y la vamos a montar.

lunes, 6 de septiembre de 2010

Entendiendo al sistema de archivos en Solaris

Un sistema de archivos (filesystem) es una unidad de almacenamiento de información organizada en archivos.

En Unix estos archivos a su vez son organizados en directorios, cada uno de estos directorios puede contener archivos y a otros directorios, cada uno de estos directorios puede contener otros archivos y otros directorios. Prácticamente se pueden tener tantos directorios como se desee, sin embargo, todos tienen un directorio origen común.

Para poder accesar a los archivos de un sistema de archivos, éste debe ser “montado” sobre un directorio al que se le denomina punto de montaje.

Uno de los sistemas de archivos se le denomina sistema de archivos raíz (Root Filesystem), esto es porque todos los directorios del sistema semejan las ramas de un árbol cuyo directorio principal (/) funge como la raíz de este árbol.

En los sistemas Unix existen diferentes tipos de  filesystem, en Solaris el más común es el UFS.

En su forma más sencilla, los discos duros se dividen hasta en 7 particiones llamadas slices (rebanadas) y son 0, 1, 3, 4, 5, 6 y 7; la 2 es una representación del 100% del espacio del disco duro. Cada uno de estos slice puede contener un filesystem.

En las siguientes entradas voy a explicar cómo definir estos slices, cómo crear un filesystem y cómo montarlo.