EC2のUbuntuでALSA Loopbackデバイスを使う

 ·   ·  ☕ 4 min read
ALSAのLoopbackデバイスを使うためにはsnd-aloopモジュールをロードする必要がありますが、EC2のUbuntuでaptを使ってsnd-aloopモジュールをインストールするにはカーネルの変更が必要です。

次の環境で確認しました。

  • Ubuntu 16.04 LTS (GCE)
  • Ubuntu 16.04 LTS (EC2)
  • Ubuntu 18.04 LTS (EC2)

EC2でALSA Loopbackデバイスがロードできない

Linuxで音を扱うときに避けては通れないALSAですが、録音等に使える便利なループバックデバイスがあります。今回は、EC2で起動したUbuntu 18.04 LTSで、ループバックデバイスを使いたいとします。

arecordで利用できるサウンドデバイスを確認します。

1
2
sudo apt -y install alsa-utils
sudo arecord -L
1
2
null
    Discard all samples (playback) or generate zero samples (capture)

IaaSのVMなので当然ですが、実際のサウンドデバイスはありません。ループバックデバイスを有効にするためにsnd-aloopカーネルモジュールをロードします。

1
sudo modprobe snd-aloop
1
modprobe: FATAL: Module snd-aloop not found in directory /lib/modules/5.3.0-1023-aws

おっと、snd-aloopが無いみたいですね。

どうやらsnd-alooplinux-modules-extraにあるようなので、自分のカーネルにあったバージョンをインストールします。
Alsa snd-aloop kernel module for 16.04 or 14.04 server? - Ask Ubuntu

1
2
# install linux-modules-extra-5.3.0-1023-aws
sudo apt -y install linux-modules-extra-`uname -r`
1
2
sudo modprobe snd-aloop
# modprobe: FATAL: Module snd-aloop not found in directory /lib/modules/5.3.0-1023-aws

無い…なぜ…。

解決法: Linuxカーネルを変更する

EC2のUbuntu AMIのカーネルは(IaaSなのでALSAを使うことを考えていないのか)snd-aloopを用意していないようです。自力でビルドするのは大変なので、snd-aloopが用意されているカーネルに変更します。
How to Change the Default Ubuntu Kernel - Meetrix.IO

現在のカーネルがAWS用のものであることを確認します。

1
2
uname -r
# 5.3.0-1023-aws

次に、Ubuntu標準のgenericカーネルでインストールできるものを探します。

1
sudo apt search linux-modules-5.3.0 | grep generic
1
2
3
4
...
linux-modules-5.3.0-51-generic/bionic-updates,bionic-security 5.3.0-51.44~18.04.2 amd64
linux-modules-5.3.0-53-generic/bionic-updates,bionic-security 5.3.0-53.47~18.04.1 amd64
linux-modules-5.3.0-59-generic/bionic-updates,bionic-security 5.3.0-59.53~18.04.1 amd64

せっかくなので最新版にしましょう。5.3.0-59-genericです。linux-moduleslinux-modules-extraもインストールします。

1
2
3
sudo apt -y install linux-image-5.3.0-59-generic \ 
  linux-modules-5.3.0-59-generic \ 
  linux-modules-extra-5.3.0-59-generic

起動するカーネルを変更

これでブートメニューからgenericカーネルを選べるようになりましたが、EC2でブートメニューを選ぶことは普通しないと思うので、デフォルトのカーネルを変更します。

ブードメニュー(grub.cfg)を確認します。

1
grep -A100 submenu /boot/grub/grub.cfg | grep menuentry
1
2
3
4
5
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-2ce321d3-087f-4a58-8f97-ed6135e77fee' {
	menuentry 'Ubuntu, with Linux 5.3.0-1023-aws' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-1023-aws-advanced-2ce321d3-087f-4a58-8f97-ed6135e77fee' {
	menuentry 'Ubuntu, with Linux 5.3.0-1023-aws (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-1023-aws-recovery-2ce321d3-087f-4a58-8f97-ed6135e77fee' {
	menuentry 'Ubuntu, with Linux 5.3.0-59-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-59-generic-advanced-2ce321d3-087f-4a58-8f97-ed6135e77fee' {
	menuentry 'Ubuntu, with Linux 5.3.0-59-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.3.0-59-generic-recovery-2ce321d3-087f-4a58-8f97-ed6135e77fee' {

/etc/default/grubGRUB_DEFAULTを書き換えます。ブードメニューは{submenu}>{menuentry}のように指定します。今回はUbuntu, with Linux 5.3.0-59-genericで起動したいので、gnulinux-advanced-2ce321d3-087f-4a58-8f97-ed6135e77fee>gnulinux-5.3.0-59-generic-advanced-2ce321d3-087f-4a58-8f97-ed6135e77feeと指定します。

その後、update-grubして再起動します。

1
2
3
sudo sed -i -e 's/GRUB_DEFAULT=0/GRUB_DEFAULT="gnulinux-advanced-2ce321d3-087f-4a58-8f97-ed6135e77fee>gnulinux-5.3.0-59-generic-advanced-2ce321d3-087f-4a58-8f97-ed6135e77fee"/' /etc/default/grub
sudo update-grub
sudo reboot

カーネル変更後

カーネルの変更が成功したことを確認します。

1
2
uname -r
# 5.3.0-59-generic

snd-aloopをロードします。今度は成功しました。

1
modprobe snd-aloop

再度サウンドデバイスの一覧を確認すると…

1
arecord -L
1
2
3
4
5
6
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=Loopback
    Loopback, Loopback PCM
    Default Audio Device
...

ループバックデバイスが有効になりました!