LINUX.ORG.RU
ФорумAdmin

Помогите написать unit к systemd

 , ,


1

3

Задачка такова, есть ubuntu 16.04 и юнит zram_tmp.service (взят осель https://github.com/vaeth/zram-init как и /usr/bin/zram-init):

[Unit]
Description=Mount /tmp as zram. Mask tmp.mount if you use this
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target

[Service]
Type=oneshot
RemainAfterExit=true

ExecStart=/usr/sbin/zram-init -d1 -s2 -alz4 -text4 -ostrictatime -m1777 4096 /mnt/aufs/zram
ExecStop=/usr/sbin/zram-init -d1 0 /mnt/aufs/zram

[Install]
WantedBy=local-fs-pre.target

Есть второй юнит aufs_tmp.service:

[Unit]
Description=Mount /tmp as aufs. Mask tmp.mount if you use this
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
Requires=zram_tmp.service systemd-modules-load.service

[Service]
Type=oneshot
RemainAfterExit=true

ExecStart=/bin/mount -t aufs -o br=/mnt/aufs/zram=rw:/mnt/aufs/rw=rw -o udba=reval none /tmp
ExecStop=/bin/umount /tmp

[Install]
WantedBy=local-fs.target

Второй написан по мотивам первого. В общем не работает второй юнит. Либо пишет «неизвестная ФС aufs». Но если я после загрузки из терминала выполню

/bin/mount -t aufs -o br=/mnt/aufs/zram=rw:/mnt/aufs/rw=rw -o udba=reval none /tmp
все спокойно сработает. Либо пишет, что /mnt/aufs/zram это read-only inode или point.

Уже что только я ни пробовал, не хочет работать.

Ответ на: комментарий от unikum

Это я закоментил. Теперь выдает:

[    4.924659] aufs 4.6
[    4.942378] systemd[1]: Starting Mount /tmp as aufs. Mask tmp.mount if you use this...
[    4.953305] aufs test_br:175:mount[918]: write permission for readonly mount or inode, /mnt/aufs/zram
[    4.984357] systemd[1]: aufs_tmp.service: Main process exited, code=exited, status=32/n/a
[    4.985414] systemd[1]: Failed to start Mount /tmp as aufs. Mask tmp.mount if you use this.
[    4.988268] systemd[1]: aufs_tmp.service: Unit entered failed state.
[    4.989225] systemd[1]: aufs_tmp.service: Failed with result 'exit-code'.

Причем если в терминале после загрузки написать:systemctl start aufs_tmp.service

Все пашет.

i3draven ★★
() автор топика
Последнее исправление: i3draven (всего исправлений: 2)
Ответ на: комментарий от i3draven

После systemctl start aufs_tmp.service когда его после загрузки запускаешь вручную:

● aufs_tmp.service - Mount /tmp as aufs. Mask tmp.mount if you use this
   Loaded: loaded (/etc/systemd/system/aufs_tmp.service; enabled; vendor preset: enabled)
   Active: active (exited) since Ср 2016-08-03 23:47:11 MSK; 2s ago
  Process: 5126 ExecStart=/bin/mount -t aufs -o br=/mnt/aufs/zram=rw:/mnt/aufs/rw=rw -o udba=reval none /tmp (code=exited, status=0/SUCCESS)
 Main PID: 5126 (code=exited, status=0/SUCCESS)

авг 03 23:47:11 i3draven-W250ENQ-W270ENQ systemd[1]: Starting Mount /tmp as aufs. Mask tmp.mount if you use this...
авг 03 23:47:11 i3draven-W250ENQ-W270ENQ systemd[1]: Started Mount /tmp as aufs. Mask tmp.mount if you use this.

mount|grep /tmp

none on /tmp type aufs (rw,relatime,si=392620e3d02fd0db)

Но сам работать при загрузке отказывается, так и пишет, что /mnt/aufs/zram только для чтения. Может его надо после еще какого то юнита запустить?

i3draven ★★
() автор топика
Последнее исправление: i3draven (всего исправлений: 2)

А ты не пробовал написать .mount-юнит, а не .service-юнит, раз уж тебе нужно монтировать что-то?

(Позже отвечу более развёрнуто и по существу.)

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Спасибо за наводку. Все сделано и работает.

cat /etc/systemd/system/tmp.mount 

[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
Before=local-fs.target
Requires=zram_tmp.service systemd-modules-load.service
After=zram_tmp.service systemd-modules-load.service

[Mount]
What=none
Where=/tmp
Type=aufs

cat /etc/systemd/system/zram_tmp.service 
[Unit]
Description=Mount /tmp as zram. Mask tmp.mount if you use this
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target

[Service]
Type=oneshot
RemainAfterExit=true

# Adapt the maximal size (in MB) and other options like maximal number of
# parallel streams (-s) to your needs.
# Make sure to avoid collision of devices (-d...) with
# zram_swap.service and zram_var_tmp.service and
# that num_devices in modprobe.d/zram.conf contains the maximal used number + 1

ExecStart=/usr/sbin/zram-init -d1 -s2 -alz4 -text4 -ostrictatime -m1777 4096 /mnt/aufs/zram
ExecStop=/usr/sbin/zram-init -d1 0 /mnt/aufs/zram

[Install]
WantedBy=local-fs-pre.target

Совместно с юнитами с того github-а, который я приводил этот унит монтирует /tmp как aufs, состоящий из zram диска+папки на ssd. Думаю это позволит при заполнении рамдиска писать данные на ssd. Пока проверил, данные сначала пишутся на zram диск. Я не нашел конкретного описания такого поведения у aufs в документации, потому пришлось проверять. Данные если не указать другой стратегии пишуться по очереди как у казаны папки при создании aufs.

i3draven ★★
() автор топика
Последнее исправление: i3draven (всего исправлений: 2)
Ответ на: комментарий от i3draven

Не до конца скопировал текст юнита:

cat /etc/systemd/system/tmp.mount 
[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
Before=local-fs.target
Requires=zram_tmp.service systemd-modules-load.service
After=zram_tmp.service systemd-modules-load.service

[Mount]
What=none
Where=/tmp
Type=aufs
Options=br=/mnt/aufs/zram=rw:/mnt/aufs/rw=rw,udba=reval

Теперь наконец-то при распаковке автоматического обновления на IDE, которой я пользуюсь места будет хватать.

i3draven ★★
() автор топика
Последнее исправление: i3draven (всего исправлений: 2)
Ответ на: комментарий от i3draven

Выяснил небольшой косяк. Надо в tmp.mount строку монтирования задать так

Options=br=/mnt/aufs/zram=rw:/mnt/aufs/rw=rw,udba=reval,sum

Что бы место со всех слоев суммировалось свободное. Иначе он только свободное место первого слоя показывает.

i3draven ★★
() автор топика
Ответ на: комментарий от i3draven

Остается вопрос. Монтируется ли данный моунт юнит до всех операций с /tmp? Или сначала кто то успевает в /tmp нагадить, а потом поверх монтируется aufs. Это я не проверял пока.

i3draven ★★
() автор топика
Ответ на: комментарий от i3draven

Еще один косяк найден. Если в aufs есть два бранча, допустим 1Гб и 5Гб. Мы записываем файл размером 2Гб в aufs. Он начинается писаться в бранч 1Гб размером, а когда места в нем уже нет, выдается сообщение, что нет места. Зараза. Хотя по логике нужен режим в котором запись бы продолжалась на втором бранче, а куски были видны в рамках ФС как один цельный файл.

Вероятно такой режим есть, но я пока его не нашел.

i3draven ★★
() автор топика
Последнее исправление: i3draven (всего исправлений: 1)
Ответ на: комментарий от i3draven

Судя по всему для такого поведения в aufs функционала нету, всю скудную документацию я прочитал. Блин, придется искать другую ФС. Хотя пишут, что она это может, но нигде не могу найти как. Вроде как они просто это должна делать и все.

i3draven ★★
() автор топика
Последнее исправление: i3draven (всего исправлений: 1)
Ответ на: комментарий от i3draven

Максимум на что можно рассчитывать для случая когда в бранче нет места, это заранее указать create=mfs в опциях монтирования. Это приведет к тому, что для создания новых файлов будет выбираться бранч где места больше всего. Это для решаемой задачи не подходит и ничего большего нет. Так что остается секретное решение. Это btrfs, которая может объединить zram диск и файл на диске в одну ФС прозрачно. Так что можно во время инициализации создавать в zram и в файле btrfs, а потом объединять их в одну btrfs и монтировать в /tmp

Ручками я это все делал, но инит файлы напишу под настроение повозится, когда оно снова будет :)

i3draven ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.