Перенос работающей системы на софтовый RAID1 без потери данных

Здесь хаутушка (немного устаревшая, но всё ещё полезная) по переносу работающей linux-системы на программный RAID1.
————————————————
Смотрим таблицу разделов:

fdisk -l
 
Диск /dev/hda: 80.0 ГБ, 80026361856 байт
255 heads, 63 sectors/track, 9729 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт
 
Устр-во Загр Начало Конец Блоки Id Система
/dev/hda1 * 1 9663 77618016 83 Linux
/dev/hda2 9664 9728 522112+ 82 Linux своп / Solaris
 
Диск /dev/hdb: 80.0 ГБ, 80026361856 байт
255 heads, 63 sectors/track, 9729 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт
 
Устр-во Загр Начало Конец Блоки Id Система 

По полученным данным видно, что установлены два идентичных жестких диска объемом 80 Гб. На первом диске создано 2 раздела: корневая файловая система и SWAP-раздел. Второй жесткий диск абсолютно пуст. Диски определены системой как hda и hdb.

Первым делом нам необходимо создать таблицу разделов на втором диске, идентичной первому.

sfdisk -d /dev/hda | sfdisk /dev/hdb

Опция -d делает дамп таблицы разделов.

Если Вы получите сообщение об ошибке используйте опцию —force.

Посмотрим что получилось:

fdisk -l
 
Диск /dev/hda: 80.0 ГБ, 80026361856 байт
255 heads, 63 sectors/track, 9729 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт
 
Устр-во Загр Начало Конец Блоки Id Система
/dev/hda1 * 1 9663 77618016 83 Linux
/dev/hda2 9664 9728 522112+ 82 Linux своп / Solaris
 
Диск /dev/hdb: 80.0 ГБ, 80026361856 байт
255 heads, 63 sectors/track, 9729 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт
 
Устр-во Загр Начало Конец Блоки Id Система
/dev/hdb1 * 1 9663 77618016 83 Linux
/dev/hdb2 9664 9728 522112+ 82 Linux своп / Solaris

Видно, что таблица разделов на втором диске полностью соответствует таблице разделов на первом диске.

Теперь изменим тип таблицы разделов на втором диске на Linux raid autodetect:

fdisk /dev/hdb

На запрос введем t. Пункт t – это изменение id системы раздела.
Выбираем номер раздела (напомню в нашем случае их 2).
Вводим шестнадцатеричный id код. Т.к. нам нужно Linux raid autodetect, то выбираем fd.

То же самое повторяем и для второго раздела.

Теперь записываем таблицу разделов на диск и выходим, выбрав опцию w.

Теперь загоним разделы нашего второго диска в массивы. Статус RAID намеренно выбран degraded.

mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/hdb1

Если все успешно, то получаем сообщение:

mdadm: array /dev/md0 started.

Если при попытке повторить то же самое для второго раздела:

mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/hdb2

получаем сообщение об ошибке:

mdadm: error opening /dev/md1: No such file or directory

То, воспользуемся опцией —auto:

mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/hdb2 --auto=yes

И получим сообщение, что операция прошла успешно:

mdadm: array /dev/md1 started.

Теперь выполним команду cat /proc/mdstat и убедимся, что наш деградировавший рейд работает:

# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hdb2[1]
522048 blocks [2/1] [_U]
 
md0 : active raid1 hdb1[1]
77617920 blocks [2/1] [_U]
 
unused devices:
# 

По статусу _U видим, что с первым диском у нас проблемы, что естественно, ведь его в массиве нет, а вот со вторым все ОК.

Теперь создадим файловые системы в наших массивах: ext3 в первом массиве и swap по втором:

# mkfs.ext3 /dev/md0
# mkswap /dev/md1

Теперь создадим директорию для монтирования первого массива и смонтируем его туда:

# mkdir /mnt/md0
# mount /dev/md0 /mnt/md0/

Создаем файл конфигурации mdadm – /etc/mdadm.conf:

# vim /etc/mdadm.conf

И вносим в него строку:
DEVICE partitions

Теперь заносим информацию о RAID массивах в файл конфигурации mdadm:

mdadm --detail --scan >> /etc/mdadm.conf

Теперь правим файл /etc/fstab:

# vim /etc/fstab

Меняем hda1 на md0 и hda2 на md1

Теперь необходимо отредактировать конфигурационный файл загрузчика GRUB:

# vim /boot/grub/grub.conf

Делаем две копии конфигурации текущего раздела.
Значения которые подлежат изменению подчеркнуты красным.
grubcfg

Создаем новый образ initrd командой:

# mkinitrd /boot/initrd-`uname -r`-raid1.img `uname -r`
(Обычно не требуется, т.к. генерация initrd с моддержкой mdadm происходит приустановке mdadm, но всё же вдруг кому понадобится)

Теперь переносим данные нашей системы на массив:

# cp -dpRx / /mnt/md0/
(Вообще я бы воспользовался rsync и mount —bind, но не важно)

Теперь настроим загрузчик на второй диск, введя команду grub:

# grub

Работать будем с меню GRUB:

grub> root (hd0,0)
grub> setup (hd0)
grub> root (hd1,0)
grub> setup (hd1)
grub> quit

Теперь перезагружаемся и выбираем для загрузки второе ядро.

Затем изменим тип таблицы разделов на перовом диске на Linux raid autodetect, так же, как делали с первым.

После добавляем первый раздел на первом диске в наш первый массив:

# mdadm --add /dev/md0 /dev/hda1

И второй:

# mdadm --add /dev/md1 /dev/hda2

Сейчас начался ребилдинг массива. Процесс достаточно длительный и зависит от емкости диска. За процессом можно наблюдать:

# watch cat /proc/mdstat

Теперь выполним команду cat /proc/mdstat и убедимся, что наш первый диск добавлен в массив.

Следующим шагом нам необходимо изменить файл конфигурации mdadm:
(Обычно это не требуется и всё работвет на автомате и без этого)

# vim /etc/mdadm.conf

Там необходимо удалить/закомментировать строки с параметрами дисков.

Сохраняем изменения и выходим.

Теперь соберем новые данные о массивах:

# mdadm --detail --scan >> /etc/mdadm.conf

И пересоберем образ initrd. Обратите внимание на опцию -f, она позволит перезаписать существующие данные.

# mkinitrd -f /boot/initrd-`uname -r`-raid1.img `uname -r`

Перезагружаемся и выбираем первое ядро при загрузке.

Система загрузилась, продолжаем работать.

На этом все.

—-

В основном стырено отсюда
На самом деле лучше сделать один md0 метров на 300 для /boot и md1 для lvm, внутри которого уже всё и крутится, но если надо перенести именно то, что есть – выбирать не приходится.

Комментарии | опубликовано: Июн 13, 14:23

Автологин пользователя в UTM5

Для сетей, где идёт привязка к IP-адресу довольно неудобно заставлять пользователей запоминать свои логины\пароли на вход в статистику. В одной сеточке используется UTM5. Исторически так сложилось, что пользователи не знают своих логинов\паролей в биллинг и знать не хотят. Тем, кто хотят – конечно выдадут. Да и зайдя из дома они увидят и свой логин, и могут сами сменить свой пароль, чтобы потом иметь возможность заходить на вёб не из дома.
В общем там, где это используется ВНЕЗАПНО наконец-то пришли к решению обновить древнее говно мамонта в виде FreeBSD 5.4 и до кучи переехать на linux – его админить удобнее.
На старой фре автологин уже был, но сделан он был даавно (в 2003-4 кажется) нетаповцами и зачем-то скомпилен бинарником. Видимо чтобы удобнее было запускать и этот бинарь в линуксе работать отказался. Пришлось немного пробежаться по базе и посмотреть на старый сервер. tcl я знаю лучше чем какой-либо другой язык, так что моё решение на tcl:

autologin.cgi:

#!/bin/sh
# \
exec tclsh "$0" $REMOTE_ADDR
 
set REMOTE_ADDR "$argv"
package require mysqltcl
# я считаю что указывать пароли в скрипте, который случайно может попасть пользователю не очень хорошо
source "/netup/utm5/autologin.cfg"
set mysqlsock [mysqlconnect -host $mysqlhost -user $mysqluser -password $mysqlpass -db $mysqldb]
set GRID [mysqlsel $mysqlsock "select ip_group_id from ip_groups where is_deleted = 0 and ((ip & mask &0xffffffff) = (inet_aton('$REMOTE_ADDR') & mask & 0xffffffff));" -flatlist]
if { $GRID != "" } {
        set USRID [mysqlsel $mysqlsock "select id from iptraffic_service_links where ip_group_id = '$GRID';" -flatlist]
        set ACCID [mysqlsel $mysqlsock "select account_id from service_links where id = '$USRID' and is_deleted = '0';" -flatlist]
        set LoginPassword [mysqlsel $mysqlsock "select login,password from users where basic_account = '$ACCID';" -flatlist]
        if { $LoginPassword “” } {
                set LoginPassword [mysqlsel $mysqlsock “select login,password from users where basic_account = $GRID;” -flatlist]
        }
        mysqlclose
        set LOGIN [lindex $LoginPassword 0]
        set PASSWORD [lindex $LoginPassword 1]
        set URL “https://stat/cgi-bin/utm5/aaa5?cmd=login&login=$LOGIN&password=$PASSWORD”
    } else {
        mysqlclose
        set URL “https://stat/cgi-bin/utm5/aaa5”
}

puts "<html><head>"
puts "<title></title>"
puts "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=$URL\">"
puts "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf8\">"
puts "</head>"
puts "<body>"
puts "</body>"
puts "</html>"

Содержимое /netup/utm5/autologin.cfg:
set mysqlhost "localhost"
set mysqluser "USER"
set mysqlpass "PASSWORD"
set mysqldb "UTM5"

Если кто-то напишет подобное на чём-то другом – ну и хорошо :-)
Само-собой при входе на http://stat/ и https://stat/ там стоит переадресация на https://stat/cgi-bin/utm5/autologin.cgi

Комментарии | опубликовано: Сен 5, 20:56

<--- Предыдущая страница