В этой статье рассматриваются следующие темы:
- Создание резервных копий файлов Samba Trivial Database (TDB).
- Восстановление TDB-файлов.
- Определение признаков повреждений TDB-файлов.
- Просмотр и редактирование содержимого TDB-файлов.
Эта статья поможет вам подготовиться к сдаче экзамена LPI 302 (специализация "Смешанные среды") и содержит материалы цели 310.3 темы 310. Цель имеет вес 1.
Чтобы извлечь наибольшую пользу из наших статей, необходимо обладать продвинутыми знаниями о Linux и иметь работоспособный компьютер с Linux, на котором можно будет выполнять все описанные команды. В частности, предполагается, что читатель умеет работать с командной строкой Linux и в общих чертах понимает назначение Samba (о чем рассказывалось в предыдущей статье "Изучаем Linux, 302: основные принципы"). Для выполнения примеров этой статьи на вашем компьютере должно быть инсталлировано программное обеспечение Samba. Для выполнения некоторых действий потребуется сетевое окружение, в котором используется протокол Server Message Block (SMB)/Common Internet File System (CIFS).
В процессе работы Samba использует большой объем информации, начиная от локальных паролей и заканчивая списком клиентов. Некоторые данные используются временно и могут быть удалены при перезагрузке Samba, а некоторые являются постоянными, и их нельзя терять. Иногда данные невозможно или не нужно хранить в оперативной памяти, поскольку они могут иметь слишком большой объем, к ним могут редко обращаться, либо они должны сохраняться при перезагрузках. Для этих случаев команда разработчиков Samba разработала базу данных под названием Trivial Database. Эта база данных является эффективным хранилищем записей типа ключ-значение; это означает, что данные хранятся, сортируются и извлекаются с помощью уникальных ключей, и что при этом не используется объединение таблиц, как это происходит в реляционных базах данных. Хранилища типа "ключ-значение" и, в частности, TDB, позволяют быстро сохранять информацию на жесткий диск и получать ее обратно.
Хранилища типа "ключ-значение"
Несмотря на то, что у TDB имеется много альтернатив, например, GNU Database Manager (GDBM), проект Samba предъявляет особые требования к одновременной записи данных в БД несколькими процессами, а также к поддержке блокировок внутренних областей данных. Поэтому команда разработчиков Samba создали собственный менеджер базы данных и назвали его Trivial Database Manager. Дальнейшее усовершенствование TDB в рамках проекта Clustered TDB (CTDB) реализовало поддержку кластеризации, которая может использоваться в других проектах.
Если вы знакомы с реляционными СУБД, такими как IBM DB2, MySQL или PostgreSQL, то вы заметите, что по сравнению с ними хранилища типа "ключ-значение" достаточно примитивны. Тогда как реляционные базы данных могут содержать таблицы с несколькими столбцами, хранилища "ключ-значение" фактически содержат только два столбца: столбец с ключом и столбец со значением. В реляционных СУБД для извлечения данных из нескольких таблиц и столбцов используется структурированный язык запросов (Structured Query Language, SQL), а в хранилищах типа "ключ-значение" – только операции со столбцом ключей.
В силу своей простоты хранилища "ключ-значение" могут использоваться для ограниченного круга задач, однако при этом они обеспечивают очень высокое быстродействие. Хранилище "ключ-значение", по сути, представляет собой хэш-таблицу, хранящуюся на диске, поэтому местонахождение фрагмента данных можно предугадать, не обращаясь к индексу.
В частности, TDB была разработана для обработки множественных конкурирующих процессов записи и двоичных данных, таких, как структуры внутренних данных. Поэтому самым быстрым способом сохранения и извлечения этих данных является использование двоичного формата. Двоичное хранилище позволяет уменьшить размер файла базы данных и избавляет от необходимости преобразовывать данные в различные форматы в процессе записи информации в базу данных и ее извлечения оттуда.
TDB-файлы, используемые в Samba
Samba хранит свои TDB-файлы в нескольких местах. Самый простой способ найти эти файлы – просмотреть вывод команды smbd -b, представленный в листинге 1.
Листинг 1. Вывод информации о сборке smbd
# smbd -b ... Paths: SBINDIR: /usr/sbin BINDIR: /usr/bin SWATDIR: /usr/share/swat CONFIGFILE: /etc/samba/smb.conf LOGFILEBASE: /var/log/samba LMHOSTSFILE: /etc/samba/lmhosts LIBDIR: /usr/lib MODULESDIR: /usr/lib/samba SHLIBE1T: so LOCKDIR: /var/lib/samba STATEDIR: /var/lib/samba CACHEDIR: /var/lib/samba PIDDIR: /var/run SMB_PASSWD_FILE: /var/lib/samba/private/smbpasswd PRIVATE_DIR: /var/lib/samba/private |
На местоположения, в которых могут храниться TDB-файлы, указывают несколько путей в листинге 1. К счастью, многие из них одинаковы, поэтому количество вариантов сокращается. Например, переменные LOCKDIR, STATEDIR и CACHEDIR указывают на директорию /var/lib/samba, а переменная PRIVATE_DIR является поддиректорией с именем private. Вы можете самостоятельно зайти в эти директории и поискать в них TDB-файлы.
TDB-файлы можно разделить на две основные группы: постоянные и временные. В таблице 1 перечислены имена и описания постоянных файлов.
Таблица 1. Постоянные TDB-файлы
| Имя файла | Назначение |
|---|---|
| account_policy.tdb | Хранит политики учетных записей, такие как пороговые значения блокировок и длина паролей. |
| group_mapping.tdb | Хранит информацию о сопоставлениях между идентификаторами пользователей Windows NT (SID) и UNIX®. |
| ntdrivers.tdb | Хранит информацию о драйверах принтеров. |
| ntforms.tdb | Хранит информацию о формах очереди печати, например, размеры бумаги. |
| ntprinters.tdb | Хранит информацию о параметрах инициализации принтеров. |
| passdb.tdb | Используется в некоторых режимах безопасности для хранения учетных данных аутентификации. |
| registry.tdb | Базовый реестр, к которому можно получить доступ с других Windows-компьютеров. |
| secrets.tdb | Хранит локальные секретные значения (например, ключи machine key компьютеров) и учетные данные (например, пароли LDAP). |
| share_info.tdb | Хранит списки контроля доступов (ACL) для каждого локального общего ресурса. |
| winbindd_idmap.tdb | Хранит информацию о сопоставлениях между идентификаторами пользователей Windows NT (SID) и динамически создаваемыми пользователями при использовании winbind. |
Для всех TDB-файлов, перечисленных в таблице 1, следует создавать резервные копии. Эта процедура будет описана далее в этой статье.
Помимо постоянных файлов в Samba используется множество временных TDB-файлов, в которых хранится информация о состоянии и кэшированные данные. Эти файлы не нужно резервировать, поскольку они заново создаются при каждом запуске Samba.
Управление TDB-файлами в Samba осуществляется с помощью трех инструментов:
tdbdump: позволяет выводить содержимое TDB-файлов.tdbbackup: позволяет создавать и проверять резервные копии TDB-файлов.tdbtool: позволяет создавать, просматривать и редактировать TDB-файлы.
Просмотр содержимого TDB-файла
Самый быстрый способ заглянуть в TDB-файл – это сделать его дамп с помощью команды tdbdump. В листинге 2 показан дамп файла ntprinters.tdb.
Листинг 2. Использование команды tdbdump
[root@bob ~]# tdbdump /var/lib/samba/ntprinters.tdb
{
key(21) = "GLOBALS/c_setprinter\00"
data(4) = "\00\00\00\00"
}
{
key(13) = "SECDESC/test\00"
data(140) = "\80\00\00\00\00\00\02\00\80\00\00\00\01\00\04\80\14\00\00\00$\00\00
\00\00\00\00\004\00\00\00\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00\01\02\00\00
...
\00 \02\00\00\00\02\18\00\0C\00\0F\10\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00"
}
{
key(17) = "SECDESC/cups-pdf\00"
data(140) = "\80\00\00\00\00\00\02\00\80\00\00\00\01\00\04\80\14\00\00\00$\00\00
\00\00\00\00\004\00\00\00\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00\01\02\00\00
...
\00 \02\00\00\00\02\18\00\0C\00\0F\10\01\02\00\00\00\00\00\05 \00\00\00 \02\00\00"
}
|
Из листинга 2 видно, что база данных содержит три ключа. Первый ключ длиной в 21 байт (длина указывается в скобках) называется GLOBALS/c_setprinter и содержит в конце имени NULL-символ (ноль в кодировке ASCII). Непечатные символы отображаются в шестнадцатеричном формате (символ обратной косой черты, после которой следуют две шестнадцатеричные цифры). Значение первого ключа длиной в 4 байта состоит только из NULL-символов.
Следующие два ключа называются SECDESC/test и SECDESC/cups-pdf, и оба заканчиваются NULL-символом. Значения ключей хранятся в нечитаемом двоичном формате, поэтому они отображаются в виде шестнадцатеричных непечатных символов.
Создание резервных копий и восстановление TDB-файлов
В таблице 1 были перечислены несколько постоянных TDB-файлов, которые должны оставаться в системе после перезагрузки и для которых нужно создавать резервные копии. Как и в большинстве баз данных, нельзя просто скопировать файл, поскольку его копия может оказаться поврежденной. Это может случиться в тех случаях, если в файл, который вы копируете, записываются какие-либо данные; это приводит к несогласованному состоянию резервной копии. Другой способ создания резервных копий заключается в остановке демона Samba и последующем копировании файлов.
Самый простой способ создания резервных копий TDB-файлов – это использование утилиты tdbbackup из пакета Samba. Эта утилита может безопасно создавать копию TDB-файла, даже если в него записываются данные. Утилита tdbbackup также может проверять целостность TDB-файлов и автоматически восстанавливать их из резервных копий в случае обнаружения ошибок. В листинге 3 приведен пример создания резервной копии TDB-файла.
Листинг 3. Создание резервной копии TDB-файла
[root@bob samba]# ls -l account_policy.* -rw------- 1 root root 8192 Apr 7 2008 account_policy.tdb [root@bob samba]# tdbbackup account_policy.tdb [root@bob samba]# ls -l account_policy.* -rw------- 1 root root 8192 Apr 7 2008 account_policy.tdb -rw------- 1 root root 36864 Dec 8 21:42 account_policy.tdb.bak [root@bob samba]# tdbdump account_policy.tdb | md5sum 53ea608f0d93061480549c511756b778 - [root@bob samba]# tdbdump account_policy.tdb.bak | md5sum 53ea608f0d93061480549c511756b778 - |
Первая команда в листинге 3 просто выводит список всех файлов, начинающихся с account_policy, с целью показать, что они существуют в единственном экземпляре. Затем с помощью команды tdbbackup account_policy.tdb создается резервная копия базы политик учетных записей. Третья команда снова выводит список всех файлов, начинающихся с account_policy, с целью показать, что был создан новый файл с расширением .bak. Размер резервной копии отличается от размера оригинала, но если сделать дампы каждого файла и посчитать их MD5-хэши, то можно убедиться в том, что их контрольные суммы совпадают. Больший размер файла не является проблемой, поскольку содержимое каждой пары "ключ-значение" идентично.
Если по какой-либо причине исходный файл account_policy.tdb будет поврежден (например, при аварийной перезагрузке компьютера), можно восстановить его из резервной копии. Эта процедура показана в листинге 4.
Листинг 4. Проверка и восстановление TDB-файла
[root@bob samba]# ls -l account_policy.tdb -rw------- 1 root root 1213 Dec 8 21:49 account_policy.tdb [root@bob samba]# tdbbackup -v account_policy.tdb tdb_oob len 1256 beyond eof at 1213 restoring account_policy.tdb [root@bob samba]# ls -l account_policy.tdb* -rw------- 1 root root 36864 Dec 8 21:49 account_policy.tdb -rw------- 1 root root 36864 Dec 8 21:42 account_policy.tdb.bak [root@bob samba]# tdbbackup -v account_policy.tdb account_policy.tdb : 17 records [root@bob samba]# tdbdump account_policy.tdb | md5sum 53ea608f0d93061480549c511756b778 - |
Первая команда в листинге 4 показывает, что файл сильно уменьшился в размере. Затем снова запускается команда tdbbackup с флагом –v для проверки целостности TDB-файла. Если файл окажется поврежденным, то вы увидите список ошибок с последующим сообщением о том, что данный файл был восстановлен. Сравнив размеры файлов с помощью команды ls, можно увидеть, что текущая база данных была замещена своей резервной копией.
Команду tdbbackup можно безбоязненно запускать несколько раз. Если эта команда работает с неповрежденным файлом базы данных (например, предпоследняя команда в листинге 4), то она просто выводит количество строк в файле. Команда MD5 также показывает нам ту контрольную сумму, которую мы видели до того, как файл был поврежден.
Примечание. Команда tdbbackup поддерживает использование групповых символов, поэтому вы можете резервировать или восстанавливать несколько файлов одновременно.
Утилита tdbtool позволяет изменять данные внутри TDB-файлов, а также смотреть отдельные ключи и значения прямо в файле, избавляя от необходимости делать его дамп и сортировать вывод.
Команда tdbtool может принимать команды из командной строки или работать в интерактивном режиме. Чтобы выполнить все необходимые действия в командной строке, запустите команду tdbtool example.tdb команда опции, где example.tdb – это имя вашего файла, а команда – команда, после которой идут все необходимые опции. Для использования оболочки tdb просто запустите команду tdbtool, по желанию указав в командной строке имя файла.
Для создания базы данных просто запустите tdbtool, а затем введите команду create test.tdb. В результате на жестком диске будет создана база данных test.tdb, открытая для записи в рамках текущего сеанса работы. Если у вас уже имеется TDB-файл, можно указать в командной строке его имя или использовать команду open. Интересно, что единственный способ создания TDB-файла непосредственно из командной строки требует указать имя дважды, например, tdbtool test.tdb create test.tdb, в результате чего выдается ошибка, но база данных успешно создается.
После создания новой базы данных или открытия существующей доступны следующие опции:
-
dump: полностью показывает содержимое базы данных, как это делаетtdbdump. -
keys: показывает только ключи в кодировке ASCII или (вместе с командойhexkeys) в шестнадцатеричном формате. -
erase: полностью удаляет содержимое базы данных без подтверждения. -
info: показывает общее количество ключей и байтов в базе данных. -
check: проверяет целостность базы данных. -
speed: оценивает быстродействие операций чтения и записи в базу данных. -
show key: выводит значения указанного ключа. -
delete key: удаляет ключ вместе с его значением.
Для добавления и управления данными используются команды insert и store. Каждая из этих команд принимает параметры для ключа и значения (параметры для значения являются необязательными). Если не указывать значение ключа, то оно будет содержать нулевой байт данных.
Вставка записи (операция insert) означает создание новой записи, тогда как при сохранении записи (операция store) ее старое значение замещается новым. Отличия этих команд продемонстрированы в листинге 5.
Листинг 5. Вставка и сохранение записей
tdb> insert mykey myvalue tdb> insert mykey newvalue insert failed tdb> store mykey newvalue Storing key: key 5 bytes mykey data 8 bytes [000] 6E 65 77 76 61 6C 75 65 newvalue tdb> store newkey someothervalue Storing key: key 6 bytes newkey data 14 bytes [000] 73 6F 6D 65 6F 74 68 65 72 76 61 6C 75 65 someothe rvalue |
В листинге 5 выполняется следующая последовательность действий:
- Вставка нового ключа с именем
mykeyи значениемmyvalue. Эта операция выполнена успешно. - Вставка ключа с тем же именем, но с другим значением. Эта операция завершилась с ошибкой, поскольку ключ с таким именем уже существует.
- Вместо вставки ключа используется операция сохранения. Эта операция выполнена успешно с более подробным выводом.
- Сохранение нового ключа с новым значением. Эта операция выполнена успешно, даже не смотря на то, что ключа с таким именем не существует.
В командной оболочке tdb можно использовать транзакции, позволяющие выполнять последовательность команд и применять либо отклонять их как единую группу. В листинге 6 приведен пример выполнения двух транзакций.
Листинг 6. Использование транзакций
tdb> transaction_start tdb> insert somekey somevalue tdb> show somekey key 7 bytes somekey data 9 bytes [000] 73 6F 6D 65 76 61 6C 75 65 somevalu e tdb> transaction_cancel tdb> show somekey fetch failed tdb> transaction_start tdb> insert somekey somevalue tdb> transaction_commit tdb> show somekey key 7 bytes somekey data 9 bytes [000] 73 6F 6D 65 76 61 6C 75 65 somevalu e |
Начало транзакции в листинге 6 определяется командой transaction_start. Затем выполняется вставка нового ключа. Если бы другой процесс в это время считывал данные из БД, то он не увидел бы этот ключ, поскольку транзакция еще не подтверждена (процесс с открытой транзакцией также не видит новый ключ). Затем транзакция отменяется командой transaction_cancel. Мы видим, что ключ отсутствует в базе данных.
После этого выполняется та же последовательность действий, но транзакция не отменяется, а подтверждается командой transaction_commit. Теперь ключ существует в базе данных, и его видят все пользователи.
Если база данных находится в режиме транзакции, доступ для других пользователей может блокироваться; это означает, что они будут ждать окончания транзакции. В связи с этим будьте аккуратны при использовании транзакций в рабочей базе данных! Несмотря на то, что транзакции являются мощным средством защиты данных, их чрезмерное использование потенциально может влиять на быстродействие.
Что можно использовать помимо TDB
В зависимости от конфигурации учетные записи пользователей могут храниться в различных местах. Существуют две утилиты, которые позволяют настраивать взаимодействие с хранилищами данных с помощью интерфейса командной строки. Например, при помощи одних и тех же команд можно обращаться к данным, хранящимся как в TDB-файлах, так и в каталоге LDAP.
Утилита smbpasswd позволяет добавлять и удалять учетные записи пользователей и компьютеров, а также изменять пароли. Наиболее часто она используется именно для смены пользователями своих паролей, либо для смены администраторами паролей других пользователей.
В следующих статьях вы более подробно узнаете о различных хранилищах паролей, но на высоком уровне пароли Samba могут храниться по-разному в зависимости от версии Samba и операционных систем, с которыми она интегрируется. И smbpasswd, и pdbedit (описывается в следующем разделе) могут работать с любыми хранилищами, в том числе, отличными от TDB.
Клиенты Microsoft передают пароли по сети в виде собственных Microsoft-хэшей, а не в открытом виде или в виде UNIX-хэшей. Это означает, что невозможно взять Microsoft-хэш пароля и сопоставить его с паролем, хранящимся в базе данных паролей UNIX. Именно поэтому для хранения Microsoft-хэшей Samba должна использовать отдельную базу данных, которая называется хранилищем паролей.
Утилита pdbedit управляет базой данных пользователей и политиками учетных записей Samba. Она умеет выполнять все те же действия, что и smbpasswd, а также управлять политиками и переносить учетные данные между различными хранилищами.
Чтобы получить полный список пользователей, хранящийся в базе данных, запустите команду pdbedit -L. Указав флаг -v, вы получите еще более подробную информацию о пользователях, как показано в листинге 7.
Листинг 7. Подробная информация о пользователях
[root@bob tmp]# pdbedit -L -v --------------- Unix username: sean NT username: Account Flags: [U ] User SID: S-1-5-21-2287037134-1443008385-640796334-1001 Primary Group SID: S-1-5-21-2287037134-1443008385-640796334-513 Full Name: Sean Home Directory: \\bob\sean HomeDir Drive: Logon Script: Profile Path: \\bob\sean\profile Domain: BOB Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: never Kickoff time: never Password last set: Mon, 24 May 2010 21:28:49 CDT Password can change: Mon, 24 May 2010 21:28:49 CDT Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
Для работы с утилитой pdbedit необходимо обладать привилегиями пользователя root. С ее помощью можете изменять различные настройки пользователей (например, разрешенное время входа в систему), пароли и домашние директории, как если бы вы работали с утилитами Microsoft.
Для каждого параметра пользователя используются различные опции командной строки, поэтому для получения точной информации обратитесь к man-странице pdbedit(8).
Также важно упомянуть о том, что Samba воспринимает учетные записи пользователей и компьютеров одинаково. В листинге 8 показана база данных паролей сервера Samba, настроенного в качестве контроллера домена.
Листинг 8. База данных паролей, содержащая пароли компьютеров
[root@sergeant ~]# pdbedit -L root:0:root mythupstairs$:4294967295:MYTHUPSTAIRS BOB$:1043:Machine sean:1002:Sean,,, sergeant$:4294967295:Machine |
Имена, оканчивающиеся знаком доллара ($) – это учетные записи компьютеров, используемые для аутентификации компьютеров в домене. Соответствующий секретный ключ может храниться в файле secrets.tdb на удаленном сервере и в файле passdb.tdb на контроллере домена.
Эта статья завершает тему 310 "Архитектура, принципы и схема работы". Следующая статья открывает новую тему и содержит материалы цели 311.1 темы 311 ("Компиляция и установка Samba"). В ней рассказывается, как загрузить исходный код Samba и скомпилировать его.
Научиться
-
Оригинал статьи: Learn Linux, 302 (Mixed environments): Trivial Database files (EN).
- Прочитайте о различных хранилищах паролей (EN) и узнайте больше о том, как работают утилиты
smbpasswdиpdbedit. - Изучите протокол NT LAN Manager и узнайте, какие данные передаются по сети при аутентификации пользователей.
-
Глава 41 (EN) руководства Samba содержит подробную информацию о базах данных TDB и о том, как устранять связанные с ними проблемы.
-
На Web-сайте программы сертификации LPIC (EN) вы найдете подробные цели, списки задач и примерные вопросы всех трех уровней сертификации на администратора Linux-систем профессионального института Linux. В частности, на этом сайте представлены подробные цели экзамена LPI 302 (EN), а также примеры заданий и вопросов (EN).
-
Просмотрите всю серию статей для подготовки к экзаменам института LPI (EN) на сайте developerWorks, основанных на предыдущих целях, определенных до апреля 2009 года, чтобы изучить основы администрирования Linux и подготовиться к экзаменам для получения сертификата администратора Linux.
-
В разделе Linux сайта developerWorks можно найти сотни пошаговых инструкций и руководств, загрузить программные продукты, а также получить ссылки на форумы и многие другие ресурсы, ориентированные на разработчиков и администраторов Linux.
-
Смотрите демонстрационные материалы по запросу на сайте developerWorks (EN), ориентированные как на новичков, так и на опытных разработчиков.
Получить продукты и технологии
- Загрузите Samba (EN) и следите за последними новостями разработки проекта.
- Загрузите исходный код TDB (EN), если вы планируете использовать TDB в ваших проектах.
- Если вам необходим графический интерфейс или более глубокая интеграция с различными средами, взгляните на инструменты для работы с учетными записями (EN) для Samba.
Обсудить
- Примите участие в обсуждении материала на форуме.
-
Следите за блогом developerWorks в Твиттере или подпишитесь на твиты Linux на сайте developerWorks (EN).
Шон Уолберг работал с Linux- и UNIX-системами с 1994 года в академических, корпоративных и "провайдерских" кругах. Он широко освещает вопросы системного администрирования в течение нескольких последних лет. С ним можно связаться по адресу sean@ertw.com.