Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.


Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) и РУСБ.10015-10, РУСБ.10015-17
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 2
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
  • Astra Linux Common Edition 2.12


Аннотация

DRBD (Distributed Replicated Block Device) — это инструмент, позволяющий создавать решения для резервирования данных путем репликации блочных устройств (например, жестких дисков или томов LVM). При использовании DRBD данные, записанные на одном сервере, автоматически и синхронно копируются на другой сервер. Использование DRBD является одним из способов организации сетевого RAID-1. 

Ключевые особенности:

  • данные реплицируются сразу после того как они были изменены;
  • инструмент реализован как модуль ядра;
  • DRBD обеспечивает репликацию на удалённый узел содержимого локального блочного устройства; 
  • операция чтения всегда осуществляется только с локального узла;
  • для сетевого взаимодействия используется протокол TCP.

Каждый из узлов может функционировать как:

  • primary/первичный — узел доступен для чтения и записи данных как локальное блочное устройство;
  • secondary/вторичный — узел хранит данные, но не позволяет получить к ним локальный доступ.

Если первичный узел прекращает работу, DRBD переводит вторичный узел в режим первичного. Узлы могут взаимодействовать между собой в одном из трех режимов репликации.

Информация

Использование более двух узлов возможно только для DRBD версии 9 и выше

Режимы репликации

В терминологии DRBD режимы репликации именуются как протоколы (protocol). Протокол определяет, как данные синхронизируются между узлами, а также как обрабатываются ситуации сбоя и обеспечения целостности данных. 

Инструмент поддерживает три режима репликации данных между узлами:

  1. Protocol A  — операция записи считается завершенной, если завершена запись на локальный узел и запись передана на удаленный узел.
  2. Protocol B  — выполнены аналогичные Protocol A условия после чего удаленный узел подтвердил получение записи. 
  3. Protocol C  — выполнены аналогичные Protocol A условия после чего локальный и удаленный узлы подтвердтвердили успешное завершение записи. Обеспечивает наибольшую сохранность данных при этом наиболее требователен к производительности дисковой системы.

Предупреждение

Protocol A рекомендуется использовать только при существенной потере производительности дисковой системы во время работы DRBD

В качестве объекта записи в DRBD выступает т.н. ресурс. Ресурс (Resource) — это реплицируемые области блочных устройств. Помимо ресурсов DRBD хранит на узлах необходимую для репликации служебную информацию (размеры блочных устройств, журналы активности и т.д.), которая именуется как метаданные (metadata).

Параметры стенда


Предупреждение
Для корректной работы DRBD необходимо наличие ресурсов одинакового объема на узлах

Для развертывания кластера используются два подсоединенных к сети компьютера (узла) с установленной ОС Astra Linux. DRBD должен быть запущен на обоих узлах. 

ПараметрУзел 1Узел 2
Имя узлаdrbd1drbd2
Статический IP-адрес узла192.168.23.101192.168.23.102

Рекомендации по настройке сети приведены в статье Настройка разрешения имен и статических IP-адресов. В целях тестирования можно использовать раздел Настройка разрешения имен в тестовом окружении.

Установка DRBD

На всех узлах:

  1. Установить пакет:
    Command

    sudo apt install drbd-utils


  2. Подключить модуль ядра:
    Command
    sudo modprobe drbd

Настройка репликации

На всех узлах:

  1. Перед началом настройки сделать резервную копию конфигурационного файла global_common.conf инструментом cp:
    Command

    cd /etc/drbd.d

    sudo cp global_common.conf global_common.conf.backup

    или при помощи графического файлового менеджера Fly.

    Информация

    Для манипуляций с файлами в каталоге /etc необходимы права суперпользователя (sudo), а при включенном мандатном управлении целостностью (МКЦ) — права суперпользователя с высоким уровнем целостности.


  2. Указать настройки конфигурации виртуального блочного устройства DRBD в /etc/drbd.d/global_common.conf:
    Блок кода
    global {
      usage-count no;
    }
    common {
      net {
        protocol C;
      }
    }

Настройки основного конфигурационного файла:

    • блок global содержит параметры, влияющие на работу всех ресурсов:

      • параметр usage-count отвечает за отправку статистики использования DRBD на сервера LINBIT. По умолчанию установлен в yes. Рекомендуется изменить на no;
    • блок net содержит параметры сетевого взаимодействия между узлами:

      • параметр protocol указывает используемый режим репликации.

        Информация
        DRBD допускает указание используемого протокола для ресурсов в блоке resource файлов конфигурации ресурсов (см. ниже)

Описание остальных блоков доступно в виде комментариев в самом файле конфигурации.

Управление DRBD

Для получения справки по DRBD и настройкам конфигурационных файлов выполнить:

Command
info drbd

Для управления узлами в DRBD применяется компонент drbdadm.

Основные команды:

  • проверить синтаксис настроек, указанных в файле конфигурации на ошибки:
    Command
    sudo drbdadm dump all


  • задействовать метаданные:
    Command
    sudo drbdadm create-md <имя_узла>


  • инициализировать службу на узле (инициализацию нужно проводить на всех узлах):
    Command
    sudo drbdadm up <имя_узла>

     использовать down вместо up для выключения;

  • отслеживать статус синхронизации между узлами:
    Command

    sudo drbdadm status


  • принудительно назначить узел первичным:
    Command
    sudo drbdadm primary <имя_узла>

     для назначения узла вторичным вместо primary указать secondary;

    Предупреждение

    Использование параметра --force допустимо для данной команды только при первом запуске, в противном случае данные будут утеряны


  • уточнить роль (первичный/вторичный) узла:
    Command

    sudo

    drbdadm

    role

    <имя_узла>


  • временно отключить узлы:
    Command
    sudo drbdadm disconnect all

    чтобы вновь включить нужно использовать connect.

    Информация

    Вместо all для drbdadm допустимо указывать имя конкретного узла

     

  • вызов справки о drbdadm :
    Command

    man drbdadm

Добавление ресурсов

На всех узлах:

Указать реплицируемый дисковый ресурс в /etc/drbd.d/r0.res для ресурса r0:
Блок кода
resource r0 {
 # здесь возможно указание значения параметра protocol если он не указан в global_common.conf
  on drbd1 { 
    device    /dev/drbd0;
    disk      /dev/sdb;
    address   192.168.23.101:7789;
    meta-disk internal;
  }
  on drbd2 {
    device    /dev/drbd0;
    disk      /dev/sdb;
    address   192.168.23.102:7789;
    meta-disk internal;
  }
}

Настройки конфигурационного файла ресурсов:

Конфигурационный файл подробнее:

  • resource — название ресурса;
  • on <имя_узла> — описание первого узла:
    • device — блок данных, который необходимо создать;
    • disk — родительский жесткий диск;
    • address — IP-адрес и номер порта соответствующего узла;
    • meta-disk internal — указание хранить служебные метаданные на этом же узле.
Раскрыть
titleВозможные состояния диска

Diskless — драйверу DRBD не назначено блочное устройство;

Attaching — переходное состояние пока считываются метаданные;

Failed — переходное состояние последовавшее за I/O ошибкой локального блочного устройства, следующее возможное состояние Diskless;

Negotiating — переходное состояние пока налаживается соединение;

Inconsistent — данные непоследовательны. Это статус нового ресурса;

Outdated — данные ресурса последовательны но устарели;

DUnknown — статус используется для узла, если не доступно сетевое подключение;

Consistent — последовательные данные узла без сетевого подключения. После подключения будет решено, данные являются актуальными или устаревшими;

UpToDate — все данные в актуальном состояние. Это нормальное состояние.

Раскрыть
titleВозможный статус соединения

StandAlone — недоступна сетевая конфигурация. Этот ресурс еще не был подключен или был административно отключен (drbdadm disconnect), или сбросил сетевое подключение из за не пройденной аутентификации или split brain;

Disconnecting — временное состояние пока происходит отключение, следующее состояние StandAlone;

Unconnected — временное состояние до попытки подключения. Следующее возможное состояние WFConnection или WFReportParams;

Timeout — временное состояние после перерыва связи с узлом. Следующее возможное состояние Unconnected;

BrokenPipe — временное состояние после потери связи с узлом. Следующее возможное состояние Unconnected;

NetworkFailure — временное состояние после потери связи с партнером. Следующее возможное состояние — Unconnected;

ProtocolError — временное состояние после потери связи с партнером. Следующее возможное состояние Unconnected;

TearDown — временное состояние, узел закрывает соединение. Следующее возможное состояние Unconnected;

WFConnection — нода ожидает пока узел станет виден в сети;

WFReportParams — TCP соединение было установлено, узел ожидает первый сетевой пакет от узла;

Connected — DRBD соединение установлено, зеркалирование данных активно. Это нормальное состояние;

StartingSyncS — начата полная синхронизация, выполняется администратором. Следующее возможное состояние SyncSource или PausedSyncS;

StartingSyncT — начата полная синхронизация, выполняется администратором. Следующее возможное состояние WFSyncUUID;

WFBitMapS — частичная синхронизация начата. Следующее возможное состояние SyncSource или PausedSyncS;

WFBitMapT — частичная синхронизация начата. Следующее возможное состояние WFSyncUUID;

WFSyncUUID — синхронизация скоро начнется. Следующее возможное состояние SyncTarget или PausedSyncT;

SyncSource — синхронизация запускается, локальная узел является источником синхронизации;

SyncTarget — синхронизация запускается, локальная узел является целью синхронизации;

PausedSyncS — локальная узел источник синхронизации, но синхронизация находится в режиме паузы;

PausedSyncT — локальная узел является целью синхронизации, но синхронизация находится в режиме паузы;

VerifyS — запускается онлайн верификация, локальная узел является источником верификации;

VerifyT — запускается онлайн верификация, локальная узел является целью верификации. 

Добавление ресурсов

На всех узлах:

  1. Указать реплицируемый дисковый ресурс в /etc/drbd.d/r0.res для ресурса r0:
    Блок кода
    resource r0 {
     # здесь возможно указание значения параметра protocol если он не указан в global_common.conf
      on drbd1 { 
        device    /dev/drbd0;
        disk      /dev/sdb;
        address   192.168.23.101:7789;
        meta-disk internal;
      }
      on drbd2 {
        device    /dev/drbd0;
        disk      /dev/sdb;
        address   192.168.23.102:7789;
        meta-disk internal;
      }
    }

    Настройки конфигурационного файла ресурсов:

    Конфигурационный файл подробнее:

    • resource — название ресурса;
    • on <имя_узла> — описание первого узла:
      • device — блок данных, который необходимо создать;
      • disk — родительский жесткий диск;
      • address — IP-адрес и номер порта соответствующего узла;
      • meta-disk internal — указание хранить служебные метаданные на этом же узле.


  2. Инициализировать хранилище метаданных:
    Command

    sudo drbdadm create-md r0

    Раскрыть
    titleЕсли возникает ошибка с кодом 40

    Если ранее диск был отформатирован под ext4 или использовался в массиве RAID при попытке инициализировать хранилище метаданных возникает ошибка вида:

    Command

    Device size would be truncated, which

    would corrupt data and result in

    'access beyond end of device' errors.

    You need to either

       * use external meta data (recommended)

       * shrink that filesystem first

       * zero out the device (destroy the filesystem)

    Operation refused.


    Command 'drbdmeta 0 v09 /dev/sdb internal create-md 1' terminated with exit code 40

    Удалить остаточные данные:

    Command

    sudo dd if=/dev/zero of=/dev/sdb bs=1024k count=1024

    где sdb - имя диска. После этого повторно выполнить sudo drbdadm create-md <имя_ресурса>.


  3. Задействовать созданный ресурс:
    Command

    sudo drbdadm up r0

  4. Включить в автозагрузку модуль ядра drbd:
    Command
    echo drbd | sudo tee /etc/modules-load.d/drbd.conf

Далее:

  1. Сделать один из узлов, наппример drbd1, первичным выполнив на нем:
    Command

    sudo drbdadm -- --overwrite-data-of-peer primary all



  2. На вторичном узле drbd2 проверить процесс репликации:
    Command

    watch -n1 cat /proc/drbd

    Информация

    Остановить watch можно сочетанием клавиш <Ctrl+C>


  3. Указать файловую систему для созданного виртуального блочного устройства на первичном узле:
    Command

    sudo mkfs.ext4 /dev/drbd0


  4. Примонтировать устройство на первичном узле:
    Command

    sudo mount /dev/drbd0 /srv


Просмотр списка задействованных ресурсов DRBD:

Command

systemctl status drbd

 

Раскрыть
titleОсновные условные сокращения параметров мониторинга:
СокращениеПараметр

cs:

 

состояние соединения

st:


состояние узла (локального/удаленного)

ld:


согласованность локальных данных

ds:

 

согласованность данных

ns:


отправка по сети

nr:

 

получение по сети

dw:

 

запись на диск

dr:


чтение с диска

pe:

 

ожидание подтверждения

ua:


разблокирован (все еще нужно отправить подтверждение)
al:количество записей в журнале доступа

Проверка работы

  1. Скопировать несколько файлов на узел, установленный как основной, в каталог /srv :
    Command

    sudo cp -r /etc/default /srv


  2. Отмонтировать каталог /srv:
    Command

    sudo umount /srv


  3. Установить первичному узлу роль вторичного:
    Command

    sudo drbdadm secondary r0


  4. Установить вторичному узлу роль первичного:
    Command

    sudo drbdadm primary r0


  5. Смонтировать ранее отмонтированный раздел:
    Command

    sudo mount /dev/drbd0 /srv


  6. Убедиться в наличии ранее скопированных файлов в каталоге /srv :
    Command
    Titlels /srv

    /etc/default


DRBD и OCFS2

Начиная с версии DRBD-8.0.08 инструмент может задействовать оба узла как первичные, что дает возможность использовать кластерные файловые системы, например OCFS2.

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

Настройка DRBD с OCFS2

На всех узлах:

  1. Установить пакет ocfs2-tools :
    Command

    sudo apt install ocfs2-tools


  2. Указать параметры настроек ocfs2-tools в основном конфигурационном файле /etc/ocfs2/cluster.conf:
    Блок кода
    cluster:
         node_count = 2
         name = ocfs2cluster
     
    node:
         number = 1
         cluster = ocfs2cluster
         ip_port = 7777
         ip_address = 192.168.23.101
         name = drbd1
     
    node:
         number = 2
Инициализировать хранилище метаданных:
Command

sudo drbdadm create-md r0

Запустить службу drbd:
Command

sudo systemctl start drbd

  • Включить в автозагрузку службу drbd:
    Command
    echo drbd > /etc/modules-load.d/drbd.conf
  • Далее:

    Сделать один из узлов, наппример drbd1, первичным выполнив на нем:
    Command

    sudo drbdadm -- --overwrite-data-of-peer primary all

    На вторичном узле drbd2 проверить процесс репликации:
    Command

    watch -n1 cat /proc/drbd

    Информация

    Остановить watch можно сочетанием клавиш <Ctrl+C>

    Указать файловую систему для созданного виртуального блочного устройства на первичном узле:
    Command

    sudo mkfs.ext4 /dev/drbd0

  • Примонтировать устройство на первичном узле:
    Command

    sudo mount /dev/drbd0 /srv

  • Просмотр списка задействованных ресурсов DRBD:

    Command

    systemctl status drbd

     

    Раскрыть
    titleОсновные условные сокращения параметров мониторинга:
    СокращениеПараметр

    cs:

     

    состояние соединения

    st:

    состояние узла (локального/удаленного)

    ld:

    согласованность локальных данных

    ds:

     

    согласованность данных

    ns:

    отправка по сети

    nr:

     

    получение по сети

    dw:

     

    запись на диск

    dr:

    чтение с диска

    pe:

     

    ожидание подтверждения

    ua:

    разблокирован (все еще нужно отправить подтверждение)al:количество записей в журнале доступа

    Ресурс r0 в списке блочных устройств:

    Проверка работы

    Скопировать несколько файлов на узел, установленный как основной, в каталог /srv :
    Command

    sudo cp -r /etc/default /srv

    Отмонтировать каталог /srv:
    Command

    sudo umount /srv

    Установить первичному узлу роль вторичного:
    Command

    sudo drbdadm secondary r0

    Установить вторичному узлу роль первичного:
    Command

    sudo drbdadm primary r0

    Смонтировать ранее отмонтированный раздел:
    Command

    sudo mount /dev/drbd0 /srv

  • Убедиться в наличии ранее скопированных файлов в каталоге /srv :
    Command
    Titlels

    /etc/default

  • DRBD и OCFS2

    Начиная с версии DRBD-8.0.08 инструмент может задействовать оба узла как первичные, что дает возможность использовать кластерные файловые системы, например OCFS2.

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

    Настройка DRBD с OCFS2

    На всех узлах:

    1. Установить пакет ocfs2-tools :
      Command

      sudo apt install ocfs2-tools

      Указать параметры настроек ocfs2-tools в основном конфигурационном файле /etc/ocfs2/cluster.conf:
      Блок кода
      cluster:
           node_count = 2
           name = ocfs2cluster
       
      node:
           number = 1
           cluster = ocfs2cluster
           ip_port = 7777
           ip_address = 192.168.23.101
           name = drbd1
       
      node:
           number = 2
           cluster = ocfs2cluster
           ip_port = 7777
           ip_address = 192.168.23.102
           name = drbd2

    Далее:
     Создать файловую систему для drbd0:

    Command

    sudo mkfs.ocfs2 -L "testVol" /dev/drbd0

    где "testVol" — имя создаваемого раздела.

    Далее на всех узлах:

    Указать параметры в в /etc/default/o2cb
    Command

    O2CB_ENABLED=true
    O2CB_BOOTCLUSTER=ocfs2cluster

    1.  = 192.168.23.102
           name = drbd2

    Далее:
     Создать файловую систему для drbd0:

    Command

    sudo mkfs.ocfs2 -L "testVol" /dev/drbd0

    где "testVol" — имя создаваемого раздела.


    Далее на всех узлах:

    1. Указать параметры в в /etc/default/o2cb
      Command

      O2CB_ENABLED=true
      O2CB_BOOTCLUSTER=ocfs2cluster


    2. Инициализировать новый кластер:
      Command

      o2cb register-cluster ocfs2cluster


    3. Включить и добавить в автозапуск:
      Command

      systemctl enable drbd o2cb ocfs2
      systemctl start drbd o2cb ocfs2


    4. Добавить новые точки монтирования в fstab:
      Блок кода
      /dev/drbd0 /srv ocfs2 defaults,auto,heartbeat=local 0 0

    Восстановление DRBD после split brain

    Split brain — это общий термин для определения ошибки в работе распределенных систем, связанной с рассинхронизацией в работе узлов. В контексте работы DRBD термин описывает состояние узлов, при котором начинается расхождение данных на ресурсах.

    При возникновении split brain на обоих узлах DRBD-ресурсы находятся в режиме Primary, а состояние соединения отображается как StandAlone. Событие возникновения split brain отражается в журнале /var/log/kern.log как:

    Блок кода
    kernel: block drbd0: Split-Brain detected, dropping connection!

    где drbd0 имя блочного устройства DRBD.

    Или в информации о работе каждого из улов:

    Command
    Titlecat /proc/drbd
    version: 8.3.11 (api:88/proto:86-96)
    srcversion: F937DCB2E5D83C6CCE4A6C9 
     0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
        ns:0 nr:1727749652 dw:1727749652 dr:0 al:0 bm:2405 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
    
     2: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
        ns:0 nr:348016128 dw:348016128 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

    каждый из узлов отображает состояние другого как Unknown.

    В состав инструмента входят компонениы для автоматического устранения split brain. Чтобы их задействовать необходимо добавить ссылку в секции handlers файла конфигурации ресурса etc/drbd.d/r0.res :

    Command
    resource <имя_ресурса> {  # в примере, приведенном в статье имя - r0
    handlers { split-brain "/usr/lib/drbd/notify-split-brain.sh root"
    # далее идут секции настройки ресурса, определенные примерами выше, например:

    on drbd1 {      device    /dev/drbd0;     disk      /dev/sdb;     address   192.168.23.101:7789;     meta-disk internal;   }   on drbd2 {     device    /dev/drbd0;     disk      /dev/sdb;     address   192.168.23.102:7789;     meta-disk internal;   } }
    Предупреждение

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


    Чтобы восстановить работу DRBD вручную Инициализировать новый кластер:
    Command

    o2cb register-cluster ocfs2cluster

    Включить и добавить в автозапуск:
    Command

    systemctl enable drbd o2cb ocfs2
    systemctl start drbd o2cb ocfs2

  • Добавить новые точки монтирования в fstab:
    Блок кода
    /dev/drbd0 /srv ocfs2 defaults,auto,heartbeat=local 0 0
  • Восстановление DRBD после split brain

    Split brain — это общий термин для определения ошибки в работе распределенных систем, связанной с рассинхронизацией в работе узлов. В контексте работы DRBD термин описывает состояние узлов, при котором начинается расхождение данных на ресурсах.

    При возникновении split brain на обоих узлах DRBD-ресурсы находятся в режиме Primary, а состояние соединения отображается как StandAlone. Событие возникновения split brain отражается в журнале /var/log/kern.log как:

    Блок кода
    kernel: block drbd0: Split-Brain detected, dropping connection!

    где drbd0 имя блочного устройства DRBD.

    Или в информации о работе каждого из улов:

    Command
    Titlecat /proc/drbd
    version: 8.3.11 (api:88/proto:86-96)
    srcversion: F937DCB2E5D83C6CCE4A6C9 
     0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
        ns:0 nr:1727749652 dw:1727749652 dr:0 al:0 bm:2405 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
    
     2: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
        ns:0 nr:348016128 dw:348016128 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

    каждый из узлов отображает состояние другого как Unknown.

    Чтобы восстановить работу DRBD необходимо:
    1. Принудительно перевести узел, на который осуществляется резервирование в состояние secondary:
      Command
      sudo drbdadm secondary all


    2. Отключить данный узел от сети:
      Command
      sudo drbdadm disconnect all


    3. Переподключить резервируемый узел игнорируя последние записи в метаданных:
      Command
      sudo drbdadm -- --discard-my-data connect all


    4. Второй узел принудительно перевести в состояние primary:
      Command
      sudo drbdadm primary all


    5. Отключить второй узел:
      Command
      sudo drbdadm disconnect all


    6. Переподключить второй узел для начала синхронизации. В процессе синхронизации служебные метаданные будут перезаписаны:
      Command
      sudo drbdadm connect all


    7. Убедиться в том что узлы запущены в корректных режимах:
      Command
      Titlecat /proc/drbd
      version: 8.3.11 (api:88/proto:86-96)
      srcversion: F937DCB2E5D83C6CCE4A6C9 
       0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
          ns:0 nr:1732429880 dw:1732429880 dr:0 al:0 bm:2405 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
      
       2: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
          ns:0 nr:348078352 dw:348078352 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0