вторник, 7 сентября 2010 г.

RAW устройства в RHEL

Список доступных дисков:

# ls /dev/sd*
/dev/sda /dev/sda2
/dev/sda1 /dev/sda3

Здесь sda это весь диск, а sda[1-3] это 3 партиции на sda.

# cat /proc/partitions
major minor #blocks name

8 0 26214400 sda
8 1 104391 sda1
8 2 10482412 sda2
8 3 3148740 sda3

Добавим еще несколько новых дисков:

# ls /dev/sd*
/dev/sda /dev/sda2 /dev/sdc /dev/sde
/dev/sda1 /dev/sda3 /dev/sdb /dev/sdd

# cat /proc/partitions
major minor #blocks name

8 0 26214400 sda
8 1 104391 sda1
8 2 10482412 sda2
8 3 3148740 sda3
8 16 4194304 sdb
8 32 4194304 sdc
8 48 4194304 sdd
8 64 4194304 sde

На каждом из 4 новых дисков, необходимо создать хотя бы по одному
первичному разделу:

# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or
OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected
by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-522, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-522, default 522):
Using default value 522

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Аналогично создаем разделы на оставшихся дисках (sdc, sdd, sde)

В итоге получаем следующее:

# cat /proc/partitions
major minor #blocks name

8 0 26214400 sda
8 1 104391 sda1
8 2 10482412 sda2
8 3 3148740 sda3
8 16 4194304 sdb
8 17 4192933 sdb1
8 32 4194304 sdc
8 33 4192933 sdc1
8 48 4194304 sdd
8 49 4192933 sdd1
8 64 4194304 sde
8 65 4192933 sde1

В RHEL существует утилита для работы с raw-устройствами, называемая raw.

Привязка raw-устройств в ручную осуществляется так:

# /bin/raw /dev/raw/raw1 /dev/sdb1
# /bin/raw /dev/raw/raw2 /dev/sdc1
# /bin/raw /dev/raw/raw3 /dev/sdd1
# /bin/raw /dev/raw/raw4 /dev/sde1


Просмотр файлов устройств:

# ls -lR /dev/raw*

Для того чтобы автоматически привязка осуществлялась после перезагрузки системы
в RHEL необходимо выполнить некоторые настройки:

В RHEL до 5 версии, сырые устройства настраивались примерно так:

# vi /etc/sysconfig/rawdevices

/dev/raw/raw1 /dev/sdb1
/dev/raw/raw2 /dev/sdc1
/dev/raw/raw3 /dev/sdd1
/dev/raw/raw4 /dev/sde1


Restart the rawdevices service:

# service rawdevices restart

И чтобы после перезагрузки все сохранилось :

# vi /etc/rc.local

chown oracle:oinstall /dev/raw/raw1
chown oracle:oinstall /dev/raw/raw2
chown oracle:oinstall /dev/raw/raw3
chown oracle:oinstall /dev/raw/raw4
chmod 600 /dev/raw/raw1
chmod 600 /dev/raw/raw2
chmod 600 /dev/raw/raw3
chmod 600 /dev/raw/raw4

В RHEL 5 сопосталение устройств raw выполняется согласно правилам udev.

Для этого в файл /etc/udev/rules.d/60-raw.rules нужно добавить строку:

ACTION=="add", KERNEL=="device_name", RUN+="raw /dev/raw/rawX %N"

Здесь вместо device_name необходимо указать имя исходного блочного устройства,
например /dev/sda1, а вместо X номер (например raw1)

Если известно не имя устройства, а его мажорный (A) и минорный (B) номера, строка будет выглядеть так:

ACTION=="add", ENV{MAJOR}="A", ENV{MINOR}="B", RUN+="raw /dev/raw/rawX %M %m"

Также, для установки разрешений в конце файла добавим правило:

ACTION=="add", KERNEL=="raw*", OWNER=="root", GROUP=="dba", MODE=="0660"


Содержимое файла /etc/udev/rules.d/60-raw.rules должно выглядеть примерно так:

ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdc1", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="sdd1", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="sde1", RUN+="/bin/raw /dev/raw/raw4 %N"

# set permissions on these disks for the Oracle Owner user.
ACTION=="add", KERNEL=="raw*", OWNER=="oracle", GROUP=="oinstall", MODE=="0660"


Если от старой системы в файле /etc/sysconfig/rawdevices (в RHEL) накопилось
большое количество raw-устройств, сконвертировать их можно с помощью скрипта:

#!/bin/sh

grep -v "^ *#" /etc/sysconfig/rawdevices | grep -v "^$" | while read dev major minor ; do
if [ -z "$minor" ]; then
echo "ACTION==\"add\", KERNEL==\"${major##/dev/}\", RUN+=\"/usr/bin/raw $dev %N\""
else
echo "ACTION==\"add\", ENV{MAJOR}==\"$major\", ENV{MINOR}==\"$minor\", RUN+=\"/usr/bin/raw $dev %M %m\""
fi
done


Проверка правил udev:

# udevtest /block/sdb/sdb1 | grep raw
main: run: '/bin/raw /dev/raw/raw1 /dev/.tmp-8-17'

# udevtest /class/raw/raw1 | grep mode
udev_node_add: creating device node '/dev/raw/raw1', major = '162',
minor = '1', mode = '0660', uid = '500', gid = '500'

Чтобы без перезагрузки применить эти правила, выполните команду:

# udevtrigger


После перезапуска udev убедиться, что устройства создались, можно следующим образом:

# raw -qa
/dev/raw/raw1: bound to major 8, minor 17
/dev/raw/raw2: bound to major 8, minor 33
/dev/raw/raw3: bound to major 8, minor 49
/dev/raw/raw4: bound to major 8, minor 65


Сервис udev должен быть запущен

# start_udev
Starting udev: [ OK ]


Проверим, можем ли мы из под oracle что-то писать на сырое устройство можно так:

$ dd if=/dev/zero of=/dev/raw/raw1 bs=1М count=100


Как альтернативный вариант, для установки разрешений можно попробовать создать отдельный файл:

# vi /etc/udev/rules.d/99-raw-perms.rules

KERNEL=="raw[1-4]", MODE="0640", GROUP="oinstall", OWNER="oracle"

Лучше использовать UUID

$ more /etc/udev/rules.d/60-raw.rules
# Enter raw device bindings here.
#
# An example would be:
# ACTION=="add", KERNEL=="sda", RUN+="/bin/raw /dev/raw/raw1 %N"
# to bind /dev/raw/raw1 to /dev/sda, or
# ACTION=="add", ENV{MAJOR}=="8", ENV{MINOR}=="1", RUN+="/bin/raw /dev/raw/raw2 %M %m"
# to bind /dev/raw/raw2 to the device with major 8, minor 1.

ACTION=="add", KERNEL=="sd*[1]", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="3600a0b8000263e8c000014a44c9bc710", RUN+="/bin/raw /dev/raw/raw1 %N" SYMLINK+="redoa"
ACTION=="add", KERNEL=="sd*[1]", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="3600a0b8000263ce2000015584c9bd23f", RUN+="/bin/raw /dev/raw/raw2 %N" SYMLINK+="redob"
ACTION=="add", KERNEL=="sd*[1]", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="3600a0b8000263ce2000015594c9bd3cd", RUN+="/bin/raw /dev/raw/raw3 %N" SYMLINK+="data"
ACTION=="add", KERNEL=="sd*[1]", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="3600a0b8000263e8c000014a64c9bc942", RUN+="/bin/raw /dev/raw/raw4 %N" SYMLINK+="fra"

# set permissions on these disks for the Oracle Owner user.
ACTION=="add", KERNEL=="raw[1-4]", OWNER=="oragrid", GROUP=="asmdba", MODE=="0660"



Команда devlabel

# devlabel add -s /dev/raw/raw1 -d /dev/sdb1 --uid `id -u oracle` --gid `id -g oracle`
RAW: /dev/raw/raw1 -> /dev/sdb1
Added /dev/raw/raw1 to /etc/sysconfig/devlabel

# raw -qa
/dev/raw/raw1: bound to major 8, minor 17.


Настройка  сырых  устройств  в RHEL 5 и RHEL 6:

# ls -la /dev/sd*
brw-rw---- 1 root disk 8,  0 Feb 26 10:01 /dev/sda
brw-rw---- 1 root disk 8,  1 Feb 26 10:01 /dev/sda1
brw-rw---- 1 root disk 8,  2 Feb 26 10:01 /dev/sda2
brw-rw---- 1 root disk 8, 16 Feb 26 12:45 /dev/sdb
brw-rw---- 1 root disk 8, 17 Feb 26 12:46 /dev/sdb1
brw-rw---- 1 root disk 8, 32 Feb 26 10:01 /dev/sdc
brw-rw---- 1 root disk 8, 48 Feb 26 12:46 /dev/sdd
brw-rw---- 1 root disk 8, 49 Feb 26 12:47 /dev/sdd1


# cat /proc/partitions
major minor  #blocks  name

   8       16  143247360 sdb
   8       17  143243541 sdb1
   8        0  143247360 sda
   8        1     512000 sda1
   8        2  142734336 sda2
   8       48  143247360 sdd
   8       49  143243541 sdd1
   8       32  143247360 sdc
 252        0   52428800 dm-0
 252        1   12369920 dm-1
  11        0    1048575 sr0
 252        2   77934592 dm-2
   8       32  143247360 sdc


fdisk /dev/sdc

Device contains neither a valid DOS partition table, nor Sun, SGI or
OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected
by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-522, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-522, default 522):
Using default value 522

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# cat /proc/partitions
major minor  #blocks  name

   8       16  143247360 sdb
   8       17  143243541 sdb1
   8        0  143247360 sda
   8        1     512000 sda1
   8        2  142734336 sda2
   8       48  143247360 sdd
   8       49  143243541 sdd1
   8       32  143247360 sdc
   8       33  143243541 sdc1
 252        0   52428800 dm-0
 252        1   12369920 dm-1
  11        0    1048575 sr0
 252        2   77934592 dm-2


Для  RHEL 6:


#/sbin/scsi_id -g -u -d /dev/sdc

SSun_Data_D0A07736


Create file /etc/udev/rules.d/99-oracle-asmdevices.rules with this 2 lines

KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent",
RESULT=="SSun_Data_D0A07736", NAME="asm-disk1", OWNER="oragrid", GROUP="asmadmin", MODE="0660"


#udevadm test /block/sdc/sdc1

#udevadm control --reload-rules

#start_udev


Для  RHEL 5

#ls -la /dev/asm-*

brw-rw---- 1 oragrid asmadmin 8, 33 Feb 26 15:15 /dev/asm-disk1


#/sbin/scsi_id -g -u -s /block/sdc
SSun_Data_D0A07736

# vi /etc/udev/rules.d/99-oracle-asmdevices.rules

KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s /block/$parent",
RESULT=="SSun_Data_D0A07736", NAME="asm-disk1", OWNER="oragrid", GROUP="asmadmin", MODE="0660"

#udevtest /block/sdc/sdc1

#udevtrigger

# start_udev
Starting udev: [  OK  ]
#

# ls -l /dev/asm-*
brw-rw---- 1 oragrid asmadmin 8, 33 Mar  6 07:56 /dev/asm-disk1
#