На оффсайте есть конечно информация по поводу того как поменять директории для файлов бд, логов и т.д. Но вот самое гадкое это то что там все примеры с /tmp
, а когда ты пытаешься указать другую директорию при включенном selinux
встречаешь ошибку в стиле Microsoft.
Создаём директории
Я уже привык не хранить важные данные в директориях по умолчанию. Я считаю правильное монтировать отдельные диски и уже там хранить данные.
Поэтому у меня в системе присутствуют три отдельных диска:
/dev/sdj
- для файлов бд (/datavolume)/dev/sdk
- для логов (/logvolume)/dev/sdl
- для временных бд (/tempdb)
Для каждого раздела создадим директории в корне.
sudo mkdir -p /datavolume/data /logvolume/log /tempdb/temp
sudo chown mssql:mssql -R /datavolume /logvolume /tempdb
sudo chmod -R 770 /datavolume /logvolume /tempdb
sudo ls -la /datavolume /logvolume /tempdb
Подготовим разделы
Сам Microsoft рекомендует использовать файловую систему xfs
. Если не понятно, что я делаю советую почитать.
sudo parted /dev/sdj mklabel gpt
sudo parted /dev/sdk mklabel gpt
sudo parted /dev/sdl mklabel gpt
sudo parted /dev/sdj mkpart primary xfs 0% 100%
sudo parted /dev/sdk mkpart primary xfs 0% 100%
sudo parted /dev/sdl mkpart primary xfs 0% 100%
sudo mkfs.xfs /dev/sdj1 -f -L datavolume
sudo mkfs.xfs /dev/sdk1 -f -L logvolume
sudo mkfs.xfs /dev/sdl1 -f -L tempdb
Также рекомендуется выставить атрибут noatime
в fstav
. Атрибут noatime
не позволяет файловой системе обновлять время доступа (atime) к файлам при каждом их чтении.
sudo vim /etc/fstab
UUID=934660c3---b5af-/datavolume xfs rw,attr2,noatime 0 0
UUID=f57711d6-aaad---/logvolume xfs rw,attr2,noatime 0 0
UUID=-8cbb--9377- /tempdb xfs rw,attr2,noatime 0 0
sudo mount -a
df -h
Указываем директории для хранения по умолчанию в MsSQL Server 2022
На самом сервере с MsSQL выполняем:
sudo setenforce 0
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /logvolume/log
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /datavolume/data
sudo setenforce 1
sudo systemctl restart mssql-server
Также можно прописать директории в конфиг файле:
sudo vim /var/opt/mssql/mssql.conf
[filelocation]
defaultdatadir = /datavolume/data
defaultlogdir = /logvolume/log
Пробуем создать бд (да, sa должен быть отключен, но у меня тест)
sqlcmd -S localhost -U sa -C
CREATE DATABASE [dsads] CONTAINMENT = NONE ON PRIMARY ( NAME = N'dsads', FILENAME = N'/datavolume/data/dsads.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) LOG ON ( NAME = N'dsads_log', FILENAME = N'/logvolume/log/dsads_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
И тут я получил ошибку:
Validation error on setting 'filelocation.defaultdatadir' '/datavolume/data' is not a valid directory
Начинаем искать логи
Естественно идём в /var/log/messages
и видим:
Feb 1 10:52:21 gr-db-56-165 sqlservr[32954]: #0152024-02-01 10:52:21.39 spid51 Failed to get the volume information, -1073741772
Feb 1 10:52:21 gr-db-56-165 sqlservr[32954]: #0152024-02-01 10:52:21.39 spid51 Failed to get the volume information, -1073741772
Feb 1 10:52:21 gr-db-56-165 sqlservr[32954]: #0152024-02-01 10:52:21.39 spid51 Error: 5123, Severity: 16, State: 1.
Feb 1 10:52:21 gr-db-56-165 sqlservr[32954]: #0152024-02-01 10:52:21.39 spid51 CREATE FILE encountered operating system error 5(Access is denied.) while attempting to open or create the physical file '/datavolume/data/dsads.mdf'.
Понятное дело, что первым делом нужно отрубить selinux и попробовать еще раз. И если бд создалась, то нужно добавить правило для selinux.
Правило для selinux
Проверим что у нас есть на mssql:
sudo tail -f /var/log/audit/audit.log | grep mssql
type=AVC msg=audit(1706764257.978:13060): avc: denied { read } for pid=34201 comm="Wt-760" name="/" dev="sdj1" ino=128 scontext=system_u:system_r:mssql_server_t:s0
Проверим какое правила можно создать:
sudo dnf install policycoreutils-python-utils
sudo audit2allow -a
#============= mssql_server_t ==============
#!!!! This avc is allowed in the current policy
allow mssql_server_t unlabeled_t:dir { add_name getattr open read remove_name search write };
#!!!! This avc is allowed in the current policy
allow mssql_server_t unlabeled_t:file { create getattr lock open read unlink write };
Создаём правило и применяем его:
sudo grep mssql_server_t /var/log/audit/audit.log | sudo audit2allow -M mssql_server_t
sudo semodule -i mssql_server_t.pp
sudo systemctl restart mssql-server
После этого всё должно работать. Немного подробнее о создании правила для selinux можно почитать тут.
Комментарии