Linux: Полное руководство — страница 39 из 98

D

Идея надежности хранения данных волновала, волнует и будет волновать не одно поколение системных администраторов и пользователей. Используемые ОС Linux файловые системы ext2 и ext3 обладают достаточной степенью надежности, но зачастую этого мало.

Если существует вероятность потерять данные в результате выхода из строя жесткого диска, то единственным выходом из данной ситуации является использование массивов жестких дисков RAID. RAID (Redundant Array of Independent (Inexpensive) Disk) — это способ хранения данных с избыточностью на группе независимых (недорогих) жестких дисков. Под избыточностью понимается дублирование данных и хранение дополнительных кодов коррекции ошибок. Всего существует 6 уровней RAID (таблица 10.2).


Уровни RAID Таблица 10.2

УровеньОписание
0 («полосатый», striping)Группа дисководов без избыточности. Этот уровень предназначен для хранения больших объёмов данных, не умещающихся на одном диске, и ускорения доступа к ним. Последовательные блоки одного файла хранятся на разных дисководах. Емкость массива равна суммарной емкости всех дисков, образующих массив
1 (дисковое зеркало, mirroring)Дисководы, входящие в группу, содержат одинаковые данные и образуют один логический диск. Благодаря этому скорость чтения (но не записи) возрастает вдвое. Емкость массива равна емкости самого меньшего из дисков
2Запись на резные дисководы производится методом чередования «страйпов» размером в один сектор с добавлением кодов исправления ошибок
3То же, что уровень 2, но контрольные коды записываются на отдельный диск. При отказе одного из дисков оставшиеся диски можно использовать для восстановления хранившейся на нем информации
4То же, что уровень 3, но размер страйпов — насколько секторов
5 (массив с вращающейся четностью)То же, что уровень 4, но контрольные суммы хранятся не на одном дисководе. а на всех по очереди. При выходе из строя одного из дисков потерянные данные восстанавливаются с помощью контрольных сумм. Общая емкость массива вычисляется по формуле min_size*(n-1), где min_size — объем наименьшего из дисков, а n - количество дисков е массиве. Минимальное количество дисков равно трем

Чаще всего используются массивы уровней 0, 1 и 5. Иногда встречаются комбинированные способы объединения данных в массив, например RAID-10 (RAID 0+1) — это чередование блоков данных на двух парах дублирующих друг друга дисководов.

RAID-5 использует дисковое пространство экономнее, чем RAID-1, так как избыточность представляет собой не полную копию информации, а только контрольную сумму. Но за высокую эффективность использования пространства приходится платить более низкой скоростью обмена данными.

Организация массива RAID доступна не каждому из-за все еще высокой стоимости аппаратных контроллеров RAID. Хотя производители материнских плат пытаются поправить это, выпуская материнские платы со встроенными контроллерами RAID, но такие контроллеры не слишком универсальны и обладают слабыми возможностями.

ОС Linux поддерживает программные контроллеры RAID. Применение программных контроллеров имеет как свои преимущества, так и недостатки. К достоинствам относится возможность использования дисков с различными интерфейсами, например SCSI и IDE, для организации массива — программному контроллеру все равно, с чем работать. Недостатком же является дополнительная нагрузка на центральный процессор — он выполняет всю работу по обеспечению функционирования массива RAID.

Итак, приступим к созданию массива RAID. Вам понадобится любой дистрибутив с поддержкой программного контроллера RAID: такой возможностью обладают практически все современные дистрибутивы. Для включения поддержки RAID вам придется перекомпилировать ядро.

Включить поддержку RAID можно в разделе Block devices конфигуратора ядра (

make menuconfig
). Нужная опция называется RAID n support, где n — это номер уровня массива RAID. После этого нужно установить пакет raidtools, в состав которого входят программы raidhotadd, raidhotremove, mkraid и другие.

Для организации массива уровня RAID 1 нужно выделить два раздела и изменить тип этих разделов на Linux raid autodetect. Обратите внимание, я написал «два раздела», а не «два диска», так как конфигурируется программный контроллер. Конечно, лучше, чтобы эти разделы располагались на разных дисках, в противном случае от нашего массива будет мало толку.

Если ваше ядро поддерживает RAID, при загрузке системы вы должны увидеть примерно следующее:

md driver 0.90.0 MAX_MD_DEVS=256, MAX_REAL=12

raid5: measuring checksumming speed

raid5: MMX detected, trying high-speed MMX checksum routines

 pII_mmx : 980.694 MB/sec

 p5_mmx  : 999.744 MB/sec

 8regs   : 753.237 MB/sec

 32regs  : 444.246 MB/sec

using fastest function: p5_mmx (999.744 MB/sec)

md.c: sizeof(mdp_super_t) = 4096

Partition check:

hda: hda1 hda2 < hda5 hda6 hda7 hda8 >

autodetecting RAID arrays

autorun ...

... autorun DONE.

Теперь отредактируйте файл

/etc/raidtab
.

Листинг 10.2. Примерный файл /etc/raidtab для уровня 1

# Имя устройства RAID

raiddev /dev/md0

# Уровень

raid-level 1

chunk-size 8

persistent-superblock 1

# Число дисков в массиве

nr-raid-disk 2

# Число дисков, которые будут использоваться в качестве замены,

# если один из дисков выйдет из строя

nr-spare-disk 0

# Определяем первый диск RAID

device /dev/hdb1

raid-disk 0

# Определяем второй диск RAID

device /dev/hdc1

raid-disk 1

После этого нужно создать устройство

/dev/md0
, для чего выполните следующую команду:

# mkraid /dev/md0

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

man mkraid
). Если инициализация прошла успешно, в файле
/proc/mdstat
вы увидите примерно следующее:

Personalities: [raid1]

read_ahead 1024 sectors

md0: active raid1 hdc1[1] hdb1[0]

10.6. Как найти, спрятать и безвозвратно уничтожить данные

Просмотреть содержимое ASCII-файла нетрудно, но что, если вам нужно узнать, что находится в двоичном файле неизвестного формата? Можно использовать шестнадцатеричный просмотрщик hexdump, который в зависимости от указанных ключей выводит содержимое файла в десятичном (-d), восьмеричном (-о) или каноническом ASCII+шестнадцатеричном (-С) виде:

$ hexdump -С /sbin/init | less

...

0000013001 00 00 00 47 4e 55 00 00 00 00 00 02 00 00 00 |...GNU.........|

...

Но таким способом искать в двоичном файле текстовые фрагменты не слишком удобно. Утилита strings извлекает из файла последовательности печатных символов длиной не меньше указанной (по умолчанию 4 символа). В качестве файла можно указать весь дисковый раздел:

$ strings -n 18 /dev/hda4 | grep "образец для поиска"

Особенности файловой системы ext2 подсказывают, что данные можно хранить и не в файлах. В самом деле, файловая система адресует блоки размером 1, 2 или 4 Кб, но что если «хвост» файла не занимает блока целиком? Это место, «резерв» (slack), остается неиспользованным. Существуют утилиты, позволяющие записывать данные в «резервы», читать эти данные и затирать их, если необходимо. Эти данные будут невидимы для файловой системы, недоступны для обычного использования и необнаружимы средствами проверки целостности файла (integrity checkers). Таким способом можно хранить секретные данные.