quinta-feira, 5 de abril de 2012

Raw Devices no SuSE Linux

Tradução do artigo Raw Devices on SuSE Linux escrito originalmente por Christian Winte em 08/11/2006

Três etapas para criar um volume logico

Como podemos fazer dispositivos raw em SuSE Linux? Existe uma maneira facil de construir chunks baseado em raw device dentro de um Logical Volume Manager?

A resposta é: sim. Neste artigo, vamos aprender o básicode LVM2 (criado por Heinz Mauelshagen), e como usar isso para criar raw devices para uma instancia Informix. Não vamos passar todos os comandos que trata a LVM apenas aqueles comandos necessarios para lidar com raw devices.

Primeiro vamos olhar a versão do LVM

isis:/dev # lvm version
  LVM version:     2.02.39 (2008-06-27)
  Library version: 1.02.27 (2008-06-25)
  Driver version:  4.14.0
isis:/dev #

assim nós sabemos que temos o LVM2. É importante saber qual a versão você usa, porque volumes logicos (LV) são diferentemente representados na LVM1 e LVM2.

LVM1 armazena informações sobre LVs em /proc/lvm/VGs que mudou para /dev/mapper em LVM2
LVM2 é parte do sistema operacional SuSE desde a versão 9.3. Se não for instalado automaticamente, você pode instalar o LVM2 pelo yast2.

Para criar um volume logico temos que

  1. inicializar volumes fisicos (disco ou partições de disco)
  2. definir grupos de volumes (VGs) como conjuntos de volumos fisicos
  3. definir os volumes logicos (LVs) como subconjunto de VGs

As duas primeiras etapas será feito com o yast2, ferramenta de administração baseada em GUI do SuSE, mas você pode fazê-lo também com comandos como pvcreate e vgcreate.

Por exemplo, se você quiser fazer todo o disco /dev/hdb um volume fisico, deve-se digitar o comando abaixo

pvcreate /dev/hdb
Isto cria um descritor de grupo de volume no inicio do disco.

Talvez teremos um erro se houver uma tabela de partição no disco, então nós temos que excluir esta tabela explicitamente com o comando dd:

dd if=/dev/zero of=/dev/hdb bs=1k count=1
blockdev –rereadpt /dev/hdb

Em vez de todo o disco, podemos usar uma partição /dev/hdb1:

pvcreate /dev/hdb1

Em seguida, vamos criar um Grupo de Volume:

vgcreate vg01 /dev/hdb1

Em seguida, vamos ver o resultado:

isis:/ # pvdisplay
    --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg02
  PV Size                 931.51 GB / not usable 3.19 MB
  Allocatable            yes
  PE Size (KByte)     4096
  Total PE                238466
  Free PE                207746
  Allocated PE         30720
  PV UUID                8MZ3rV-IYi5-FEUq-G2eb-Vx3r-yH2g-tVWVwD

isis:/ # vgdisplay vg01
  --- Volume group ---
  VG Name               vg01
  System ID
  Format                   lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access              read/write
  VG Status               resizable
  MAX LV                  0
  Cur LV                   1
  Open LV                 1
  Max PV                  0
  Cur PV                   1
  Act PV                   1
  VG Size                  298.09 GB
  PE Size                   8.00 MB
  Total PE                 38155
  Alloc PE / Size       25600 / 200.00 GB
  Free  PE / Size       12555 / 98.09 GB
  VG UUID                 LGsLJH-bS0u-Cit5-cnZR-2k1F-gZAR-5jCu1G

Em meu sistema SuSE Linux o nome do grupo de volume é “vg01”, seu tamanho é de 298,09 GB e  o tamanho da PE=physical extent é 8MB. Mais tarde veremos que volumes logicos consistem de Extensões Fisicas (PE), que são mapeadas em Extensões Fisicas do VG a que pertece a LV.

Agora estamos pronto para criar o raw device para o nosso  root space. Queremos cerca de 50MB para o root space.

Crie o Volume Logico (LV)

lvcreate –L 50M –n lvol01 vg01
Rouding up size to full physical extent 56.00 MiB
Logical volume “lvol01” created

Nosso volume “lvol01” foi arredondado para o tamanho da extensão fisica completa de 56,00 MB, porque o tamanho deve ser um multiplo de 8MB, que é o tamanho da PE.

De Volume Logico para dispositivo raw

Qual o resultado do comando lvcreate? lvdisplay nos da uma descrição detalhada da LV:

--- Logical volume ---
  LV Name                /dev/vg01/lvol01
  VG Name                vg01
  LV UUID                 E9qml5-MbtZ-Kpbp-NKuJ-VuKy-CMHo-ghAyVp
  LV Write Access     ead/write
  LV Status              available
  # open                   2
  LV Size                  56.00 MiB
  Current LE             7
  Segments               1
  Allocation              inherit
  Read ahead sectors     auto
  - currently set to     1024
  Block device           253:15

Voce vê, que o “nome” da LV é /dev/vg01/lvol01. Este não é um raw device, mas apenas um link simbolico para um dispositivo de bloco:

isis:~ # ls -ail /dev/vg01/lvol01
5761 lrwxrwxrwx 1 root root 23 Apr  2 11:11 /dev/vg01/lvol01 -> /dev/mapper/vg01-lvol01
isis:~ # ls -ail /dev/mapper/vg01-lvol01
5586 brw-r----- 1 root disk 253, 15 Apr  2 11:12 /dev/mapper/vg01-lvol01
isis:~ #

Nós não podemos mudar o dispositivo de bloco de forma alguma para um raw device, mas podemos ligar um raw device a este dispositivo de bloco. Isto sera feito por um utilitario chamado raw (veja o manual).

Raw devices são dispositivos de caracteres com numero maior que 162. O primeiro numero que seria o menor (isto é, 0) é reservado para a interface de controle e geralmente é encontrado em /dev/rawctl. Esse dispositivo pode ser gerado com o comando:

isis:~ # modprobe raw

Raw devices são localizados em /dev/raw e pode ser criado com o mknod:

isis:/dev/raw # num=0
isis:/dev/raw # while [ $num -le 128 ]
> do
> mknod raw$num c 162 $num
> num`expr $num + 1`
> done

Em seguida, vamos ligar o dispositivo de bloco /dev/vg01/lvol01 com o raw device /dev/raw/raw50:

isis:/dev/raw # raw /dev/raw/raw50 /dev/vg01/lvol01
/dev/raw/raw50:   bound to major 253, minor 0

raw –qa
/dev/raw/raw50: bound to major 253, minor 0

O comando raw –qa mostra todos os dispositivos raw devices que estao ligados a outros dispositivos. O único método para identificar o volume logico que esta ligado ao raw device é comparar os numeros major e minor. É importante guardar essa informação em algum lugar em um arquivo de modo que você  possa recriar todos os dispositivos em caso de uma falha. normalmente esse arquivo é o /etc/raw.

# /etc/raw
#
# sample configuration to bind raw devices
# to block devices
#
# The format of this file is:
# raw<N>:<blockdev>
#
# example:
# ---------
# raw1:hdb1
#
# this means: bind /dev/raw/raw1 to /dev/hdb1
#
# ...
raw50:vg01/lvol01

Depois de um reboot voce pode recriar os seus raw devices, porque não são automaticamente montadas – pode ser que eles nao existem de modo que tenha que gerar o controle de dispositivos e os raw devices novamente. Para fazer isso você pode extender o script /etc/init.d/raw. /usr/sbin/rcraw é um link simbolico apra /etc/init.d/raw. Com o rcraw voce pode inicializar o raw device e ver seu status (raw –qa).

rcraw start
bind /dev/raw/raw50 to /dev/vg01/lvol01…

rcraw status
/dev/raw/raw50: bound to major 253, minor 0
                                                   

Você não pode parar raw devices. Isto somente ocorre apenas por um shutdown do sistema.

Aqui esta um exemplo do /etc/init.d/raw no meu SuSE

#! /bin/sh
# Copyright (c) 1995-2001 SuSE GmbH Nuernberg, Germany.
#
# Author: Dirk Lerner <feedback@suse.de>
#
# /etc/init.d/raw
#
#   and symbolic its link
#
# /usr/sbin/rcraw
#
### BEGIN INIT INFO
# Provides:       raw
# Required-Start: $local_fs $remote_fs
# Required-Stop:  $local_fs $remote_fs
# Default-Start:  2 3 5
# Default-Stop:   0 1 6
# Short-Description: raw devices
# Description:    raw-devices
### END INIT INFO

. /etc/rc.status

CONFIG=/etc/raw
RAW_BIN=/sbin/raw
RAW_MODULE=raw
test -x $RAW_BIN || exit 5

if [ ! -f $CONFIG ];then
echo "file: $CONFIG not found"
exit 6
fi

rc_reset
case "$1" in
    start)
      /sbin/modprobe $RAW_MODULE && sleep 2
      line=`grep -v ^# < $CONFIG`

      for i in $line;do
        rawdev=`echo $i | cut -f1 -d:`
        rawbind=`echo $i | cut -f2- -d:`
        echo -n "bind /dev/raw/$rawdev to /dev/$rawbind..."
        $RAW_BIN /dev/raw/$rawdev /dev/$rawbind > /dev/null 2>&1
        rc_status -v
      done
      ;;
    stop)
      echo -n "to unbind the rawdevice please perform a system shutdown"
      rc_failed 3
      rc_status -v
      ;;
    status)
      $RAW_BIN -qa 2> /dev/null
      rc_status -v
      ;;
    *)
      echo "Usage: $0 {start|stop|status}"
      exit 1
      ;;
esac
rc_exit

Adicionar um link symbolico

ln –s /etc/rd.d/raw /etc/rc.d/rc2.d/S21raw

Para iniciar os raw devices automaticamente após a inicialização do sistema. Por favor note que /etc/init.d/raw usa o conteudo do arquivo de configuração /etc/raw para encontrar volumes lógicos a ser vinculado.

Vamos resumir os passos para se criar um raw device:

  • criar um volume logico;
  • criar um raw device;
  • vincular o raw device com o volume logico;
  • colocar uma linha apropriada no arquivo /etc/raw.

Nenhum comentário:

Postar um comentário