На оффсайте есть конечно информация по поводу того как поменять директории для файлов бд, логов и т.д. Но вот самое гадкое это то что там все примеры с /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 можно почитать тут.