OpenBSD FAQ - Работаем с дисками [FAQ - На главную]



Диски и разделы

Руководство по настройке дисков в OpenBSD варьируется в зависимости от используемой платформы, поэтому вы должны ознакомиться с инструкцией в файле INSTALL.<arch> в вашей системе.

Определение дисков

На большинстве платформ OpenBSD использует два драйвера для работы с почти всеми жесткими дисками: Устройства нумеруются в порядке их обнаружения во время загрузки, начиная с нуля. Первый IDE-подобный диск будет wd0, а третий SCSI-подобный диск будет sd2. Обратите внимание, что OpenBSD не обязательно нумерует диски в том же порядке, что и ваш boot ROM.

Разделы и файловые системы (ФС)

Понятие «раздел» (partition) имеют два разных значения в OpenBSD: На всех поддерживаемых платформах OpenBSD использует программу disklabel как основной метод управления ФС разделами. На платформах, использующих fdisk, один раздел MBR используется для хранения всех файловых систем OpenBSD. Этот раздел можно разбить на 16 disklabel разделов, обозначенных от a до p. Несколько label являются особенными: Чтобы создать новую ФС на disklabel разделе, используйте команду newfs(8):
# newfs sd2a
Таким образом, имя устройства плюс disklabel идентифицируют файловую систему OpenBSD. Например, идентификатор sd2a относится к файловой системе в разделе a третьего устройства sd. Его файлы устройства будут /dev/sd2a для блочного устройства и /dev/rsd2a для raw (character) устройства. Для того, чтобы определить какое устройство необходимо использовать (block или character), многие команды используют функцию opendev(3), которая автоматически расширяет sd0 до /dev/rsd0c или /dev/sd0c в зависимости от ситуации.

Уникальные disklabel идентификаторы (DUID)

По умолчанию диски идентифицируются по так называемым уникальным идентификаторам диска (Disklabel Unique Identifiers, DUID) в файле fstab(5). DUID представляет из себя 16 шестнадцатеричных случайных чисел, которые генерируются при первом создании метки диска. Они управляются устройством diskmap(4). Просмотреть DUID всех дисков можно вот так:
$ sysctl hw.disknames
hw.disknames=wd0:bfb4775bb8397569,cd0:,wd1:56845c8da732ee7b,wd2:f18e359c8fa2522b
Вы можете указать разделы на диске, добавив точку и букву раздела. Например, f18e359c8fa2522b.d является разделом d диска f18e359c8fa2522b и всегда будет ссылаться на одну и ту же область диска (refer to the same chunk of storage), независимо от того, в какой последовательности или к какому интерфейсу был подключен. Если вы поместите данные на wd2d, а затем удалите wd1 из системы и перезагрузитесь, ваши данные будут на wd1d, так как ваш старый wd2 теперь стал wd1. Тем не менее, DUID диска не изменится после загрузки.

Использование fdisk

Утилита fdisk(8) обычно используется на некоторых платформах (i386, amd64 и macppc) с целью создания разделов, распознаваемых boot ROM системы. Обычно только один fdisk раздел OpenBSD создается на диске. Внутри этого раздела затем создаются disklabel разделы.

Увидеть таблицу разделов на диске можно так:

# fdisk sd0
Disk: sd0       geometry: 553/255/63 [8883945 Sectors]
Offset: 0       Signature: 0xAA55
         Starting       Ending       LBA Info:
 #: id    C   H  S -    C   H  S [       start:      size   ]
------------------------------------------------------------------------
 0: 12    0   1  1 -    2 254 63 [          63:       48132 ] Compaq Diag.
 1: 00    0   0  0 -    0   0  0 [           0:           0 ] unused
 2: 00    0   0  0 -    0   0  0 [           0:           0 ] unused
*3: A6    3   0  1 -  552 254 63 [       48195:     8835750 ] OpenBSD
Тут раздел с OpenBSD (id A6) помечен при помощи символа *. Это говорит о том, что это загрузочный раздел (bootable partition).

На полностью чистом диске должен быть boot code в MBR (master boot record), прежде чем его можно будет использовать для загрузки. Обычно все, что вам нужно сделать для его создания, это:

# fdisk -iy sd0
В качестве альтернативы, используйте команды reinit или update в интерактивном режиме.

При помощи -e можно активировать интерактивный режим редактирования:

# fdisk -e sd0
Enter 'help' for information
fdisk: 1>
Помните, что quit сохраняет изменения и выходит из программы, а exit выходит без сохранения. Это противоположно тому, к чему многие из нас привыкли. Также обратите внимание, что fdisk не предупреждает перед сохранением изменений.

Если в вашей системе вы специально создали раздел для maintenance или диагностики, рекомендуется его не трогать или создать его перед установкой OpenBSD.

Использование disklabel

Метки диска (disk labels) используются для управления разделами файловой системы OpenBSD. Они содержат информацию о вашем диске, такие как геометрия диска и информация о файловой системе, как подробно описано в disklabel(5). Используйте команду disklabel(8) для редактирования меток (to edit the labels).

Это может помочь преодолеть ограничения на количество разделов на диске на некоторых архитектурах. Например, на i386 доступно только четыре основных раздела MBR. При помощи disk labels один из этих основных разделов будет содержит все ваши разделы OpenBSD, а остальные три могут использоваться другими операционными системами.

На платформах, использующих fdisk, вы должны оставить первую логическую дорожку (first logical track) неиспользованной ни disklabel ни fdisk. По этой причине, по умолчанию первый раздел начинается с блока 64.

Не устанавливайте swap в самом начале вашего диска на sparc64. В то время как Solaris часто это делал, OpenBSD требует, чтобы именно загрузочный раздел находился в начале диска.

Восстановление разделов после удаления метки диска (Disk Label)

Если у вас поврежденна таблица разделов, ее можно попытаться восстановить.

Копия disklabel для каждого диска сохраняется в /var/backups как часть ежедневного system maintenance. Если у вас все все еще есть раздел /var, вы можете просто считать вывод и поместить его обратно в disklabel при помощи флага -R.

Если же вы больше не имеете доступа к этому разделу, остается еще два варианта: восстановить достаточно данных на диске, чтобы можно было снова увидеть этот раздел или чтобы вы могли по крайней мере извлечь оттуда свои данные. Утилита scan_ffs(8) просматривает диск, с целью поиска разделов на нем. Вы можете использовать найденную информацию для воссоздания метки диска (recreate the disklabel). Если вы просто хотите вернуть /var, вы можете заново создать раздел для /var, затем восстановить backup метки и добавить оставшуюся часть. Утилита disklabel(8) поможет ядру распознать disklabel и попытается записать метку на диск. Поэтому, даже если область диска, содержащая disklabel, не читается, вы сможете подмонтировать ее и испрользовать до следующей перезагрузки.

Процесс загрузки в amd64

О процедуре загрузки bootstrapping для amd64 можно найти в boot_amd64(8). Процесс загрузки выглядит следующим образом:
  1. Master Boot Record (MBR) и GUID Partition Table (GPT). Подробную информацию можно найти в fdisk(8).
  2. Partition Boot Record (PBR). Первые 512 байт OpenBSD раздела на загрузочном диске содержат first stage boot loader biosboot(8). Он устанавливается при помощи утилиты installboot(8).
  3. Second stage boot loader /boot. PBR запускает программу boot(8), задача которой - поиск и загрука ядра.
Самое начало загрузки выглядит следующим образом:
Using drive 0, partition 3.                      <- MBR
Loading......                                    <- PBR
probing: pc0 com0 com1 mem[638K 1918M a20=on]    <- /boot
disk: hd0+ hd1+
>> OpenBSD/amd64 BOOT 3.33
boot>
booting hd0a:/bsd 4464500+838332 [58+204240+181750]=0x56cfd0
entry point at 0x100120

[ using 386464 bytes of bsd ELF symbol table ]
Copyright (c) 1982, 1986, 1989, 1991, 1993       <- Kernel
        The Regents of the University of California.  All rights reserved.

Резервное копирование (backup) корневого раздела (/altroot)

OpenBSD предоставляет возможность резервного копирования в /altroot при помощи daily(8) скриптов. Если переменная окружения (environment variable) установлена в ROOTBACKUP=1 в /etc/daily.local или root'овском crontab(5), и соответствующий раздел сконфигурирован в fstab(5) на монтирование в /altroot и имеет mount options xx, то каждую ночь содержимое корневого раздела (contents of the root partition) будет скопированно в раздел /altroot.

Предположим, вы хотите сделать резервную копию своего корневого раздела в раздел с DUID bfb4775bb8397569.a. Для этого добавьте следующее в /etc/fstab

bfb4775bb8397569.a /altroot ffs xx 0 0
и установите соответствующее значение переменной окружения в /etc/daily.local:
# echo ROOTBACKUP=1 >>/etc/daily.local
Так как данные, регулярно копирующиеся в /altroot, будут включать и ваш /etc, это гарантирует, что копии любых изменений в конфигурации системы будут обновляться ежедневно. Это «disk image» копия, созданная при помощи dd(1), а не копия file-by-file, поэтому размер вашего /altroot должен быть как минимум того же размера, что и корневой раздел. Как правило, имеет смысл размещать /altroot раздел на отдельном диске, который настроен таким образом, чтобы в случае сбоя основного диска, загружаться с него.

Дублирование ФС

Вот так можно сделать дубликат содержимого каталога /SRC в каталог /DST при помощи dump(8) и restore(8):
# cd /SRC && dump 0f - . | (cd /DST && restore -rf - )
или при помощи tar(1):
# cd /SRC && tar cf - . | (cd /DST && tar xpf - )

Дисковые квоты

Квоты (quotas) используются для ограничения количества места на диске, доступного для определенных пользователей и групп.

Используйте keywords userquota и groupquota для настройки каждой ФС в fstab(5), для которой вы хотите использовать квоты. По умолчанию файлы quota.user и quota.group будут создаваться в корне этих файловых систем. Вот пример из /etc/fstab:

0123456789abcdef.k /home ffs rw,nodev,nosuid,userquota 1 2
Чтобы установить квоты для пользователей, используйте edquota(8). Например, вот так:
# edquota ericj
и установите soft и hard limits:
Quotas for user ericj:
/home: KBytes in use: 62, limits (soft = 1000000, hard = 1500000)
        inodes in use: 25, limits (soft = 0, hard = 0)
В этом примере soft limit установлен в 1000000k, а hard limit установлен в 1500000k. Ограничения на количество inodes не будут применяться, поскольку соответствующие soft и hard limits установлены на 0. Пользователи, превышающие свои soft limits, получают предупреждение, и им предоставляется время, так называемый grace period, чтобы использование ими места на диске снова было ниже их пределов. Grace periods можно установить с помощью опции -t в edquota(8). По истечении grace period soft limit обрабатывается как hard limit. Это обычно приводит к ошибке allocation failure.

Используйте quotaon(8) для включения квот:

# quotaon -a
Это проверит fstab(5) и включит квоты для ФС с опциями квот. Просмотр статистики квот осуществляется при помощи quota(1).

Доступ и работа с другими ФС

Материал по этой теме можно найти в руководстве по mount(8), где содержатся примеры, разъясняющие как подключать наиболее используемые ФС. Список поддерживаемых ФС и соответствующие для этого комманды можно посмотреть при помощи:
$ man -k -s 8 mount
Не забывайте, что поддержка может быть ограничена лишь read-only операциями.

Монтирование дисковых образов

Чтобы смонтировать образ диска (disk image) в OpenBSD, надо сконфигурировать устройство vnd(4). К примеру, вот так можно смонтировать ISO-образ, который находится в /tmp/ISO.image:
# vnconfig vnd0 /tmp/ISO.image
# mount -t cd9660 /dev/vnd0c /mnt
Поскольку это ISO 9660 образ, который используется на CD- и DVD-дисках, вы должны указать тип cd9660 при его монтировании.

Вот так можно размонтировать образ и отключить (unconfigure) устройство vnd(4):

# umount /mnt
# vnconfig -u vnd0
Больше информации можно найти в руководствах vnconfig(8) и mount(8).

Расширение разделов

Если за существующим разделом на диске следует неиспользованное (unallocated) свободное место, вы можете увеличить его размер при помощи утилиты growfs(8). Убедитесь, что раздел в данный момент не смонтирован. Отредактируйте таблицу разделов в интерактивном режиме при помощи disklabel -E sd0 и изменяйте размер раздела при помощи команды m. Переконфигурировать файловую систему для использования всего раздела можно при помощи growfs(8):
# growfs sd0h
Прежде чем раздел будет смонтирован снова, его целостность должна быть проверена при помощи fsck(8):
# fsck /dev/sd0h

RAID и шифрование дисков

Программа bioctl(8) управляет как аппаратными, так и программными RAID устройствами через bio(4) уровень. Подсистема softraid(4) позволяет объединить несколько разделов OpenBSD disklabel(8) в виртуальный sd(4) диск. С этим виртуальным диском мы работаем как и с любым другим в системе.

Поддерживаемые дисциплины softraid:

Level Description Bootable on
RAID0 чередование ---
RAID1 зеркалирование amd64, arm64, i386, sparc64
RAID1C зеркалирование с шифрованием amd64, arm64, sparc64
RAID5 чередование блоков данных и контролем чётности ---
CONCAT конкатенация без избыточности, аналогично JBOD ---
CRYPTO шифрование диска amd64, arm64, i386, sparc64

Настройка диска может варьироваться от платформы к платформе. Обратите внимание, что в настоящее время «стекирование» режимов softraid не поддерживается.

Установка на зеркальную пару дисков (RAID 1)

В этом разделе описан процесс установки OpenBSD на зеркальную пару жестких дисков, и предполагается, что вы знакомы с процессом установки.

Перед использованием install скрипта перейдете в shell и настройте устройство softraid(4).

Ядро, используемое во время установки, содержит ограниченное число /dev записей во время загрузки, поэтому вам нужно будет вручную создать еще пару таких устройств, если они требуются для желаемой настройки softraid. Например, если вам потребуется три устройства sd(4) для создания «зеркала», сделайте следующее в консоли:

Welcome to the OpenBSD/amd64 7.5 installation program.
(I)nstall, (U)pgrade, (A)utoinstall or (S)hell? s
# cd /dev
# sh MAKEDEV sd0 sd1 sd2
Установшик после этого будет иметь поддержку sd0, sd1 и sd2 устройств. Если установочные компоненты будут устанавливаться с USB-устройства, не забудьте учесть и это устройство.

Далее, инициализируйте диски при помощи fdisk(8) и создайте RAID разделы при помощи disklabel(8).

Если вы загружаетесь из MBR, сделайте следующее:

# fdisk -iy sd0
# fdisk -iy sd1
Если же вы используете GPT для UEFI загрузки, сделайте следующее:
# fdisk -gy -b 532480 sd0
# fdisk -gy -b 532480 sd1
Создайте таблицу разделов (partition layout) на первом устройстве:
# disklabel -E sd0
Label editor (enter '?' for help at any prompt)
sd0> a a
offset: [64]
size: [39825135] *
FS type: [4.2BSD] RAID
sd0*> w
sd0> q
No label changes.
Скопируйте созданную таблицу разделов (partition layout) на второе устройство:
# disklabel sd0 > layout
# disklabel -R sd1 layout
# rm layout
Создайте (assemble) зеркало при помощи комманды bioctl(8):
# bioctl -c 1 -l sd0a,sd1a softraid0
scsibus1 at softraid0: 1 targets
sd2 at scsibus2 targ 0 lun 0: <OPENBSD, SR RAID 1, 005> SCSI2 0/direct fixed
sd2: 10244MB, 512 bytes/sec, 20980362 sec total
Вывод команды показывает, что теперь у нас есть новая SCSI bus и новый диск sd2. Этот том (volume) будет автоматически обнаружен и собран (assemble) во время загрузке системы.

Даже если вы создадите несколько RAID-массивов, имя устройства всегда будет softraid0.

Поскольку новое устройство, где вы планируете создать основную загрузочную запись (master boot record) и метку диска (disklabel), скорее всего содержит много мусора, настоятельно рекомендуется обнуление первого фрагмента (chunk). Будьте очень осторожны с этой командой; использование его не с тем устройством может сильно испортить ваш день. Использование команды ниже подразумевает, что созданным новым softraid устройством является sd2.

# dd if=/dev/zero of=/dev/rsd2c bs=1m count=1
Теперь вы готовы начать установку OpenBSD. Создайте все разделы на вашем новом softraid диске (sd2 в этом примере), который должен быть там, а не на sd0 или sd1 (это не-RAID диски).

Используйте следующую команду, чтобы проверить состояние (status) зеркала:

# bioctl sd2
Хорошей идеей может быть создание cron job, с целью проверки состояния «зеркала».

Пересборка зеркала

В случае проблем с диском, вы замените его, создадите разделы RAID и другие метки диска (disklabel partitions), а затем восстановите зеркало. Предполагая, что вашим RAID volume является sd2, и вы заменяете поломанный диск на sd1m, следующие команды должны быть выполнены:
# bioctl -R /dev/sd1m sd2
Это также может быть сделано в однопользовательском режиме или при помощи процедуры ramdisk ядра.

Полное шифрование диска

Как и в случае с RAID, для шифрования дисков (full disk encryption) в OpenBSD используется подсистема softraid(4) и программа bioctl(8). Инсталлятор OpenBSD предоставляет способ установки системы на полностью зашифрованный диск с использованием passphrase для его разблокировки.

В качестве альтернативы использования passphrase можно использовать ключ, хранящийся на отдельном устройстве (например, на USB-накопителе), чтобы зашифровать диск.

В (S)hell приглашении установщика инициализируйте ваш keydisk при помощи fdisk(8), затем используйте disklabel(8), чтобы создать раздел RAID объемом 1 МБ для ключа. Если ваш keydisk - sd1, а диск, который вы хотите зашифровать, - sd0, вывод будет выглядеть примерно так:

# bioctl -c C -k sd1a -l sd0a softraid0
sd2 at scsibus3 targ 1 lun 0: <OPENBSD, SR CRYPTO, 005> SCSI2 0/direct fixed
sd2: 19445MB, 512 bytes/sector, 39824607 sectors
softraid0: CRYPTO volume attached as sd2
Вам не будет предложено ввести passphrase, потому что вместо этого вы использовали keydisk. Keydisk должен быть вставлен во время загрузки.

Вы можете создать backup и восстановить ваш keydisk при помощи dd(1):

# dd bs=8192 skip=1 if=/dev/rsd1a of=backup-keydisk.img
# dd bs=8192 seek=1 if=backup-keydisk.img of=/dev/rsd1a

Шифрование внешних дисков

В этом разделе объясняется, как настроить зашифрованный softraid для внешнего USB-накопителя. Схема шагов выглядит следующим образом: Ниже приведен краткий пример шагов, где sd3 - USB-накопитель.
# dd if=/dev/urandom of=/dev/rsd3c bs=1m
# fdisk -iy sd3
# disklabel -E sd3 # make an "a" partition of type RAID
# bioctl -c C -l sd3a softraid0
New passphrase:
Re-type passphrase:
softraid0: CRYPTO volume attached as sd4
# dd if=/dev/zero of=/dev/rsd4c bs=1m count=1
# fdisk -iy sd4
# disklabel -E sd4 # make an "i" partition
# newfs sd4i
# mkdir -p /mnt/secretstuff
# mount /dev/sd4i /mnt/secretstuff
# mv somefile /mnt/secretstuff/
# umount /mnt/secretstuff
# bioctl -d sd4
Та же программа bioctl(8), использованная для создания тома, может быть использована для его подключения позже.