systemd-nspawn, alsa и Loopback Mixer

Всех приветствую.

зашёл в тупик по такому вопросу:
1. имеется контейнер, который запускается посредством команды:
systemd-nspawn -bD steamcontainer -M "steamcontainer" \
--volatile=no \
--bind=/dev/shm \
--bind=/dev/snd \
--bind=/dev/dri \
--bind=/dev/kvm \
--bind=/dev/input \
--bind-ro=/tmp/.X11-unix:/tmp/.X11-unix \
--property="DeviceAllow=/dev/dri rw" \
--property="DeviceAllow=/dev/shm rw" \
--property="DeviceAllow=/dev/kvm rw" \
--property="DeviceAllow=/dev/input rw" \
--property="DeviceAllow=/dev/dri/renderD128 rw" \
--property="DeviceAllow=char-usb_device rwm" \
--property="DeviceAllow=char-input rwm" \
--property="DeviceAllow=char-alsa rwm" \
--property="DeviceAllow=char-drm rwm"
2. доступ устройств к контейнеру осуществялется через команду выше и через
xhost +local:
3. Имеется виртуальная звуковая карта, настроенная через альсу, позволяющая выводить звук одновременно в несколько приложений:
**** List of PLAYBACK Hardware Devices ****
card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 7/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 11: HDMI 5 [HDMI 5]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 0: ALC1220 Analog [ALC1220 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 1: ALC1220 Digital [ALC1220 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
4. контейнер звук проигрывает, но только когда звуковая карта не занята другими приложениями, иначе следует ошибка:
Playback device is hw:Loopback,0,0
Stream parameters are 48000Hz, S16_LE, 2 channels
Using 16 octaves of pink noise
Playback open error: -16,Device or resource busy
5. asoundrc
defaults.pcm.card 0
defaults.ctl.card 0
defaults.pcm.dmix.!rate 96000
defaults.pcm.dmix.!format S16_LE
defaults.pcm.rate_converter "speexrate_best"

pcm.!default {
  type asym
  playback.pcm "LoopAndReal"
  #capture.pcm "looprec"
  capture.pcm "MixLoopback" #hw:0,1
}

pcm.looprec {
    type hw
    card "Loopback"
    device 0
    subdevice 1
}
pcm.LoopAndReal {
  type plug
  slave.pcm mdev
  route_policy "duplicate"
}
pcm.mdev {
  type multi
  slaves.a.pcm pcm.MixReale
  slaves.a.channels 2
  slaves.b.pcm pcm.MixLoopback
  slaves.b.channels 2
  bindings.0.slave a
  bindings.0.channel 0
  bindings.1.slave a
  bindings.1.channel 1
  bindings.2.slave b
  bindings.2.channel 0
  bindings.3.slave b
  bindings.3.channel 1
}
pcm.MixReale {
  type dmix
  ipc_key_add_uid true
  ipc_perm 0666
  ipc_key 1024
  slave {
    pcm "hw:2,0"
    rate 96000
    #rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

pcm.MixLoopback {
  type dmix
  ipc_key_add_uid true
  ipc_perm 0666
  ipc_key 1025
  slave {
    pcm "hw:Loopback,0,0"
    rate 96000
    #rate 48000
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 131072
  }
}
# Multi, splitting onto usual card and loopback
pcm.out {
    type plug
    slave.pcm {
        type multi
        slaves {
            a { channels 2 pcm "dmix:MixReale" }
            b { channels 2 pcm "dmix:MixLoopback" }
        }
        bindings {
            0 { slave a channel 0 }
            1 { slave a channel 1 }
            2 { slave b channel 0 }
            3 { slave b channel 1 }
        }
    }
    ttable [
        [ 1 0 1 0 ]   # left  -> a.left,  b.left
        [ 0 1 0 1 ]   # right -> a.right, b.right
    ]
}

defaults.pcm.surround21.card off
defaults.pcm.surround21.device off
defaults.pcm.surround40.card off
defaults.pcm.surround40.device off
defaults.pcm.surround41.card off
defaults.pcm.surround41.device off
defaults.pcm.surround50.card off
defaults.pcm.surround50.device off
defaults.pcm.surround51.card off
defaults.pcm.surround51.device off
defaults.pcm.surround71.card off
defaults.pcm.surround71.device off

прошу помочь советом есть ли возможность заставить звук работать в контейнере?
frankyboy
есть ли возможность заставить звук работать в контейнере?
Очень много нюансов, в том числе и что это за контейнер.
Основное назначение systemd_nspawn - это отладка, восстановление системы вместо chroot - просто это намного удобнее и проще (для перехода в контейнер нужно запустить всего 2 команды) и больше возможностей. В остальных случаях лично по мне так это лишнее …
Сам использовал systemd_nspawn несколько раз и даже выполнял обновление/замену пакетов - удобно тем, что работает интернет, можешь отрыть/посмотреть любой документ, подключить любое нужное устройство … так как все это выполняется из нормальной работающей системы, а контейнер с аварийной системой занимает при этом только один терминал-эмулятор - то есть в любой момент можешь переключиться из этого терминала в другое окно ...
Но вот с подключением устройств и изменением интерфейсов в самом контейнере не все так просто
systemd-nspawn limits access to various kernel interfaces in the container to read-only, such as /sys, /proc/sys or /sys/fs/selinux. Network interfaces and the system clock may not be changed from within the container. Device nodes may not be created. The host system cannot be rebooted and kernel modules may not be loaded from within the container.
Как пример, имею USB 3g Modem, вывод lsusb одинаков и в системе и в контейнере
lsusb
Bus 003 Device 002: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
В системе все нормально
file /dev/bus/usb/003/002
/dev/bus/usb/003/002: character special (189/257)
А вот в контейнере проблемы
file /dev/bus/usb/003/002
/dev/bus/usb/003/002: cannot open `/dev/bus/usb/003/002' (No such file or directory)
Смотрим модуль
lsmod | grep usbserial
… пусто …
пробуем загрузить
modprobe -v usbserial
modprobe: FATAL: Module usbserial not found in directory /lib/modules/5.8.1-arch1-1
… и понятно, что не загрузим …
Но я не стал и разбираться, просто это мне и не нужно, так как если подключаю модем в самой системе, то сеть имеется и в контейнере и можно спокойно обновиться
root # pacman -Syu
:: Обновление баз данных пакетов…
Пакеты (10) dhcpcd-9.3.2-1  go-2:1.15.4-1  imagemagick-7.0.10.37-1  lib32-libldap-2.4.54-1
            linux-5.9.6.arch1-1  linux-headers-5.9.6.arch1-1  linux-lts-5.4.75-1
            linux-lts-headers-5.4.75-1  sysstat-12.4.0-2  zbar-0.23.1-3
…………..
==> finished: 10 packages removed (disk space saved: 316.05 MiB)
обновились, смотрим какое ядро стало в контейнере
root # ls /usr/lib/modules
5.4.75-1-lts 5.9.6-arch1-1
… то есть обновилось до linux-5.9.6.arch1-1 … но в тоже время в самой системе, А НЕ SYSTEMD_NSPAWN имеем
root # uname -r
5.8.1-arch1-1

Кроме этого есть еще и нюансы с разрешением доступа к устройствам в случае если вывод file /dev/bus/usb/00N/00M нормальный
Ошибки не исчезают с опытом - они просто умнеют
vasek
root # ls /usr/lib/modules
5.4.75-1-lts 5.9.6-arch1-1
на данный момент, единственное, что могу заметить, так это то, что в контейнере у меня пакет линукс не установлен.
frankyboy
единственное, что могу заметить, так это то, что в контейнере у меня пакет линукс не установлен.
Опишу немного, как я использую этот systemd-nspawn
Потратил как то часть времени на изучение этого systemd-nspawn, подумал, подумал как его применить, но ничего в голову не пришло, кроме одного - восстановление системы … вместо chroot. Нюансов с использованием этого systemd-nspawn возникает много, но это связано с тем, что глубоко не копаем и многие положения не совсем понимаем.
А вот в части использования вместо chroot мне понравилось, одно НО - нужна 2-ая система Linux, которая у меня всегда стоит (клон рабочей системы). Конечно, кто не экспериментирует с системой, это ему в принципе и не нужно. Мне же, хоть и не часто, но требуется.
Какие удобства?
- находишься в рабочей системе Linux - под рукой любые документы с нужной информацией, список команд, при необходимости можно и погуглить
- наличие интернета в рабочей системе можно использовать и в контейнере, то есть имеется возможность сделать обновление, установку нужных пакетов
- полный доступ ко всем файлам в контейнере
- простота запуска контейнера, всего две команды: 1-ая - монтирование нужного контейнера/системы, 2-ая - запуск
Контейнером у меня является или рабочая система или ее клон, настроен запуск контейнера/системы в rescue mode - большего мне и не нужно.

Конечно, кому то покажется это не разумным и громозким, но у меня правило - всегда иметь 2-ую систему Linux - вместо Live CD/USB - а с недавнего времени в качестве 2-ой системой стал использовать клон рабочей системы (клон обновляется редко) … это еще и удобно тем, что по-существу это backup системы, но вполне рабочий … а потому в данном случае мне и удобнее использовать systemd-nspawn вместо chroot, вот только пока не пойму - полноценная ли это замена chroot? не ли каких-либо темных нюансов.
Ошибки не исчезают с опытом - они просто умнеют
 
Зарегистрироваться или войдите чтобы оставить сообщение.