26 ноября 2017

Как я squashfs монтировал.



В хранении неизменных данных есть две проблемы: занимаемое место и количество файлов. Второе актуально для всяческих сборников книг и прочих рипов древних сайтов. Хочется, чтобы информация лежала одним куском, занимала минимум места и при этом была доступна без ручного вмешательства.
Для себя я нашел выход в использовании сжатой файловой системы sqashfs.

Эта файловая система удовлетворяет двум из трех требований: данные хранятся в образе одним куском и занимают меньше места, благодаря сжатию. Доступность я пилил уже сам.

Все свои эксперименты я проводил на поддиванном сервере с ОС Debian 9 x64.

План действий был такой:
  1. Выделить каталог для хранения образов;
  2. Для каждого образа создать подкаталог;
  3. Смонтировать образ в подкаталог с соответствующим именем;
  4. Сделать символическую ссылку в нужном месте.
Так как в Debian 9 используется systemd, то и делать буду всё с помощью юнитов.
Mount-юниты в данном случае мне не подошли, потому что я не нашёл способа делать шаблоны на них, а писать юнит для каждого образа слишком муторно. В итоге я всё сделал на обычных service-юнитах.

И по пунктам.
Всё добро я складываю в каталог "/data/squash", точки монтирования делаю там же, а символические ссылки раскидываю уже руками. Сделать это нужно один раз, поэтому мудрить не надо.

В страшных муках отладки я написал вот такой юнит:

$ systemctl cat squashmount@
# /etc/systemd/system/squashmount@.service
[Unit]
Description=Mount for /data/squash/%i
Wants=local-fs.target
After=local-fs.target

[Service]
# создание каталога
ExecStartPre=/bin/mkdir -p /data/squash/%i
# изменение владельца для доступа по сети
ExecStartPre=/bin/chown share:share /data/squash/%i
# монтирование
ExecStart=/bin/mount -t squashfs /data/squash/%i.squashfs /data/squash/%i
# размонтирование
ExecStop=/bin/umount /data/squash/%i
# считать юнит запущенным после отработки ExecStart
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Из комментариев должна быть понятна его работа. Вместо "%i" будет подставляться строка после "@" в названии службы.

Для теста можно создать некий образ с мусором командой:

mksquashfs /path/to/trash trash.squashfs -comp xz

Положить получившийся файл в "/data/squash" и запустить сервис:

sudo systemctl start squashmount@trash

Должен появиться каталог "/data/squash/trash" с содержимым смонтированного образа.