Systemd-юнит для выключения дискретной карты

Опрос

Вам нравится systemd ?
Всё гуд
Ковыряется потихоньку )
На кол Леннарта!
c3904763
Приведи mount без параметров

Вывод mount
[root@arch archie]# mount
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sys on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
dev on /dev type devtmpfs (rw,nosuid,relatime,size=3022324k,nr_inodes=755581,mode=755)
run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=38,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw)
configfs on /sys/kernel/config type configfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
/dev/sda3 on /home type ext4 (rw,relatime,data=ordered)

Заменил rc.local в ExecStart на /usr/bin/bash -c 'echo OFF > /sys/kernel/debug/vgaswitcheroo/switch'
# systemctl status rc-local -l
rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/usr/lib/systemd/system/rc-local.service; enabled)
   Active: failed (Result: exit-code) since Tue 2014-01-07 15:04:48 MSK; 2min 33s ago
  Process: 287 ExecStart=/usr/bin/bash -c echo OFF > /sys/kernel/debug/vgaswitcheroo/switch (code=exited, status=1/FAILURE)
 Main PID: 287 (code=exited, status=1/FAILURE)
   CGroup: /system.slice/rc-local.service
Jan 07 15:04:48 arch systemd[1]: Starting /etc/rc.local Compatibility...
Jan 07 15:04:48 arch bash[287]: /usr/bin/bash: /sys/kernel/debug/vgaswitcheroo/switch: No such file or directory
Jan 07 15:04:48 arch systemd[1]: rc-local.service: main process exited, code=exited, status=1/FAILURE
Jan 07 15:04:48 arch systemd[1]: Failed to start /etc/rc.local Compatibility.
Jan 07 15:04:48 arch systemd[1]: Unit rc-local.service entered failed state.
Получается, что не успевает смонтироваться /sys/kernel/debug до отправки OFF дискретной карте. Вариантов решения много: сделать паузу через sleep перед отправкой OFF; привязать rc.local в After не к sys-kernel-debug.mount, а к юниту стартующему ещё позже.
c3904763
привязать rc.local в After не к sys-kernel-debug.mount, а к юниту стартующему ещё позже.
Второй способ как то по надежней кажется, так а в systemd нет такого параметра для юнита который будет работать как Requires и требовать наличия процесса для sys-kernel-debug.mount и в то же время запускать сам юнит сразу после выполнения sys-kernel-debug.mount тоесть после монтирования ?
Requires эту задачу и выполняет. Странно, на твоей диаграмме sys-kernel-debug.mount выполняется на 4-ой секунде, rc-local на 9-ой, и всё ещё debugfs не смонтирована.
c3904763, а может быть проблема в том что у меня стоит Before=kdm.service просто если его не указать иксы не стартуют.
А вообще я тут подумал;
OnFailure= /usr/bin/bash -c 'systemctl start rc-local'  #Должно отправить наш systemd в циклический перезапуск нашего юнита до его исполнения
Щас испробую
Циклический перезапуск - некорректное решение. Может сделать отдельный юнит, а не rc-local. У меня так:
##########################################
/etc/systemd/system/vgaswitcheroo.service
##########################################
[Unit]
Description=disable diskrete graphics
Requires=sys-kernel-debug.mount
After=sys-kernel-debug.mount
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/bash -c 'echo OFF > /sys/kernel/debug/vgaswitcheroo/switch'
ExecStop=/usr/bin/bash -c 'echo ON > /sys/kernel/debug/vgaswitcheroo/switch'
[Install]
WantedBy=multi-user.target
c3904763
Циклический перезапуск - некорректное решение. Может сделать отдельный юнит, а не rc-local. У меня так:
##########################################
/etc/systemd/system/vgaswitcheroo.service
##########################################
[Unit]
Description=disable diskrete graphics
Requires=sys-kernel-debug.mount
After=sys-kernel-debug.mount
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/bash -c 'echo OFF > /sys/kernel/debug/vgaswitcheroo/switch'
ExecStop=/usr/bin/bash -c 'echo ON > /sys/kernel/debug/vgaswitcheroo/switch'
[Install]
WantedBy=multi-user.target
И все железно работает, а связка какая Intel+Amd? Странно значит переустановлю arch и попробую снова
Intel+Nvidia
Сейчас у меня этот сервис отключен, так как после очередного обновления ядра дискретка отключается сама.
0:DIS: :DynOff:0000:01:00.0
1:IGD:+:Pwr:0000:00:02.0
 
Зарегистрироваться или войдите чтобы оставить сообщение.