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). Таким способом можно хранить секретные данные.