mdadm, Мигрируем на новые физические диски

Сегодня мы будем переносить mdraid разделы с одних физических дисков на другие. Причём делать это будем на горячую - то есть без остановки работающих приложений.

Что мы имеем:

Ubuntu Linux 9.10
4 физических диска: два старых по 250 Gb и два новых по 500 Gb. Все диски SATA.
На старых дисках размечен совтовый Mdraid по следующей схеме:

  • /dev/md0 level=raid1 – бут;
  • /dev/md1 level=raid0 – своп;
  • /dev/md2 level=raid1 – рут и данные.

Отдельно стоит упомянуть SWAP раздел на нулевой рейде – плохая мысль) Во-первых на нормально функционирующей Linux системе своп использоваться не должен. Во-вторых при неполадках в дисковой системе север необратимо зависает. И того: выигрыш в производительности ни как не используется, за то мы изрядно теряем в стабильности. Сэкономленные в нашем случае 16Gb дискового пространства в рамках SATA дисков выглядят даже не смешно.

Кроме того из старых дисков один уже умер. Swap не работает.

Листинг /dev/sd*:
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sda6  /dev/sdb  /dev/sdc

Как видно из листинга один из старых дисков даже не определяется.

# cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda6[0]
238099264 blocks [2/1] [U_]
md1 : inactive sda5[0](S)
5855552 blocks
md0 : active raid1 sda1[0]
240832 blocks [2/1] [U_]
unused devices: <none>

Задачи будет две:

  1. Перенести md0 и md2 на новые диски
  2. Пересоздать swap в виде зеркального RAID (raid1). К счастью сделать это будет не сложно. В Swap разделе не храниться важных данных. к тому-же в текущей конфигурации он просто отсутствует. А вот если бы пришлось пере собирать диск с данными- то данные пришлось бы временно перемещать. А сделать это на горячую без LVM вряд ли получиться.

И так, поехали:
1. Нужно создать разделы под рейд на новых дисках:

#fdisk /dev/sdb
Command (m for help): m
Command action
a   toggle a bootable flag
b   edit bsd disklabel
c   toggle the dos compatibility flag
d   delete a partition
l   list known partition types
m   print this menu
n   add a new partition
o   create a new empty DOS partition table
p   print the partition table
q   quit without saving changes
s   create a new empty Sun disklabel
t   change a partition's system id
u   change display/entry units
v   verify the partition table
w   write table to disk and exit
x   extra functionality (experts only)

Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
1
Invalid partition number for type `1'
Command action
e   extended
p   primary partition (1-4)
1
Invalid partition number for type `1'
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-60801, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-60801, default 60801): 30

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): L

0  Empty           1e  Hidden W95 FAT1 80  Old Minix       bf  Solaris
1  FAT12           24  NEC DOS         81  Minix / old Lin c1  DRDOS/sec (FAT-
2  XENIX root      39  Plan 9          82  Linux swap / So c4  DRDOS/sec (FAT-
3  XENIX usr       3c  PartitionMagic  83  Linux           c6  DRDOS/sec (FAT-
4  FAT16 &lt;32M      40  Venix 80286     84  OS/2 hidden C:  c7  Syrinx
5  Extended        41  PPC PReP Boot   85  Linux extended  da  Non-FS data
6  FAT16           42  SFS             86  NTFS volume set db  CP/M / CTOS / .
7  HPFS/NTFS       4d  QNX4.x          87  NTFS volume set de  Dell Utility
8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext df  BootIt
9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       e1  DOS access
a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e3  DOS R/O
b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e4  SpeedStor
c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          eb  BeOS fs
e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi ee  GPT
f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a6  OpenBSD         f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f1  SpeedStor
12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f4  SpeedStor
14  Hidden FAT16 &lt;3 61  SpeedStor       a9  NetBSD          f2  DOS secondary
16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     fb  VMware VMFS
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): a
Partition number (1-4): 1

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

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

Не забудем изменить тип диска с Linux на Linux raid autodetect
Команда: «t», Hex код: «fd».
А также добавить бут флаг для загрузочного раздела (если такой имеется).

Ещё, в случае переноса разделов я рекомендую указывать размер диска в цилиндрах, а не в байтах. Так проще создать идентичный раздел. Посмотреть размер можно через «fdisk -l {путь диска}«.

Проделываем тоже самое со вторым диском /dev/sdc

#fdisk /dev/sdс
.
.
.

Разбиваем оставшееся дисковое пространство, чтобы оно было идентично старым дискам. В моем случае это немного не так. Я выделаю дополнительный раздел под своп. В остальном размеры логических дисков идентичны. вот что получилось:

# fdisk -l /dev/sdc

Disk /dev/sdc: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x6f91c38c

Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *           1          30      240943+  fd  Linux raid autodetect
/dev/sdc2              31       60801   488143057+   5  Extended
/dev/sdc5              31        2120    16787893+  fd  Linux raid autodetect
/dev/sdc6            2121       31762   238099333+  fd  Linux raid autodetect
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sda6  /dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdb5  /dev/sdb6  /dev/sdc  /dev/sdc1  /dev/sdc2  /dev/sdc5  /dev/sdc6

PS у меня после записи изменение fdisk выдал ошибку о невозможности заменить таблицу разделов:

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.

Это произошло потому, что к этому моменту я уже добавил в рейд один из логических дисков.
В этом случае нужно выполнить команду partprobe, и диски сразу появятся в системе.

Теперь нужно добавить эти разделы в md0.
Но для начала не мешает взглянуть на состояние диска через mdadm –detail /dev/md0

# mdadm /dev/md0 --add /dev/sdb1
mdadm: added /dev/sdb1

# mdadm /dev/md0 --add /dev/sdc1
mdadm: added /dev/sdc1

Изменим количество активных дисков для синхронизации, чтобы избавиться от spare дисков.

mdadm --grow -n 3 /dev/md0
mdadm --grow -n 3 /dev/md2

Аналогично с остальными дисками.

Теперь нужно создать раздел под Swap. Я буду делать это через пересоздание md1.

Как видно из листинга своп у меня отсутствует.
# swapon -s
Filename

Убиваем неработающий диск
# mdadm -S /dev/md1
mdadm: stopped /dev/md1

Создаем на его месте новый
# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb5 /dev/sdc5
mdadm: array /dev/md1 started.

Создадим файловую систему на новом диске:
# mkswap /dev/md1
Setting up swapspace version 1, size = 16787772 KiB
no label, UUID=33ca1464-316a-4d97-be87-7128758b86c1

Сразу активируем только что созданный SWAP.
# swapon /dev/md1

И проверяем
# swapon -s
Filename Type Size Used Priority
/dev/md1 partition 16787768 58464 -1

Редактируем /etc/fstab
Узнать UUID диска можно через команду blkid.
# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
proc /proc proc defaults 0 0
# / was on /dev/md2 during installation
UUID=3b3646e2-6865-4e0d-af35-65d938a55fb3 / ext3 relatime,errors=remount-ro 0 1
# /boot was on /dev/md0 during installation
UUID=0bc279df-f2e3-4ad9-b409-ae396eb73f18 /boot ext2 relatime 0 2
# swap was on /dev/md1 during installation
UUID=33ca1464-316a-4d97-be87-7128758b86c1 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0

В моём случае я пересоздал только раздел для SWAP, поэтому мне пришлось отредактировать только 1 UUID. Если перенос осуществляется без пересоздания разделов, то fstab править не нужно.

Затем берём информацию из mdadm –examine –scan и записываем в /etc/mdadm/mdadm.conf иначе новые md* диски подниматься не будут.

Устанавливаем GRUB на каждый новый диск:

# grub
grub> root (hd1,0)
root (hd1,0)
grub> setup (hd1)
setup (hd1)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd1)"...  17 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd1) (hd1)1+17 p (hd1,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.

grub> root (hd2,0)
root (hd2,0)
grub> setup (hd2)
setup (hd2)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd2)"...  17 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd2) (hd2)1+17 p (hd2,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.

Осталось перезагрузить, проверить как это всё работает, а также отключить старые диски.

Хорошие ссылки на тему

Как переименовать сетевые интерфейсы в Linux (eth0 в eth1, eth1 в trr_lala т.д.)

В Ubuntu, а значит и в Debian (а на самом деле много где ещё, например в Gentoo) файла /dev/eth0 нету. Потому как сетевая карта устройство не символьное, но и не блочное. Сетевые устройства хранятся вот здесь: /sys/class/net

Имена сетевых интерфейсов в Linux компьютерах в последнее время стали привязываться к конкретным устройствам.  Так, если вы вытащите сетевую карту из своего компьютера и вставите в него другую, интерфейс eth0 у вас пропадёт, а новая карточка будет называется eth1. При попытке сделать ifconfig eth0 up система будет говорить, что, такого устройства не существует.

В моём случае проблема получилась при клонирования виртуальной машины в VMWare ESXi. Дабы не случилось конфликта MAC адрес на клонированной машине отливался от MAC адреса в оригинальной VM.

Поскольку вся конфигурация у вас скорее всего прописана для интерфейса eth0, можно переписать конфигурацию. а можно переименовать интерфейс.

Все неприятности создаёт udev, который по умолчанию привязывает имена сетевых устройств к их MAC адресам. Например, в Debian Etch это находится в файле

/etc/udev/rules.d/z25_persistent-net.rules

Для Ubuntu:

/etc/udev/rules.d/70-persistent-net.rules

Для open suse:

/etc/udev/rules.d/30-network.rules

пример файла:
SUBSYSTEM==»net», ACTION==»add», DRIVERS==»?*», ATTR{address}==»XX:XX:XX:XX:XX:XX», ATTR{type}==»1″, KERNEL==»eth*», NAME=»eth0″

Достаточно отредактировать параметр NAME= для вашей новой сетевой карты. Можно кстати задать любое имя отличное от eth*

Некоторые дистрибы в добавок к persistent-net.rules содержат и другие .rules, которые переписывают файл persistent-net. При исправлении файла persistent.rules стоит обратить на это внимание, иначе могут появиться несколько правил именования, или ваши изменения будут перезаписаны.

Как правильно делать Migration на Parallels Virtuozzo Containers 4.0 под Linux

Обоснованно на личном опыте.

  1. Первое правило хорошего админа – делаем Backup.
  2. Рекомендую. Обновить virtuozzo на обеих серверах.
  3. Обязательно! Обновить Контейнер и Template для него.
  4. Чтобы не было мучительно больно делаем Clone для Контейнера (необходимо свободное место на диске исходного сервера).
  5. Делаем Migration для клона и проверяем всё ли нормально заработало.
  6. И только потом делаем Migration для самого контейнера.

Так бывает, что некоторые системные файл в контейнере становятся недоступными. Нету этих файлов и в бакапах. Зато есть в Template.

Новый формат шаблонов под Linux который появился в четвёртой версии Виртуозы: EZ Templates (Дока) подразумевает, что common пакеты будут представлены во всех производных контейнерах в виде ссылки на файлы из Шаблона.

Файлы эти хранятся в виде кеша в папке /vz/template/cache/

Только вот Migration необходимые файлы из Шаблона не переместит. Как пишут в форуме на http://forum.parallels.com/ это какой-то неведомый баг в самом Migration который тянется ещё из бох знает какой версии и так быть не должно. Но оно так.

Как результат наша перемещённая WM наполнена битыми ссылками и кучей нерабочих сервисов. Не помогает ни обновление самого контейнера, ни обновление Шаблонов. Не получилось у меня починить такую VM и другими способами. Дело в том, что такие «волшебные файлы» удалить не получиться.

Немного из результата выполнения команды ls -la /etc/apache2/mods-available/
.
.
ls: cannot access /etc/apache2/mods-available/negotiation.load: No such file or directory
ls: cannot access /etc/apache2/mods-available/dir.load: No such file or director
total 32
drwxr-xr-x 2 root root 4096 2009-11-14 13:56 .
drwxr-xr-x 7 root root 1404 2010-01-28 14:13 ..
.
.
?????????? ? ? ? ? ? deflate.conf
?????????? ? ? ? ? ? deflate.load
-rw-r--r-- 1 root root 122 2008-10-01 18:32 dir.conf
?????????? ? ? ? ? ? dir.load
-rw-r--r-- 1 root root 604 2008-10-01 18:32 disk_cache.conf

Решение проблемы с рассинхронизации шаблонов

Перед перемещением контейнера (можно и после но время простоя увеличиться) надо синхронизировать Шаблоны контейнеров.
На стороне виртуозы с которой переносим контейнер, выполняем:

# rsync -avz -e ssh /vz/template/debian DESTANETION_IP:/vz/template

  • пути заменить на свои
  • DESTANETION_IP – заменить на адрес второго сервера

На второй виртуозе выполняем:
# vzpkg update cache debian-4.0-x86_64
debian-4.0-x86_64 заменить на имя вашего шаблона.

Сначала проверяем на клоне.
Потом перемещаем боевой сервер.

…и другиее проблемы с Qmail в Plesk

Sorry. Although I'm listed as a best-preference MX or A for that host,
it isn't in my control/locals file, so I don't treat it as local. (#5.4.6)

На самом деле в моём случае произошло отключение домена за неуплату. Потребовалось просто реактивировать домен через панельку. Но причин может быть множество. Очень хорошая статья с обзором всех возможных вариантов в виде KB для плеска (правжа на английском):

I’m sending mail but I receive a bounce message with an error.

Проблема множества одновременных соединений (С10K Problem)

Linux 2.6

Как известно, по умолчанию tcp/ip в Linux 2.6 настроен на довольно высокую пропускную нагрузку.
Если предельное количество соединений для службы устанавливаться в раёне одной тысячи, а ресурсов системы более чем предостаточно поискать причину можно вот в какой месте:

Рассмотрим конкретный пример.

Служба состоит из двух частей front-end и back-end
Front часть устанавливает соединение в любом случае, но после приблизительно 1000 активных подключений соединения эти не доходят до back части.
Дело всё в том, что по tcp обещаться только front-end, а связка front-back работала на UNIX сокетах. Причём каждое подключение порождает открытие дополнительного UNIX сокета.
Кто знаком с UNIX сокетами знает, что каждый такой сокет требует создание отдельного дискриптора файла. А в linux есть явное ограничение открытых файлов для процесса. По умолчанию это 1024.

Проверить можно так:

# количество открытых Unix сокетов для демона back
$ netstat -ux -p|grep back|wc -l

# количество открытых Unix сокетов в системе
$ netstat -ux -p|wc -l

# количество открытых tpc сокетов для демона front
$ netstat -tnp|grep front|wc -l

# количество открытых tpc сокетов в системе
$ netstat -tnp|wc -l

Везде нужны права root
Снять ограничение можно здесь:

/etc/security/limits.conf

demonusername            soft    nofile   2048
demonusername            hard    nofile   2048
  • demonusername - имя пользователя с правами которого запускаться демон, использующий Unix сокеты. Можно устанавливать огриначение для группы (@demonusername) или для всех (*)
  • Параметры soft и hard используються для установки мягкого и жесткого лимита соответственно. soft может быть изменен в самой программе. hard может быть изменен только суперпользователем.
    ВНИМАНИЕ! Необходима установка и soft и hard ограничения.
  • 2048 – собственно ограничение.

    Не изменяйте лимит для всей системы и не выставляйте слишком большого числа. Все эти лимиты введены не просто так. В случае взлома, атаки или просто сбоя это может привести к негативным результатам – например потере контроля за машиной.

Далее необходим ребут, чтобы преинициализировать ядро.

Ссылки на полезные статьи:
http://www.kegel.com/c10k.html

Virtuozzo не обновляет ключи

Началось всё с того, что однажды перестала обновляться лицензия програмного продукта: Parallels Virtuozzo Containers 4.0

При попытке переустановить лицензию выскочила следующая ошибка:
KA server is not available: activatefailed: Can't connect to server ka.swsoft.com:5224

Проблема скажем с обновлениями может иметь аналогичную причину.

В этом случае правильнее всего было проверить настройки DNS на хост машине.

# nslookup ka.swsoft.com

Server:         81.200.0.1
Address:        81.200.0.1#53
 
Non-authoritative answer:
*** Can't find ka.swsoft.com: No answer

Получаем новые DNS у провайдера (в моём случае они просто работали с ошибками – пришлось искать другие).

Обновляем /etc/resolv.conf.
Перезагружается потому, что демон лицензий висит в отдельном контейнере и изменения настроек не заметит.
Всё работает.

Information:The license has been installed successfully.

По теме:
http://www.parallels.com/products/virtuozzo/

FakeRAID, ещё одна байка с плохим концом

Конфигурация.

Сервер: Серверы HP ProLiant
Контролер: Встроенный ICH9
Дисковая подсистема: 2 SATA диска в 250 Gb (RAID 1 mirror)
Операционная система: SUSE
Фактическая реализация raid на уровне ОС: DMraid

Хронология событий

Умирает второй диск.
SUSE начинает ругаться многочисленными ошибками в MFT и требует запустить fsck

Aug 23 06:12:27 xxx kernel: EXT3-fs error (device sda1): ext3_lookup: unlinked inode 2465708 in dir #2301537
Aug 23 06:12:27 xxx kernel: EXT3-fs error (device sda1): ext3_lookup: unlinked inode 2465707 in dir #2301550
Aug 23 06:12:28 xxx kernel: EXT3-fs error (device sda1): ext3_lookup: unlinked inode 2465723 in dir #2301550
Aug 23 06:12:28 xxx kernel: EXT3-fs error (device sda1): ext3_lookup: unlinked inode 2465819 in dir #2301555
Aug 23 06:12:28 xxx kernel: EXT3-fs error (device sda1): ext3_lookup: unlinked inode 2466064 in dir #2465286

По глупости запускаеться fsck.
на выходе получаем множество жизненоважных файлов с нулевым размером.
(Напомню файлы с нулевым размером восстанавливать кране тяжко и совсем не быстро)

Результат:
1) Критически важное приложение
2) 1 мёртвый диск
3) второй диск с неработающей системой и битыми данными

Хорошё если есть рабочие бакапы.
Купить новый диск, востановились архив – два часа простоя.
Вот такая вот история.

Как нужно было делать с самог начала

Будет такая штука Adaptec RAID 2405
И 3 диска: Два в зеркало и однин в Hot spare, чтобы не пришлось бегать в магазин)

Software RAID под Ubuntu 9.04

Не так давно появилась новая версия не безызвестного дистрибутива Ubuntu 9.04, а с ним и новые проблемы.

Топик касается установки linux на все виды софтового рейда(DM-RAID/fakeRAID) и последующей загрузки с этих разделов.
Проблема точно существует для RAID, построенных на dmraid и mdadm.
(далее…)

Подсчёт колличества вложенных папок и файлов для Linux

Написал маленький скрипт для bash который считает колличество вложенных папок и файлов, иначе говоря nodes файловой файловой системы

nodes.sh
#!/bin/bash
for dir in `find $1 -maxdepth 1 -type d`;
do
printf "%-8s%s\n" $[ `find $dir \! -name "." | wc -l` - 1 ] $dir;
done

RHL Самоуничтожился

Сегодня ночью пытались установить gcc на 9ый RHL.
Чтобы процес шёл веселее решили для начала установить apt.
Раз дело происходит на Red Hat для установки был использован RPM
После установки atp попросил пофиксить зависимости.
Вот что получилось:
(далее…)