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-aloop
はlinux-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-modules
とlinux-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/grub
のGRUB_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
2
3
4
5
6
| null
Discard all samples (playback) or generate zero samples (capture)
default:CARD=Loopback
Loopback, Loopback PCM
Default Audio Device
...
|
ループバックデバイスが有効になりました!