В хранении неизменных данных есть две проблемы: занимаемое место и количество файлов. Второе актуально для всяческих сборников книг и прочих рипов древних сайтов. Хочется, чтобы информация лежала одним куском, занимала минимум места и при этом была доступна без ручного вмешательства.
Для себя я нашел выход в использовании сжатой файловой системы sqashfs.
Эта файловая система удовлетворяет двум из трех требований: данные хранятся в образе одним куском и занимают меньше места, благодаря сжатию. Доступность я пилил уже сам.
Все свои эксперименты я проводил на поддиванном сервере с ОС Debian 9 x64.
План действий был такой:
- Выделить каталог для хранения образов;
- Для каждого образа создать подкаталог;
- Смонтировать образ в подкаталог с соответствующим именем;
- Сделать символическую ссылку в нужном месте.
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" с содержимым смонтированного образа.