Меню

Zfs проверка на ошибки

Неспешно прикидывая таблицу функциональности NAS обнаружил в своих инструкциях досадный пробел. Данные надо не просто хранить. Хорошо бы время от времени проверять, что всё в порядке. Ведь холодные данные на дисках имеют свойство незаметно портиться, «протухать». К счастью, у нас на NAS zfs, умеющий адресовать эту проблему.Сегодня обсудим как.

Немного теории
Перевод из Вики по ссылке выше

Проведённое NetApp исследование в реальной жизни на более чем 1,5 млн жестких дисков в течение 41 месяцев выявило более 400 000 примеров протухших данных, из которых более 30 000 не были обнаружены контроллерами аппаратных RAID. Еще одно исследование, проведенное ЦЕРН в течение шести месяцев и с участием около 97 петабайт данных, показало, что около 128 мегабайт данных были необратимо повреждены.

Но это на RAID контроллерах и дисках корпоративного класса. Ваши и мои данные на десктопном железе протухают несколько быстрее.
Традиционное решение проблемы проверки целостности данных — хранение вместе с ними контрольной суммы. Считываем данные, сверяем суммы, если OK — считаем данные не повреждёнными.
А традиционное решение проблемы восстановления повреждённых данных — избыточность. Хранение 2 и более копий (зеркало, как пример RAID1) и расчёт, хранение и сличение кодов чётности ( как пример — RAID5).

Одно из важнейших положительных свойств ZFS состоит в том, что и проверка целостности и восстановление повреждений (если есть избыточность — mirror или raidz) производится автоматически на уровне файловой системы при любом чтении данных. Но читать все данные не всегда удобно. Есть команда scrub (от англ. чистить, мыть, скрести)

ВАЖНО. Во время скраба пул доступен, но его производительность уменьшается. Хотя приоритет — за другими задачами. Поэтому, к примеру, качать с-на пул торренты и одновременно делать ему скраб идея так себе. Работать будет, но долго и с избыточной нагрузкой на диски.

На практике
Из командной строки вызывается
zpool scrub Pool
— для пула по имени Pool
Если дать ключ -s текущий скраб будет остановлен
zpool scrub -s Pool

В nas4free вызов команды zpool scrub выведен и в вебгуй
Через Disks|ZFS|Pools|Tools скраб можно запустить (и остановить при необходимости)

После запуска результат можно посмотреть через
zpool status
в командной строке
Или в Disks|ZFS|Pools|Information в вебгуе

На картинке выше где scan: сказано, что идёт scrub, но так как он только начался, оставшееся время определить нельзя, надо подождать. Со временем скорость растёт, но для больших пулов полная проверка запросто может продлиться порядка суток. Скорость зависит от
— производительности процессора
— заполненности пула (в отличие от аппаратных RAID пустое место НЕ читается)
— скорости дисков. Особенно если диск при смерти, скраб может затянуться очень надолго.

Я рекомендую после запуска скраба взглянуть на статус сразу и ещё раз минут через пять. В норме все три правых столбца должны быть нулями. Но нередко там появляются небольшие цифры — это как раз сообщение о том, что скраб проверяет и по возможности исправляет данные (и метаданные).

Если на одном из дисков лезет несколько десятков (и более) ошибок — у вас проблема. Скорее всего (в этом порядке) SATA кабель, сам диск, порт контроллера подыхает и нуждается в замене. Либо диску не хватает питания.
Советую остановить скраб и взглянуть в логи, на смарт этого диска и поискать корень проблемы.

Если десятки (и более) ошибок лезут на ВСЕХ дисках — НЕМЕДЛЕННО ВЫКЛЮЧАЙТЕ СКРАБ, а затем и весь NAS. Хорошие шансы, что у вас битая память. Проверяйте, гоняйте мемтест. Хотя по некоторым практическим примерам ZFS удаётся отработать львиную долю, более 99%, ошибок вызванных сбоями в памяти, всё же битая память без контроля чётности — годный способ загубить всю информацию на пуле при скрабе. Именно поэтому в идеальном мире (и в корпоративной практике) ZFS используют на ECC (то есть с аппаратным контролем чётности) памяти. Впрочем, как и остальные файловые системы. Но Intel решила, что домашний пользователь рылом не вышел для ECC. А AMD стала слишком слаба, чтобы спорить хотя было время…

Кстати, скраб можно запускать по крону. Но именно из-за возможности вляпаться в битую память я этого делать НЕ советую, если память у вас не ECC. Да, это крайне маловероятная ситуация. Битая память должна почти работать. Шалить самую малость, не вешать систему. Но всё же гадить. Поэтому у сотен камрадов, которые общаются в профильной ветке на хоботе, такого не было, чтоб битая память именно и только на zfs повлияла. Но в Сети я выловил пару сообщений. Так что хоть и крайне маловероятно — но бережёного…

И, наконец, как часто делать скраб? IMHO в домашней практике не чаще раза в месяц и не реже раза в год на каждом из пулов.

ZFS славится своей надежностью, а тут у меня под рукой собралось несколько побитых жизнью дисков. Попробуем на raidz1 закинуть некоторый объем данных, а затем проверить их целостность, а zfs на устойчивость к такой ситуации.

Диски подключены в Adaptec RAID 2805 в качестве «Simple Volume», поверх развернут raidz1 с настройками по умолчанию (для установщика FreeBSD 11-1).

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

zfs get all zroot
NAME   PROPERTY              VALUE                       SOURCE
zroot  type                  filesystem                  -
zroot  creation              пт янв. 26 15:40 2018  -
zroot  used                  75,5G                       -
zroot  available             10,1T                       -
zroot  referenced            128K                        -
zroot  compressratio         1.01x                       -
zroot  mounted               yes                         -
zroot  quota                 none                        default
zroot  reservation           none                        default
zroot  recordsize            128K                        default
zroot  mountpoint            /zroot                      local
zroot  sharenfs              off                         default
zroot  checksum              on                          default
zroot  compression           lz4                         local
zroot  atime                 off                         local
zroot  devices               on                          default
zroot  exec                  on                          default
zroot  setuid                on                          default
zroot  readonly              off                         default
zroot  jailed                off                         default
zroot  snapdir               hidden                      default
zroot  aclmode               discard                     default
zroot  aclinherit            restricted                  default
zroot  canmount              on                          default
zroot  xattr                 off                         temporary
zroot  copies                1                           default
zroot  version               5                           -
zroot  utf8only              off                         -
zroot  normalization         none                        -
zroot  casesensitivity       sensitive                   -
zroot  vscan                 off                         default
zroot  nbmand                off                         default
zroot  sharesmb              off                         default
zroot  refquota              none                        default
zroot  refreservation        none                        default
zroot  primarycache          all                         default
zroot  secondarycache        all                         default
zroot  usedbysnapshots       0                           -
zroot  usedbydataset         128K                        -
zroot  usedbychildren        75,5G                       -
zroot  usedbyrefreservation  0                           -
zroot  logbias               latency                     default
zroot  dedup                 off                         default
zroot  mlslabel                                          -
zroot  sync                  standard                    default
zroot  refcompressratio      1.00x                       -
zroot  written               128K                        -
zroot  logicalused           75,8G                       -
zroot  logicalreferenced     11,5K                       -
zroot  volmode               default                     default
zroot  filesystem_limit      none                        default
zroot  snapshot_limit        none                        default
zroot  filesystem_count      none                        default
zroot  snapshot_count        none                        default
zroot  redundant_metadata    all                         default

S.M.A.R.T. дисков

aacd0p4

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Red
Device Model:     WDC WD40EFRX-68WT0N0
Serial Number:    WD-WCC4E6PN673U
LU WWN Device Id: 5 0014ee 20d6399e3
Firmware Version: 82.00A82
User Capacity:    4 000 787 030 016 bytes [4,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Fri Jan 26 15:25:30 2018 MSK
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Status command failed: Input/output error
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       296
  3 Spin_Up_Time            0x0027   210   208   021    Pre-fail  Always       -       6483
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       14
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   100   253   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   090   090   000    Old_age   Always       -       7986
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       14
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       10
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       186
194 Temperature_Celsius     0x0022   112   111   000    Old_age   Always       -       40
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       17
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       55

aacd1p4

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Red
Device Model:     WDC WD40EFRX-68WT0N0
Serial Number:    WD-WCC4E7LPL4AH
LU WWN Device Id: 5 0014ee 2b8213774
Firmware Version: 82.00A82
User Capacity:    4 000 787 030 016 bytes [4,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Fri Jan 26 15:26:19 2018 MSK
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Status command failed: Input/output error
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       6043
  3 Spin_Up_Time            0x0027   207   190   021    Pre-fail  Always       -       6616
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       10
  5 Reallocated_Sector_Ct   0x0033   173   173   140    Pre-fail  Always       -       803
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   090   090   000    Old_age   Always       -       7964
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       10
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       7
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       212
194 Temperature_Celsius     0x0022   108   108   000    Old_age   Always       -       44
196 Reallocated_Event_Count 0x0032   049   049   000    Old_age   Always       -       151
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       6
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       101
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       232

aacd2p4

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Green
Device Model:     WDC WD40EZRX-22SPEB0
Serial Number:    WD-WCC4E4KAK52T
LU WWN Device Id: 5 0014ee 2b6900646
Firmware Version: 80.00A80
User Capacity:    4 000 787 030 016 bytes [4,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Fri Jan 26 15:26:43 2018 MSK
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Status command failed: Input/output error
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   180   173   021    Pre-fail  Always       -       7983
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       11
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   087   087   000    Old_age   Always       -       9777
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       11
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       6
193 Load_Cycle_Count        0x0032   138   138   000    Old_age   Always       -       186920
194 Temperature_Celsius     0x0022   110   109   000    Old_age   Always       -       42
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       0

aacd3p4

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Green
Device Model:     WDC WD40EZRX-00SPEB0
Serial Number:    WD-WCC4E5ALXUHC
LU WWN Device Id: 5 0014ee 20c16eacf
Firmware Version: 80.00A80
User Capacity:    4 000 787 030 016 bytes [4,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Fri Jan 26 15:27:03 2018 MSK
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Status command failed: Input/output error
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       394
  3 Spin_Up_Time            0x0027   194   179   021    Pre-fail  Always       -       7258
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       16
  5 Reallocated_Sector_Ct   0x0033   195   195   140    Pre-fail  Always       -       160
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   090   090   000    Old_age   Always       -       7584
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       16
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       11
193 Load_Cycle_Count        0x0032   001   001   000    Old_age   Always       -       678600
194 Temperature_Celsius     0x0022   114   112   000    Old_age   Always       -       38
196 Reallocated_Event_Count 0x0032   121   121   000    Old_age   Always       -       79
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       44
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       319
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       1
200 Multi_Zone_Error_Rate   0x0008   199   199   000    Old_age   Offline      -       530

Приступаем к мучениям

В качестве тестовых данных я закинул около 71 ГБ всякой мультимедиа,

Куча ошибок чтения


aacd3: hard error cmd=read 40789032-40789207
aacd3: hard error cmd=read 40789032-40789207
aacd1: hard error cmd=read 40790712-40790967
aacd3: hard error cmd=read 40789560-40789735
aacd1: hard error cmd=read 40794064-40794319
aacd1: hard error cmd=read 40795208-40795287
aacd1: hard error cmd=read 40795824-40796079
aacd1: hard error cmd=read 40796088-40796343
aacd1: hard error cmd=read 40797240-40797423
aacd3: hard error cmd=read 21743840-21744015
aacd1: hard error cmd=read 28502624-28502799
aacd1: hard error cmd=read 28597680-28597855
aacd1: hard error cmd=read 28635368-28635623
aacd1: hard error cmd=read 37340776-37340951
aacd1: hard error cmd=read 37342712-37342887
aacd1: hard error cmd=read 37347808-37348063
aacd1: hard error cmd=read 37348072-37348327
aacd1: hard error cmd=read 37352168-37352343
aacd1: hard error cmd=read 37359472-37359647
aacd1: hard error cmd=read 37365576-37365831
aacd1: hard error cmd=read 37372960-37373215
aacd1: hard error cmd=read 37373488-37373743
aacd1: hard error cmd=read 37380608-37380863
aacd1: hard error cmd=read 37381136-37381391
aacd1: hard error cmd=read 37382984-37383239
aacd1: hard error cmd=read 57577976-57577999
aacd1: hard error cmd=read 4606480-4606495
aacd1: hard error cmd=read 7811867664-7811867679
aacd1: hard error cmd=read 7811868176-7811868191
aac0: COMMAND 0xfffffe0000e97690 (TYPE 502) TIMEOUT AFTER 137 SECONDS
aac0: COMMAND 0xfffffe0000e91650 (TYPE 502) TIMEOUT AFTER 137 SECONDS
aac0: COMMAND 0xfffffe0000e92d10 (TYPE 502) TIMEOUT AFTER 137 SECONDS
aac0: WARNING! Controller is no longer running! code= 0xbcc90100
aacd3: hard error cmd=read 40785088-40785343
aacd3: hard error cmd=read 40785352-40785607
aacd3: hard error cmd=read 40785616-40785871
aacd3: hard error cmd=read 40788240-40788495
aacd3: hard error cmd=read 40783592-40783847
aacd3: hard error cmd=read 40784648-40784903
aacd3: hard error cmd=read 40785176-40785431
aacd3: hard error cmd=read 40785440-40785695
aacd3: hard error cmd=read 21743928-21744103
aacd1: hard error cmd=read 25407280-25407535
aacd1: hard error cmd=read 28507712-28507967
aacd1: hard error cmd=read 37322056-37322311
aacd1: hard error cmd=read 37344208-37344383
aacd1: hard error cmd=read 37348160-37348415
aacd1: hard error cmd=read 37373488-37373743
aacd1: hard error cmd=read 37380696-37380951
aacd1: hard error cmd=read 37383072-37383327
aacd1: hard error cmd=read 37383776-37384031
aacd1: hard error cmd=read 37395312-37395487
aacd1: hard error cmd=read 37426368-37426623
aacd1: hard error cmd=read 40682424-40682679
aacd1: hard error cmd=read 40702816-40703071
aacd1: hard error cmd=read 40725472-40725647
aacd1: hard error cmd=read 40760224-40760479
aacd1: hard error cmd=read 40761280-40761535
aacd1: hard error cmd=read 40764536-40764711
aacd1: hard error cmd=read 40772144-40772399
aacd1: hard error cmd=read 40774520-40774775
aacd1: hard error cmd=read 40778304-40778559
aacd3: hard error cmd=read 40783592-40783847
aacd3: hard error cmd=read 40784648-40784903
aacd3: hard error cmd=read 40785176-40785431
aacd3: hard error cmd=read 40785440-40785695
aacd1: hard error cmd=read 40785792-40785879
aacd3: hard error cmd=read 40785792-40785871
aacd1: hard error cmd=read 40785792-40785879
aacd1: hard error cmd=read 40790624-40790879
aacd3: hard error cmd=read 40790000-40790175
aacd1: hard error cmd=read 40799280-40799535
aacd3: hard error cmd=read 41121032-41121287
aacd1: hard error cmd=read 44290824-44290999
aacd1: hard error cmd=read 44301408-44301583
aacd1: hard error cmd=read 44315680-44315935
aacd1: hard error cmd=read 44330184-44330359
aacd1: hard error cmd=read 44337224-44337399
aacd1: hard error cmd=read 44344472-44344727
aacd1: hard error cmd=read 51561672-51561927
aacd1: hard error cmd=read 51571528-51571783

Во время теста было много проблем с контроллером Adaptec RAID 2805, который падал с паникой на проблемных дисках, из-за чего, проверку запускал раз 6. Однако, проверка завершилась, и даже удалось не потерять данные.

Состояние пула

  pool: zroot
 state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
        repaired.
  scan: scrub in progress since Fri Jan 26 16:05:37 2018
        67,0G scanned out of 101G at 71,3M/s, 0h8m to go
        2,63M repaired, 66,05% done
config:

        NAME         STATE     READ WRITE CKSUM
        zroot        DEGRADED     0     0     0
          raidz1-0   DEGRADED     0     0     0
            aacd0p4  ONLINE       0     0     0
            aacd1p4  FAULTED     40    93     7  too many errors  (repairing)
            aacd2p4  ONLINE       0     0     0
            aacd3p4  ONLINE       0     0     0

			
  pool: zroot
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: scrub repaired 4,54M in 0h18m with 0 errors on Fri Jan 26 16:45:35 2018
config:

        NAME         STATE     READ WRITE CKSUM
        zroot        ONLINE       0     0     0
          raidz1-0   ONLINE       0     0     0
            aacd0p4  ONLINE       0     0     0
            aacd1p4  ONLINE       1     0    11
            aacd2p4  ONLINE       0     0     0
            aacd3p4  ONLINE       0     0     2

errors: No known data errors

Для вторичного подтверждения целостности использовал torrent, который не нашел ошибок в тестовом наборе.

Итоги

ZFS показал себя хорошо, даже в заведомо плохих условиях. Против ZFS работали ушатанные диски и контроллер, прошивка которого падала из-за проблем на дисках. Что примечательно, запись на диски шла очень быстро (загружал весь гигабит сетевухи), но вот чтение, и с ошибками заняло очень много времени. Что с этим делать, решайте сами 😉

NAME

zpool-scrub
begin or resume scrub of ZFS storage pools

SYNOPSIS

zpool scrub
[-s|-p]
[-w] pool

DESCRIPTION

Begins a scrub or resumes a paused scrub. The scrub examines all
data in the specified pools to verify that it checksums correctly. For
replicated (mirror, raidz, or draid) devices, ZFS automatically repairs any
damage discovered during the scrub. The zpool
status command reports the progress of the scrub and
summarizes the results of the scrub upon completion.

Scrubbing and resilvering are very similar operations. The
difference is that resilvering only examines data that ZFS knows to be out
of date (for example, when attaching a new device to a mirror or replacing
an existing device), whereas scrubbing examines all data to discover silent
errors due to hardware faults or disk failure.

Because scrubbing and resilvering are I/O-intensive operations,
ZFS only allows one at a time.

A scrub is split into two parts: metadata scanning and block
scrubbing. The metadata scanning sorts blocks into large sequential ranges
which can then be read much more efficiently from disk when issuing the
scrub I/O.

If a scrub is paused, the zpool
scrub resumes it. If a resilver is in progress, ZFS
does not allow a scrub to be started until the resilver completes.

Note that, due to changes in pool data on a live system, it is
possible for scrubs to progress slightly beyond 100% completion. During this
period, no completion time estimate will be provided.

OPTIONS

-s
Stop scrubbing.
-p
Pause scrubbing. Scrub pause state and progress are periodically synced to
disk. If the system is restarted or pool is exported during a paused
scrub, even after import, scrub will remain paused until it is resumed.
Once resumed the scrub will pick up from the place where it was last
checkpointed to disk. To resume a paused scrub issue
zpool scrub again.
-w
Wait until scrub has completed before returning.

EXAMPLES

Example
1

Status of pool with ongoing scrub:

# zpool status
  ...
  scan: scrub in progress since Sun Jul 25 16:07:49 2021
        403M scanned at 100M/s, 68.4M issued at 10.0M/s, 405M total
        0B repaired, 16.91% done, 00:00:04 to go
  ...

Where metadata which references 403M of file data has been scanned
at 100M/s, and 68.4M of that file data has been scrubbed sequentially at
10.0M/s.

PERIODIC
SCRUB

On machines using systemd, scrub timers can be enabled on per-pool
basis. weekly and monthly
timer units are provided.

systemctl enable
zfs-scrub-weekly@rpool.timer
--now
systemctl
enable
zfs-scrub-monthly@otherpool.timer
--now

SEE
ALSO

systemd.timer(5),
zpool-iostat(8),
zpool-resilver(8),
zpool-status(8)

Данный справочник является переводом данной статьи. Авторы перевода: Евгений Ратников и Сгибнев Михаил. Огромное им спасибо за проделанную работу!

Данная информация представлена в интернете на множестве ресурсов. Оригинальная статья оформлена в виде таблицы, я же оформлю ее в привычном для моего блога формате — в формате пошагового обучения.

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

man zpool
man zfs

Так как включить в пул (zpool) можно любые сущности файловой системы, автор приводит примеры построения пулов и работы с ними с использованием простых файлов. Итак, создадим несколько файлов, с которыми будем работать подобно дискам.

cd /
mkfile 100m disk1 disk2 disk3 disk5
mkfile 50m disk4

Мы создали 5 «виртуальных дисков». Четыре имею размер по 100 Мб, а один — 50 Мб. Это пригодится для демонстрации работы с устройствами (разделами) разной ёмкости.

Работа с пулом ZFS
#

Теперь создадим простой пул без избыточности, затем проверим его размер и использование.

zpool create myzfs /disk1 /disk2
zpool list

NAME          SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
myzfs         191M     94K    191M     0%  ONLINE     -

Созданы пул автоматически монтируется в каталог /myzfs. Посмотрим более детальную информацию о нашем хранилище.

zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          /disk1    ONLINE       0     0     0
          /disk2    ONLINE       0     0     0

errors: No known data errors

Из вывода видно, что в пул включены два диска. Пул без избыточности (не mirror и не RAIDZ).

Теперь попробуем удалить только что созданный пул. Должны же мы это уметь.

zpool destroy myzfs
zpool list

no pools available

Попробуем снова создать пул типа MIRROR (зеркало), но на этот раз попытаемся включить в него диски разного размера. Zpool не даст нам этого сделать. Чтобы безоговорочно создать такой пул, используйте опцию -f, но в этом случае помните — размер зеркала будет равен объему наименьшего диска.

zpool create myzfs mirror /disk1 /disk4

invalid vdev specification
use '-f' to override the following errors:
mirror contains devices of different sizes

Создать зеркалируемое (MIRROR) хранилище можно на двух и более устройствах. Сколько устройств в пуле типа MIRROR — столько у нас есть одинаковых копий данных.

zpool create myzfs mirror /disk1 /disk2 /disk3
zpool list
NAME          SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
myzfs        95.5M    112K   95.4M     0%  ONLINE     -

zpool status -v
  pool: myzfs
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            /disk1  ONLINE       0     0     0
            /disk2  ONLINE       0     0     0
            /disk3  ONLINE       0     0     0

errors: No known data errors

Вместо зеркалирования можно использовать массивы RAID. Для этого необходимо создавать пул типа raidz вместо mirror. Подробнее в хендбуке.

Давайте теперь исключим один из дисков из пула. Так как этот диск относится к зеркалу (MIRROR), то при его исключении никаких проблем не возникает.

zpool detach myzfs /disk3
zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            /disk1  ONLINE       0     0     0
            /disk2  ONLINE       0     0     0

errors: No known data errors

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

zpool attach myzfs /disk1 /disk3
zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: resilver completed with 0 errors on Tue Sep 11 13:31:49 2007
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            /disk1  ONLINE       0     0     0
            /disk2  ONLINE       0     0     0
            /disk3  ONLINE       0     0     0

errors: No known data errors

А что будет, если попытаемся удалить, а не исключить устройство из пула? Zpool сообщит нам о том, что устройство не может быть удалено. Для начала его нужно отключить.

zpool remove myzfs /disk3

cannot remove /disk3: only inactive hot spares can be removed

zpool detach myzfs /disk3

Теперь давайте попробуем добавить диск горячей замены (hot spare) к нашему пулу.

zpool add myzfs spare /disk3
zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            /disk1  ONLINE       0     0     0
            /disk2  ONLINE       0     0     0
        spares
          /disk3    AVAIL   

errors: No known data errors

А теперь удалим его из пула.

zpool remove myzfs /disk3
zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            /disk1  ONLINE       0     0     0
            /disk2  ONLINE       0     0     0

errors: No known data errors

Теперь попробуем отключить один из дисков. Пока диск отключен, на него не будет производиться запись и с него не будет производиться чтение. Если использовать параметр -t, то при перезагрузке сервера диск вернется в состояние онлайн автоматически.

zpool offline myzfs /disk1
zpool status -v

  pool: myzfs
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning 
        in a degraded state.
action: Online the device using 'zpool online' or replace the device 
        with 'zpool replace'.
 scrub: resilver completed with 0 errors on Tue Sep 11 13:39:25 2007
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       DEGRADED     0     0     0
          mirror    DEGRADED     0     0     0
            /disk1  OFFLINE      0     0     0
            /disk2  ONLINE       0     0     0

errors: No known data errors

Обратите внимание на состояние пула: DEGRADED

Теперь включим этот диск.

zpool online myzfs /disk1
zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: resilver completed with 0 errors on Tue Sep 11 13:47:14 2007
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            /disk1  ONLINE       0     0     0
            /disk2  ONLINE       0     0     0

errors: No known data errors

Состояние пула снова ONLINE.

В данный момент в нашем пуле два диска: disc1 и disc2. Также в системе имеется диск disc3, но он не подключен к пулу. Предположим, что disc1 вышел из строя и его нужно заменить на disc3.

zpool replace myzfs /disk1 /disk3
zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: resilver completed with 0 errors on Tue Sep 11 13:25:48 2007
config:

        NAME        STATE     READ WRITE CKSUM
        myzfs       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            /disk3  ONLINE       0     0     0
            /disk2  ONLINE       0     0     0

errors: No known data errors

Периодически для исправления ошибок необходимо выполнять процедуру чистки (scrubbing) для пулов типа MIRROR или RAID-Z. Данная процедура находит ошибки в контрольных суммах и исправляет их. Также восстанавливаются сбойные блоки.

Данная операция слишком ресурсоемка! Следует выполнять ее только во время наименьшей нагрузки на пул.

zpool scrub myzfs

Если необходимо перенести пул в другую систему, то его необходимо сначала экспортировать.

zpool export myzfs
pool list

no pools available

А затем импортировать в новой системе.

Если ключ -d не указать, то команда ищет /dev/dsk. Так как в данном примере мы используем файлы, необходимо указать директорию с файлами используемыми хранилищем.

zpool import -d / myzfs
zpool list

NAME          SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
myzfs        95.5M    114K   95.4M     0%  ONLINE     -

Обновление версии пула. Показать версию используемого пула. Флаг -v показывает возможности, поддерживаемые данным пулом. Используйте флаг -a, чтобы обновить все доступные пулы до новейшей из них версии. Обновленные пулы больше не будут доступны из систем, на которых работают более старые версии.

zpool upgrade
This system is currently running ZFS pool version 8.

All pools are formatted using this version.


zpool upgrade -v

This system is currently running ZFS pool version 8.

The following versions are supported:

VER  DESCRIPTION
---  --------------------------------------------------------
 1   Initial ZFS version
 2   Ditto blocks (replicated metadata)
 3   Hot spares and double parity RAID-Z
 4   zpool history
 5   Compression using the gzip algorithm
 6   pool properties
 7   Separate intent log devices
 8   Delegated administration
For more information on a particular version, including supported 
releases, see:

http://www.opensolaris.org/os/community/zfs/version/N

Where 'N' is the version number.

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

zpool iostat 5
               capacity     operations    bandwidth 
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
myzfs        112K  95.4M      0      4     26  11.4K
myzfs        112K  95.4M      0      0      0      0
myzfs        112K  95.4M      0      0      0      0

Работа с файловой и другими системами ZFS
#

Файловая система
#

Создадим файловую систему в нашем пуле. Затем проверим автомонтирование новой файловой системы.

zfs create myzfs/colin
df -h

Filesystem   kbytes    used   avail capacity  Mounted on
...
myzfs/colin  64M        18K     63M       1%  /myzfs/colin

Получить список файловых систем ZFS можно следующей командой.

zfs list

NAME          USED  AVAIL  REFER  MOUNTPOINT
myzfs         139K  63.4M    19K  /myzfs
myzfs/colin    18K  63.4M    18K  /myzfs/colin

В данный момент в нашем пуле имеется одно зеркало, в которое входят два диска: disc2 и disc3.

Давайте попробуем расширить наш пул. Попытаемся добавить к нему disc1

zpool add myzfs /disk1

invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses mirror and new vdev is file

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

Добавим к пулу новое зеркало, состоящее из дисков: disc1 и disc5

zpool add myzfs mirror /disk1 /disk5
zpool status -v

  pool: myzfs
 state: ONLINE
 scrub: none requested
config:

        NAME         STATE     READ WRITE CKSUM
        myzfs        ONLINE       0     0     0
          mirror     ONLINE       0     0     0
            /disk3   ONLINE       0     0     0
            /disk2   ONLINE       0     0     0
          mirror     ONLINE       0     0     0
            /disk1   ONLINE       0     0     0
            /disk5   ONLINE       0     0     0

errors: No known data errors

Добавим теперь к пулу еще одну файловую систему и посмотрим, как это отразится на размере файловых систем, входящих в пул.

zfs create myzfs/colin2
zfs list

NAME           USED  AVAIL  REFER  MOUNTPOINT
myzfs          172K   159M    21K  /myzfs
myzfs/colin     18K   159M    18K  /myzfs/colin
myzfs/colin2    18K   159M    18K  /myzfs/colin2

Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом заключается одно из преимуществ системы ZFS — по умолчанию нет никакого ограничения на файловые системы.

Чтобы явно управлять объемом файловых систем, можно прибегнуть к резервированию — выделению гарантированного объема для файловой системы, либо квотированию — ограничению файловой системы по максимальному объему.

Давайте зарезервируем для файловой системы /myzfs/colin место в пуле, равное 20 Мб. Остальные файловые системы, заполняя пул, в любом случае оставят для этой файловой системы 20 Мб места.

zfs set reservation=20m myzfs/colin
zfs list -o reservation

RESERV
  none
   20M
  none

Теперь для файловой системы /myzfs/colin2 установим квоту в 20 Мб. Это означает, что данная файловая система не сможет занять в пуле более 20 Мб, даже если пул будет полностью свободным.

zfs set quota=20m myzfs/colin2
zfs list -o quota myzfs/colin myzfs/colin2

QUOTA
 none
  20M

Также для файловой системы /myzfs/colin2 включим сжатие. Сжатие достаточно эффективно работает на уровне ZFS практически без потерь производительности (конечно же, при условии, что производительности сервера достаточно). Вместо compression=on можно использовать compression=gzip.

zfs set compression=on myzfs/colin2
zfs list -o compression

COMPRESS
     off
     off
      on

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

zfs set sharenfs=on myzfs/colin2
zfs get sharenfs myzfs/colin2 

NAME           PROPERTY  VALUE     SOURCE
myzfs/colin2   sharenfs  on        local

Точно так же в одну команду ресурс можно сделать доступным по протоколу SMB. Что пользователям ОС Windows наверняка пригодится.

zfs set sharesmb=on myzfs/colin2
zfs get sharesmb myzfs/colin2

NAME           PROPERTY  VALUE     SOURCE
myzfs/colin2   sharesmb  on        local

Для повышения надежности (если у вас обычный пул, без избыточности), можно использовать следующую опцию файловой системы.

zfs set copies=2 myzfs/colin2

Теперь в файловой системе будет храниться по две копии каждого блока. Это имеет смысл, если пул без избыточности (mirror / raidz).

Snapshots (снепшоты или снимки состояния)
#

Создать снепшот файловой системы очень просто. Давайте создадим снепшот для файловой системы myzfs/colin и назовем его test.

zfs snapshot myzfs/colin@test
zfs list

NAME               USED  AVAIL  REFER  MOUNTPOINT
myzfs             20.2M   139M    21K  /myzfs
myzfs/colin         18K   159M    18K  /myzfs/colin
myzfs/colin@test      0      -    18K  -
myzfs/colin2        18K  20.0M    18K  /myzfs/colin2

Если появится необходимость отката к снепшоту, достаточно выполнить одну команду.

zfs rollback myzfs/colin@test

Снэпшот можно подмониторовать, как обычно. Например так.

mount -t zfs myzfs/colin@test /mnt

Даже можно клонировать файловую системы из снепшота в новую файловую систему.

zfs clone myzfs/colin@test myzfs/colin3
zfs list

NAME               USED  AVAIL  REFER  MOUNTPOINT
myzfs             20.2M   139M    21K  /myzfs
myzfs/colin         18K   159M    18K  /myzfs/colin
myzfs/colin@test      0      -    18K  -
myzfs/colin2        18K  20.0M    18K  /myzfs/colin2
myzfs/colin3          0   139M    18K  /myzfs/colin3

Теперь давайте удалим наши файловые системы /myzfs/colin и /myzfs/colin2

Сперва удалим пустую файловую систему /myzfs/colin2

zfs destroy myzfs/colin2
zfs list

NAME               USED  AVAIL  REFER  MOUNTPOINT
myzfs             20.1M   139M    22K  /myzfs
myzfs/colin         18K   159M    18K  /myzfs/colin
myzfs/colin@test      0      -    18K  -
myzfs/colin3          0   139M    18K  /myzfs/colin3

Файловая система удалилась без проблем. Теперь удалим файловую систему, для которой существует снепшот.

zfs destroy myzfs/colin 

cannot destroy 'myzfs/colin': filesystem has children
use '-r' to destroy the following datasets:
myzfs/colin@test

Удаление невозможно, т.к. у файловой системы имеется дочерний объект. Можно воспользоваться параметром -r чтобы удалить файловую систему вместе со всеми дочерними объектами рекурсивно.

Мы можем отключить снепшот от /myzfs/colin и оставить его дочерним только для /myzfs/colin3

zfs promote myzfs/colin3
zfs list

NAME                USED  AVAIL  REFER  MOUNTPOINT
myzfs              20.1M   139M    21K  /myzfs
myzfs/colin            0   159M    18K  /myzfs/colin
myzfs/colin3         18K   139M    18K  /myzfs/colin3
myzfs/colin3@test      0      -    18K  -


zfs destroy myzfs/colin 
zfs list

NAME                USED  AVAIL  REFER  MOUNTPOINT
myzfs               147K   159M    21K  /myzfs
myzfs/colin3         18K   159M    18K  /myzfs/colin3
myzfs/colin3@test      0      -    18K  -

Теперь сделанный ранее снепшот для /myzfs/colin стал дочерним объектом /myzfs/colin3. Таким образом у файловой системы /myzfs/colin больше нет дочерних объектов и ее можно без труда разобрать (удалить).

Если вдруг понадобиться переименовать ранее созданную файловую систему или снепшот, то можно воспользоваться следующими командами.

zfs rename myzfs/colin3 myzfs/bob
zfs list

NAME             USED  AVAIL  REFER  MOUNTPOINT
myzfs            153K   159M    21K  /myzfs
myzfs/bob         18K   159M    18K  /myzfs/bob
myzfs/bob@test      0      -    18K  -

zfs rename myzfs/bob@test myzfs/bob@newtest
zfs list

NAME                USED  AVAIL  REFER  MOUNTPOINT
myzfs               146K   159M    20K  /myzfs
myzfs/bob            18K   159M    18K  /myzfs/bob
myzfs/bob@newtest      0      -    18K  -

Снова вернемся к пулам
#

Получить полную информацию о пулах можно следующим образом.

zfs get all

NAME               PROPERTY       VALUE                  SOURCE
myzfs              type           filesystem             -
myzfs              creation       Tue Sep 11 14:21 2007  -
myzfs              used           146K                   -
myzfs              available      159M                   -
myzfs              referenced     20K                    -
[...]

Если пул нам более не нужен, можем его удалить. Однако, нельзя удалить пул, в котором имеются активные файловые системы.

zpool destroy myzfs

cannot destroy 'myzfs': pool is not empty
use '-f' to force destruction anyway

Чтобы принудительно удалить пул, используйте параметр -f (не выполняйте это сейчас. Пул нам еще понадобится далее)

zpool destroy -f myzfs
zpool status -v

no pools available

Отключить файловую систему от пула можно следующим образом.

zfs unmount myzfs/bob
df -h

myzfs                  159M    20K   159M     1%    /myzfs

Подключить файловую систему к пулу вот так.

zfs mount myzfs/bob
df -h

myzfs                  159M    20K   159M     1%    /myzfs
myzfs/bob              159M    18K   159M     1%    /myzfs/bob

Снепшот можно сделать и на удаленный ресурс (или другое место в локальной системе).

zfs send myzfs/bob@newtest | ssh localhost zfs receive myzfs/backup
zfs list

NAME                   USED  AVAIL  REFER  MOUNTPOINT
myzfs                  172K   159M    20K  /myzfs
myzfs/backup            18K   159M    18K  /myzfs/backup
myzfs/backup@newtest      0      -    18K  -
myzfs/bob               18K   159M    18K  /myzfs/bob
myzfs/bob@newtest         0      -    18K  -

В данном случае снепшот передан zfs receive на локальном узле (в демонстрационных целях). В реальной ситуации таким образом можно сделать снепшот на другой узел сети.

Zpool ведет собственную историю всех команд. Посмотреть историю можно следующим образом.

zpool history

History for 'myzfs':
2007-09-11.15:35:50 zpool create myzfs mirror /disk1 /disk2 /disk3
2007-09-11.15:36:00 zpool detach myzfs /disk3
2007-09-11.15:36:10 zpool attach myzfs /disk1 /disk3
2007-09-11.15:36:53 zpool detach myzfs /disk3
2007-09-11.15:36:59 zpool add myzfs spare /disk3
2007-09-11.15:37:09 zpool remove myzfs /disk3
2007-09-11.15:37:18 zpool offline myzfs /disk1
2007-09-11.15:37:27 zpool online myzfs /disk1
2007-09-11.15:37:37 zpool replace myzfs /disk1 /disk3
2007-09-11.15:37:47 zpool scrub myzfs
2007-09-11.15:37:57 zpool export myzfs
2007-09-11.15:38:05 zpool import -d / myzfs
2007-09-11.15:38:52 zfs create myzfs/colin
2007-09-11.15:39:27 zpool add myzfs mirror /disk1 /disk5
2007-09-11.15:39:38 zfs create myzfs/colin2
2007-09-11.15:39:50 zfs set reservation=20m myzfs/colin
2007-09-11.15:40:18 zfs set quota=20m myzfs/colin2
2007-09-11.15:40:35 zfs set compression=on myzfs/colin2
2007-09-11.15:40:48 zfs snapshot myzfs/colin@test
2007-09-11.15:40:59 zfs rollback myzfs/colin@test
2007-09-11.15:41:11 zfs clone myzfs/colin@test myzfs/colin3
2007-09-11.15:41:25 zfs destroy myzfs/colin2
2007-09-11.15:42:12 zfs promote myzfs/colin3
2007-09-11.15:42:26 zfs rename myzfs/colin3 myzfs/bob
2007-09-11.15:42:57 zfs destroy myzfs/colin
2007-09-11.15:43:23 zfs rename myzfs/bob@test myzfs/bob@newtest
2007-09-11.15:44:30 zfs receive myzfs/backup

Ну вот. Основные команды для работы с пулами ZFS усвоены.

Теперь можно удалить сам пул и файлы. Они нам больше не пригодятся.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

ZFS относительно новая система, разработанная Sun для Solaris.

Поскольку код ZFS не соответствует лицензии GPL, ее нельзя интегрировать с ядром Linux.

По этой причине Linux поддерживает эту файловую систему лишь опосредованно, через FUSE.

$ man zpool

$ man zfs

Более подробная информация дается здесь:

http://zfs-fuse.net

http://www.nas-faq.ml/zfs/

https://www.gotoadm.ru/basic-commands-for-zfs/

https://blog.denisbondar.com/post/zfs-manual-rus

https://linuxhint.com/install-zfs-debian/

https://unixhelp.org/how-to-install-add-apt-repository-on-debian-9-10-ubuntu-18-04-16-04/

https://neoserver.ru/help/uvelichenie_diskovogo_prostranstva_v_os_freebsd

https://xakep.ru/2014/07/08/zfs-at-home/

install zfs debian 10

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

0. добавляем репозиторий contrib

apt update

apt y install softwarepropertiescommon dirmngr apttransporthttps lsbrelease cacertificates

addaptrepository contrib

apt update

1. cтавим необходимые пакеты для дальнейшей установки

apt install Linuxheaders$(uname r) Linuximageamd64 spl kmod

2. устанавливаем zfs (установка вылетит не переживаем)

apt install zfsutilslinux zfsdkms zfszed

3. включаем модуль zfs

modprobe zfs

4. исправляем ошибки и до установим zfs

apt f install

5. добавляем модуль в автозагрузку создав файл

nano /etc/modulesload.d/zfs.conf

———————————

zfs

———————————

6. перезагружаем и проверяем

reboot перезагрузка

lsmod | grep zfs проверяем что модуль загрузился после перезагрузки

Создание файлов для тестов:

dd if=/dev/zero of=/mnt/file5gb.img bs=1M count=5000

cd /mnt переходим в каталог mnt

fallocate l 1G /disk_name.img

mkfile 100m disk1 disk2 disk3 disk5

mkfile 50m disk4

zpool

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

zpool это основной инструмент управления разделами и функциональными возможностями ZFS.

$ zpool команда параметры опции устройства

add добавить раздел к существующему пулу

attach добавить раздел или жесткий диск к пулу файловой системы

clean очистить все ошибки дисков

create создать новый пул из физического раздела, на котором будут размещены виртуальные диски

destroy удалить пул разделов zfs

detach отключить физический раздел от пула

events посмотреть сообщения ядра, отправленные модулем zfs

export экспортировать пул для переноса в другую систему

get посмотреть параметры пула

set установить значение переменной

history отобразить историю команд zfs

import импортировать пул

iostat отобразить статистику ввода/вывода для выбранного пула zfs

list вывести список всех пулов

offline/online выключить/включить физическое устройство, данные на нем сохраняются, но их нельзя прочитать или изменить

remove удалить устройство из пула

replace перенести все данные со старого устройства не новое

scrub проверка контрольных сумм для всех данных

status вывести статус пула

примеры использования zpool

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

zpool list вывести список всех пулов

zpool status вывести статус пула

stripe страйп, нечто среднее между RAID0 и JBOD. Не имеет избыточности, вся информация теряется при смерти любого из дисков.

mirror зеркало, примерный аналог RAID1. Каждый диск зеркала содержит полную копию всей информации. Выдерживает смерть одного любого диска. Возможно и тройное зеркало.

raidz1 примерный аналог RAID5, требует минимум 3 дисков, объем одного диска уходит на избыточность. Выдерживает смерть одного любого диска.

raidz2 примерный аналог RAID6, требует минимум 4 диска, объем двух дисков уходит на избыточность. Выдерживает смерть двух любых дисков.

raidz3 требует минимум 5 дисков, объем трёх дисков уходит на избыточность. Выдерживает смерть трёх любых дисков.

zraid   аналог raid5

zraid2   аналог raid6

zpool create f pool0 /dev/sda7 создадим пул на основе существующего раздела /dev/sda7

zpool create pool0 zraid /dev/sda /dev/sdb /dev/sdc создадим zraid из дисков (sda,sdb,sdc), диски должны иметь одинаковый размер

zpool create pool0 mirror sda sdb создадим raid1 из двух дисков (sda,sdb)

zpool attach pool0 /dev/sdd добавить новый жесткий диск(/dev/sdd) или раздел к пулу (pool0)

zpool detach pool0 /dev/sdd удалить устройство (/dev/sdd) из пула (pool0)

zpool destroy pool0 удалить пул (pool0)

zpool scrub pool0 проверка пула (pool0) на ошибки

zpool iostat pool0 статистику использования пула (pool0)

Файловая система zfs

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Cоздание файловых систем в zfs:

zfs create pool0/data создадим в пуле (pool0)  data

zfs create pool0/files создадим в пуле (pool0) files

zfs create pool0/media создадим в пуле (pool0) media

Точка монтирования для пула и для каждой созданной в нем файловой системы создается в корневом каталоге (/pool0)

zfs mount pool0/data монтирование

zfs umount /pool0/data от монтирование

Параметры файловой системы zfs

zfs get all pool0/files посмотреть все текущие параметры ФС zfs

zfs set compression=gzip pool0/files включим сжатие

zfs set checksum=off pool0/files отключим проверку контрольных сумм

zfs get mountpoint pool0/files смотрим точку монтирования

zfs set mountpoint=/mnt pool0/files   установим свою точку монтирования

zfs mount показать точки монтирования

Снимки zfs

zfs snapshot pool0/files pool0/files@shot1 создания снимка

zfs rollback pool0/files@shot1 восстановление из снимка

zfs list t snapshot посмотреть список снимков

zfs destory pool0/files@shot1 удалить ненужный снимок

Удалить пул myzfs:

zpool destroy myzfs удаляем пул myzfs

zpool list проверяем

Пример работы с raid1 удаление spare array добавление дисков:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

Создаем пул из трех дисков RAID1:

zpool create myzfs mirror /disk1 /disk2 /disk3 создаем raid1

zpool list смотрим что получилось

Исключаем диск disk3 из пула myzfs:

!!! zpool remove myzfs /disk3 удаление диска, не возможно применить к зеркалам (raid1)

zpool detach myzfs /disk3 удаляем диск /disk3 из пула

zpool status v смотрим что получилось

Добавить диск горячей замены:

zpool add myzfs spare /disk3 добавляем в пул myzfs диск /disk3 как spare array

zpool status v смотрим что получилось

Отключение пула:

zpool offline myzfs /disk1

Включить пул:

zpool online myzfs /disk1

Очистка хранилища:

zpool scrub myzfs чистка хранилища

Экспорт хранилища:

zpool export myzfs экспорт хранилища для использования на другой системе

Импортирование хранилища:

zpool import d / myzfs импортировать хранилище на другой системе

Получить статистику по операциям ввода/вывода:

zpool iostat

Показать историю команд:

zpool history

Показать состояние пула:

zpool status v

Показать пулы:

zpool list

Показать включенные опции:

zpool list o

Включить квоту:

zfs set quota=20m myzfs/disk

zfs list o quota myzfs/disk

zfs get quota  myzfs/disk

Увеличение / расширение пула:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

zpool history посмотреть историю выполненных команд

zpool list   показать пулы

zpool list a

zpool list o

zpool list pool0

zpool status   показать состояние пулов

zpool status a

zpool create f pool0 /dev/vdb создаем zfs из одного диска

!!! zpool  scrub pool0 выполнить сборку мусора

Включение опций:

zpool set autoexpand=on pool0

zpool set expandsize=yes pool0

zpool set readonly=off pool0

zpool get autoexpand проверяем включена опция autoexpand

zpool e pool0 /dev/vdb выполняем расширение пула, после изменения размера диска /dev/vdb

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Zf ecolife коды ошибок
  • Zf ba trans flt blkd ошибка