JavaScriptを有効にしてください

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

 ·   ·  ☕ 4 min read
EC2のLinuxでALSA Loopbackデバイスを使うための手順です。ALSAのLoopbackデバイスを使うためにはsnd-aloopモジュールをロードする必要があります。EC2のUbuntuでapt-get snd-aloopしたらダメでした。カーネルを変更したらうまくいきました。

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

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

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

Linuxで音を扱うときに避けては通れないALSAですが、録音等に使える便利なループバックデバイスがあります。本記事は、AWSのUbuntu 18.04 LTSのイメージでALSAのループバックデバイスを使うための手順を説明します。

VMにログインしたら、arecordで利用できるサウンドデバイスを確認してみましょう。

1
2
sudo apt -y install alsa-utils
sudo arecord -L

出力はnullだけでした。サウンドデバイスを搭載したマシンなら実際のサウンドデバイスがここに出現します。EC2はIaaSのVMなので当然ですが、実際のサウンドデバイスはありません。ここまでは予想通りです。

1
2
null
    Discard all samples (playback) or generate zero samples (capture)

続いて、ループバックデバイスを有効にするために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`

インストール後、もう一度snd-aloopカーネルモジュールをロードしてみます。

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

まず、uname -rで現在のカーネルがAWS向けであることを確認します。

1
2
uname -r
# 5.3.0-1023-aws

次に、aptを使い、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

普通のPCであれば、これでブートメニューに複数のカーネルが現れるはずです。しかし、EC2でブートメニューを選ぶことは普通しないと思うので、デフォルトで起動するカーネルを変更します。

起動するカーネルを変更

ブートメニュー(grub.cfg)を確認してみましょう。

1
grep -A100 submenu /boot/grub/grub.cfg | grep menuentry

ブートメニューのエントリが表示されました。もともとの-awsに加えて、先ほどインストールした-genericがありますね。

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' {

デフォルトでUbuntu, with Linux 5.3.0-59-genericで起動するように設定しましょう。

デフォルトのカーネルは/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

カーネル変更後

uname -rでカーネルの変更が成功したことを確認しましょう。

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
...

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