CUI環境でVirtualBox7とVagrantをインストールして実際に仮想マシンを起動する

公式サイトの記述をもとに、VirtulBoxとvagrantをインストールします。実際に仮想マシンをたちあげ、ホストとゲスト(仮想マシン)でファイルを共有(転送)したりと、色々な実践をします。

https://www.virtualbox.org/

Ubuntu 22.04 LTSのCUI(コマンドラインインターフェース)環境にVirtualBox 7をインストールする手順は以下のとおりです。

APTのソースリストファイルは、Ubuntuがソフトウェアパッケージをダウンロードするためのリポジトリ(パッケージソース)のリストを保持しています。このファイルは通常 /etc/apt/sources.list または /etc/apt/sources.list.d/ ディレクトリ内にあります。公式ページによると以下の内容を/etc/apt/sources.listに記述するようにとのことです。sudo vi /etc/apt/sources.listと入力してテキストエディタを開き、編集します。

deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] https://download.virtualbox.org/virtualbox/debian jammy contrib

このコマンドは、VirtualBoxのためのAPTリポジトリをUbuntuシステムのリポジトリリストに追加するためのものです。コマンドの各部分の意味は以下の通りです。

  • deb:このキーワードは、APTリポジトリのエントリを表します。debはDebianパッケージリポジトリを意味し、UbuntuはDebianベースなのでこの形式を使用します。
  • [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg]:この部分は2つの情報を提供します。arch=amd64は、このリポジトリが64ビットのAMDアーキテクチャ(一般的なモダンPCに該当)のパッケージを提供していることを意味します。signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpgは、このリポジトリのパッケージが指定されたGPG鍵によって署名されていることを示しており、セキュリティを確保するためのものです。
  • https://download.virtualbox.org/virtualbox/debian:これはVirtualBoxのパッケージがホストされているリポジトリのURLです。
  • jammy:これはUbuntuのリリースコード名を指し、Ubuntu 22.04 LTS(Jammy Jellyfish)を意味します。このエントリは、Ubuntu 22.04用のパッケージを含むリポジトリの部分を指します。
  • contrib:この部分はリポジトリのセクションを指し、ここでは「contrib」セクションを指します。これは、フリーソフトウェアではないが、フリーソフトウェアと共に動作するソフトウェアを含むセクションです。

このコマンドラインは、通常、/etc/apt/sources.listファイルまたは/etc/apt/sources.list.d/ディレクトリ内の専用のリストファイルに追加され、システムがVirtualBoxの新しいバージョンやアップデートを取得できるようにします。

wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo gpg --dearmor --yes --output /usr/share/keyrings/oracle-virtualbox-2016.gpg

このコマンドは、VirtualBoxのAPTリポジトリ用の公開鍵をダウンロードし、それをシステムの信頼できる鍵として登録するために使われます。コマンドの各部分について説明します。

  1. wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc:
    • wgetはウェブからファイルをダウンロードするためのコマンドです。
    • -O-オプションは、ダウンロードしたファイルをディスクに保存するのではなく、標準出力に直接送るように指示します。
    • https://www.virtualbox.org/download/oracle_vbox_2016.ascは、VirtualBoxの公開鍵がホストされているURLです。この鍵はVirtualBoxのパッケージが信頼できるものであることを確認するために使われます。
  2. |:
    • この記号はパイプと呼ばれ、一つのコマンドの出力を別のコマンドの入力として直接渡すために使用されます。ここでは、wgetでダウンロードした公開鍵を次のコマンドに渡しています。
  3. sudo gpg --dearmor --yes --output /usr/share/keyrings/oracle-virtualbox-2016.gpg:
    • sudoはコマンドを管理者権限(スーパーユーザー)で実行するためのコマンドです。
    • gpgはGNU Privacy Guardの略で、暗号化と鍵管理を行うためのツールです。
    • --dearmorオプションは、ASCII形式の鍵(.ascファイル)をバイナリ形式のGPG鍵に変換します。
    • --yesオプションは、すべてのプロンプトに対して自動的に「はい」と答えるように指示します。
    • --output /usr/share/keyrings/oracle-virtualbox-2016.gpgは変換されたバイナリ鍵を指定されたパスに保存するように指示します。このパスは、APTが信頼する鍵を保存するための標準的な場所の一つです。

このコマンド全体の目的は、VirtualBoxのAPTリポジトリの公開鍵をダウンロードし、UbuntuシステムがVirtualBoxのパッケージを安全にインストールできるようにするためのものです。

ここまででVirtualBoxをインストールできる準備ができました。新しいリポジトリを追加したので、パッケージリストを更新して、インストールします

sudo apt-get update
sudo apt-get install virtualbox-7.0

インストール後のバージョン確認をします。

VBoxManage -v

続いて、Vagrantをインストールします。VagrantはVirtualBoxと非常に相性が良いです。実際、VirtualBoxはVagrantのデフォルトのプロバイダー(バックエンド)です。これは、Vagrantを使用する際にVirtualBoxが最も一般的に推奨され、広くサポートされている仮想化プラットフォームの一つであることを意味します。

VirtualBoxとVagrantの相性の良さの理由

  1. 無償で利用可能: VirtualBoxは無料で利用できるオープンソースの仮想化ソフトウェアです。Vagrantもオープンソースで無料です。このため、コストをかけずに開発環境を構築できます。
  2. 広範なプラットフォームサポート: VirtualBoxはWindows、macOS、Linuxといった多くのホストオペレーティングシステムで動作します。Vagrantもこれらのプラットフォームで動作するため、幅広い開発環境に適応します。
  3. 簡単なセットアップ: VirtualBoxをバックエンドとするVagrantの設定は非常に簡単です。基本的に、Vagrantfileに適切な設定を記述すれば、コマンド一つで仮想マシンが起動し、必要な環境が構築されます。
  4. コミュニティとの連携: VirtualBoxは長年にわたって開発されてきたため、豊富なドキュメントとコミュニティのサポートがあります。Vagrantも同様に強力なコミュニティを持っており、両者を組み合わせることで、多くのリソースとサポートを利用できます。
  5. ボックス(Box)の豊富さ: Vagrantでは、仮想マシンのテンプレートとして「ボックス」を使用します。VirtualBox向けのボックスは非常に豊富で、さまざまなOSや設定が事前に用意されています。

VirtualBoxとVagrantの組み合わせは、特に開発環境の構築と管理において、その使いやすさとアクセシビリティから、多くの開発者にとって魅力的な選択肢です。

https://www.vagrantup.com/

公式ページでインストールコマンドを確認することができます。

このコマンド列は、HashiCorpの公式リポジトリからVagrantをUbuntuシステムにインストールする手順です。それぞれのコマンドの意味は以下の通りです。

  1. 公開鍵のダウンロードと追加:

    wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
    • wget -O- https://apt.releases.hashicorp.com/gpg:HashiCorpの公開鍵をインターネットからダウンロードします。-O-オプションは出力を標準出力にリダイレクトします。
    • |:パイプ記号は、左側のコマンドの出力を右側のコマンドの入力として渡します。
    • sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg:ダウンロードした鍵をgpgコマンドで処理し、デアーマー(ASCII形式からバイナリ形式への変換)して/usr/share/keyrings/に保存します。これにより、APTがHashiCorpのパッケージを信頼できるようになります。
  2. HashiCorpのAPTリポジトリの追加:

    echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
    • このコマンドは、HashiCorpのAPTリポジトリ情報を/etc/apt/sources.list.d/hashicorp.listファイルに追加します。
    • lsb_release -csは現在のUbuntuのリリースコード名(例えば「focal」など)を出力します。これにより、システムのバージョンに適合するリポジトリが選択されます。
  3. パッケージリストの更新とVagrantのインストール:

    sudo apt update && sudo apt install vagrant
    • sudo apt update:APTのパッケージリストを更新し、新たに追加されたリポジトリの情報を取得します。
    • &&:この記号は、左側のコマンドが成功した場合にのみ右側のコマンドを実行するように指示します。
    • sudo apt install vagrant:Vagrantをインストールします。

これらのコマンドを実行することで、HashiCorpの公式リポジトリから直接Vagrantがインストールされ、最新かつ安全なバージョンのVagrantを利用できるようになります。

インストール完了後にバージョンを確認します。

vagrant version

実際に仮想マシンを作成してみます。

https://app.vagrantup.com/boxes/search

Vagrantを使用する一般的なプロセスは、Vagrant Cloudからボックス(仮想マシンのテンプレート)を取得し、その後vagrant upコマンドを使用して仮想マシンを起動するという流れになります。以下は基本的なステップです。

  1. Vagrantfileの作成:
    最初に、Vagrantプロジェクト用のディレクトリを作成し、その中にVagrantfileという名前の設定ファイルを作成します。このファイルには、使用するボックスの名前や、VMに関する設定(メモリサイズ、CPUの数など)を指定します。
  2. ボックスの選択:
    Vagrant Cloudから必要なボックスを選択します。ボックスは基本的には仮想マシンのテンプレートで、さまざまなオペレーティングシステムや事前に設定された環境を提供します。例えば、Ubuntu、CentOS、Windowsなどがあります。
  3. Vagrantfileにボックスを指定:
    Vagrantfileに使用するボックスの名前を指定します。例えば、Ubuntu 18.04 LTSを使用する場合は以下のように書きます。

    Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/bionic64"
    end
  4. 仮想マシンの起動:
    Vagrantプロジェクトのディレクトリでコマンドラインからvagrant upコマンドを実行します。このコマンドは、Vagrantfileの設定に基づいて仮想マシンを起動し、必要に応じてボックスをダウンロードします。
  5. SSHでの接続:
    仮想マシンが起動したら、vagrant sshコマンドで仮想マシンにSSH経由で接続できます。
  6. その他の操作:
    仮想マシンの停止にはvagrant halt、破棄にはvagrant destroy、状態のリセットにはvagrant reloadなどのコマンドが使用できます。

Vagrantは非常に柔軟で、プロビジョニングスクリプト(Shellスクリプト、Ansible、Chef、Puppetなど)を使用して、仮想マシンの起動時に追加のセットアップを行うこともできます。これにより、開発環境の構築と管理が大幅に簡素化されます。

実際のコマンドは、適当なディレクトリで以下を実行します。これは、Vagrant Cloudで取得してきたVagrantfileではなく、Newタブのものをコピペしました。

mkdir ub22
cd ub22
vagrant init generic-x64/ubuntu2204

その後、Vagrantfileが作成されています。このファイルには、VMに関する設定(メモリサイズ、CPUの数など)が記述されていますが、今は初期値のまま仮想マシンを立ち上げることにします。

vagrant up

Vagrant を使用して VirtualBox の仮想マシンを立ち上げた場合、いくつかの便利なコマンドがあります。これらのコマンドは、仮想環境の管理や操作に役立ちます。以下に主なコマンドを紹介します。

  1. vagrant up: 仮想マシンを起動します。
  2. vagrant halt: 仮想マシンをシャットダウンします。
  3. vagrant reload: 仮想マシンを再起動します。これは設定ファイル(例: Vagrantfile)の変更を適用する際に特に便利です。
  4. vagrant ssh: 仮想マシンに SSH で接続します。
  5. vagrant status: 現在の仮想マシンの状態(起動中、停止中など)を確認します。
  6. vagrant destroy: 仮想マシンを停止し、削除します。
  7. vagrant suspend: 仮想マシンを一時停止します。
  8. vagrant resume: 一時停止した仮想マシンを再開します。
  9. vagrant provision: プロビジョニングスクリプトを実行して、仮想マシンを設定します。
  10. vagrant box list: 利用可能なボックス(仮想マシンのテンプレート)のリストを表示します。
  11. vagrant box update: ボックスを最新のバージョンにアップデートします。

これらのコマンドは、日常的な Vagrant の使用において非常に役立ちます。特に、vagrant upvagrant haltvagrant sshvagrant destroy は基本的な操作に必要なコマンドです。

仮想マシンを起動してしまえば、あとはstable diffusionをCPUモードで立ち上げたりするなど、ホストマシンの環境を汚すことを回避できます。コマンドで仮想マシンにSSH経由で接続します。

vagrant ssh

ここからは、ubuntu 22.04を扱っているのと変わりがありません。一度、仮想マシンから出ます。仮想マシンから出る時はexitです。また、仮想マシン内でメモリ量を確認すると2GBでした。

Vagrantfileの内容を見る限り、仮想マシンのメモリ設定はコメントアウトされています。

# config.vm.provider “virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = “1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.

つまり、この設定は有効になっていません。vb.memory = "1024" の行がコメントアウトされているため、この設定は適用されていないのです。

仮想マシンが2GBのメモリを使用しているということは、これはVagrantや仮想マシンプロバイダ(この場合はおそらくVirtualBox)のデフォルト設定によるものです。VirtualBoxのデフォルトのメモリ割り当ては仮想マシンによって異なりますが、多くの場合、1GBまたは2GBに設定されています。

メモリ割り当てを変更するには、Vagrantfile内の該当する部分のコメントアウトを解除し、必要なメモリ量に設定します。例えば、メモリを4096MB(4GB)に設定するには、以下のようにします。

config.vm.provider "virtualbox" do |vb|
  # Display the VirtualBox GUI when booting the machine
  #vb.gui = true

  # Customize the amount of memory on the VM:
  vb.memory = "4096"
end

この変更を行った後、Vagrantの仮想マシンを再起動する必要があります。これには通常、vagrant reload コマンドが使用されます。これにより、新しい設定が適用されます。仮想マシン内で、freeやlshw(システムの詳細な情報(CPU、メモリ、マザーボードなど)を表示する)コマンドを試してみると確認することができます。

ここからは、先日の続きを始めます。音楽サーバーのmpdをインストールします。クライアントのncmpcppを別のパソコンにインストールして音楽を聴きます。ポートフォワーディングや音源設定の学習になります。

https://minokamo.tokyo/2023/12/08/6537/

ここでは、設定するPCにSSH接続します。仮想マシン内で、lspcilsmodコマンドを使用してオーディオ関連のドライバがロードされているかを確認すると見つかりません。

vagrant@ubuntu2204:~$ lspci
00:00.0 Host bridge: Intel Corporation 440FX – 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02)

Vagrant Cloudのboxによっては、同じOSでも違いがあります。これらの違いは主に以下の要因によるものです。

  1. プリセット設定:
    • 各boxは特定の設定や環境変数、インストールされているパッケージなどに関してプリセットされています。例えば、一部のboxは開発環境に特化しており、必要なツールやライブラリが予めインストールされている場合があります。
  2. カーネルバージョンとドライバ:
    • 異なるboxは異なるカーネルバージョンを使用している可能性があります。これは、特にハードウェアのサポートやシステムパフォーマンスに影響を与える可能性があります。
  3. ミドルウェアとアプリケーション:
    • 特定のboxでは、データベース、Webサーバー、その他のミドルウェアやアプリケーションが予め構成されており、即座に使用可能な状態になっていることがあります。
  4. カスタマイズと最適化:
    • boxの提供者によっては、特定のユースケースに合わせてシステムが最適化されていることがあります。これには、セキュリティ強化、パフォーマンスチューニング、特定のツールのインストールなどが含まれる場合があります。
  5. VirtualBoxや他のプロバイダーの拡張機能:
    • 一部のboxはVirtualBoxや他のハイパーバイザーの特定の拡張機能(例えば、Guest Additions)を利用するように設定されている場合があります。
  6. デフォルトユーザー設定とセキュリティポリシー:
    • boxによっては、デフォルトのユーザーアカウント、パスワードポリシー、SSHアクセス設定などが異なる場合があります。
  7. 更新状況:
    • 一部のboxは定期的に更新されていますが、他のboxは更新されていない可能性があります。これにより、セキュリティパッチ、バグ修正、新機能などに関して違いが生じることがあります。

これらの違いを理解することは、適切なVagrant boxを選択し、予期せぬ問題を避けるために重要です。特定のプロジェクトやニーズに合わせて最適なboxを選ぶ際には、boxの説明、提供者の情報、更新履歴などを確認すると良いです。

よって、サウンドを認識していない時もあります。その時は、VirtualBoxの設定を変更して、仮想マシンにオーディオサポートを追加する必要があります。これは、Vagrantfileを編集して行います。仮想マシンから出ます。出る時はexitです。

Vagrantfileに以下の設定を追加します。これはVirtulBoxのGUI版で音出しに成功した時のオーディオの状態と同じにしています。

Vagrant.configure("2") do |config|
  # ... 他の設定 ...

  config.vm.provider "virtualbox" do |vb|
    # ... 他のVirtualBox設定 ...

    # オーディオを有効にする
    vb.customize ["modifyvm", :id, "--audio", "alsa", "--audiocontroller", "ac97", "--audioout", "on"]
  end
end

ここで"alsa"の部分を使用するホストOSに適したオーディオドライバー(例:"alsa", "oss", "pulse")に変更してください。VirtualBoxの--audioオプションでは、ホストオペレーティングシステムに合わせて異なるオーディオドライバを指定することができます。使用可能なオーディオドライバは、ホストシステムの種類によって異なります。一般的なオプションは以下の通りです。

  • Windows:
    • --audio dsound:DirectSoundを使用します。Windowsの標準的なオーディオシステムです。
    • --audio winmm:Windows Multimedia APIを使用します。
  • Linux:
    • --audio alsa:Advanced Linux Sound Architecture (ALSA) を使用します。Linuxで最も一般的に使用されるオーディオシステムです。
    • --audio pulse:PulseAudioを使用します。一部のLinuxディストリビューションで標準のオーディオシステムです。
  • macOS:
    • --audio coreaudio:Core Audioを使用します。macOSの標準的なオーディオシステムです。

この設定は、VirtualBoxの仮想マシンでオーディオ出力を有効にし、オーディオコントローラとしてAC97を使用するように指定します。先と同様にしてvagrant reload コマンドで再起動します。

以下のツールをインストールして音源を確認します。デフォルトではインストールされていませんでした。

sudo apt install alsa-utils

alsa-utils のインストール

alsa-utils パッケージをインストールするには、以下のコマンドを実行します。

sudo apt install alsa-utils

このコマンドは、alsa-utils パッケージとその依存関係をインストールします。

オーディオデバイスの確認

インストール後、aplay -l コマンドを使用して、システムに接続されているオーディオデバイスのリストを表示できます。このコマンドは、利用可能なサウンドカードとデジタルオーディオデバイスの詳細を提供します。

aplay -l

このコマンドの出力には、各オーディオデバイスのカード番号、デバイス番号、デバイス名、サブデバイスの情報などが含まれます。これは、オーディオ設定を行う際やトラブルシューティングを行う際に有用な情報です。alsa-utilsパッケージには、ALSA(Advanced Linux Sound Architecture)システムを管理するためのいくつかの便利なコマンドラインツールが含まれています。これらのツールを使って、オーディオデバイスの設定、テスト、トラブルシューティングを行うことができます。以下はその中の主なコマンドです。

  1. alsamixer:
    • インタラクティブなテキストベースのミキサーです。
    • オーディオカードのボリュームレベルを調整したり、ミュートを解除したりするために使用されます。
  2. amixer:
    • コマンドラインからALSAミキサーの設定を調整するために使用されます。
    • スクリプトやシェルコマンドでのオーディオ設定に便利です。
  3. aplay:
    • WAVなどのオーディオファイルを再生するためのコマンドです。
    • オーディオ出力が正しく機能しているかをテストするためによく使用されます。
  4. arecord:
    • オーディオ入力デバイスからサウンドを録音するためのコマンドです。
    • WAVフォーマットで録音ファイルを作成することができます。
  5. alsactl:
    • ALSAカードの設定を保存したり、復元したりするためのコマンドです。
    • システムの再起動時にオーディオ設定を維持するのに役立ちます。
  6. speaker-test:
    • スピーカーとチャンネルのテストに使用されるコマンドです。
    • 左右のスピーカーやマルチチャンネルのオーディオ設定をテストする際に便利です。

これらのコマンドは、オーディオ設定の微調整、問題の診断、オーディオテストなど、様々なシナリオで役立ちます。特に、alsamixerはオーディオレベルの調整やミュート設定の解除に非常に便利なツールです。Ubuntuなどの多くのLinuxディストリビューションでは、aplay というコマンドは alsa-utils パッケージに含まれています。aplay は ALSA(Advanced Linux Sound Architecture)システムの一部で、オーディオデバイスの情報を表示したり、コマンドラインからオーディオファイルを再生するために使用されます。

ここで次の問題が起こった時の対処法は?alsamixerコマンドでも同様です。

vagrant@ubuntu2204:~$ aplay -l
aplay: device_list:274: no soundcards found…

vagrant@ubuntu2204:~$ sudo aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: I82801AAICH [Intel 82801AA-ICH], device 0: Intel ICH [Intel 82801AA-ICH]
Subdevices: 1/1
Subdevice #0: subdevice #0

aplayコマンドを使用すると、通常ユーザーではサウンドカードが見つからないが、sudo を使用するとサウンドカードが認識されていることを示しています。これは、オーディオデバイスへのアクセス権限に問題がある可能性を示唆しています。通常のユーザーがオーディオデバイスにアクセスするために必要な権限を持っていないことを示しています。ユーザーがaudioグループのメンバーでない場合によく発生します。

Linuxでは、特定のハードウェアデバイスへのアクセスは特定のグループによって制御されています。オーディオデバイスへのアクセスは通常、audioグループに割り当てられています。ユーザーがこのグループのメンバーでない場合、通常の権限ではオーディオデバイスにアクセスできませんが、sudo(スーパーユーザー権限)を使用するとアクセスできます。

この問題を解決するには、ユーザーをaudioグループに追加する必要があります。以下のコマンドを使用して、ユーザーをaudioグループに追加できます。

sudo usermod -a -G audio username

このコマンドを実行した後、変更を有効にするためにシステムを再起動するか、またはユーザーがログアウトして再度ログインする必要があります。その後、通常のユーザー権限でaplayコマンドを使用してオーディオデバイスにアクセスできるようになるはずです。システム上の全グループのリストを表示します。audioが存在することを確認後、vagrantユーザーをaudioグループに追加しています。

getent group
sudo usermod -a -G audio vagrant

実際にaplay -lコマンドを入力すると以下のようになりました。

vagrant@ubuntu2204:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: I82801AAICH [Intel 82801AA-ICH], device 0: Intel ICH [Intel 82801AA-ICH]

lspciでもデバイスは見つかりました。

vagrant@ubuntu2204:~$ lspci
00:00.0 Host bridge: Intel Corporation 440FX – 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC’97 Audio Controller (rev 01)
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02)


次はmpdをインストールします。

MPDの概要:

  1. サーバー/クライアントモデル: MPDはサーバーとして動作し、音楽の再生、管理、プレイリストの操作を行います。一方で、ユーザーはクライアントアプリケーションを使用してサーバーと通信し、曲の選択、音量の調整、再生の制御などを行います。
  2. 多様なクライアント対応: MPDは、テキストベースのインターフェースから、グラフィカルなインターフェース、ウェブベースのインターフェースまで、さまざまなタイプのクライアントアプリケーションをサポートしています。
  3. ネットワーク機能: MPDを使用すると、ローカルネットワーク内またはインターネット経由でリモートから音楽をコントロールすることができます。これにより、例えば家庭内の異なる部屋で同じ音楽を同時に再生するといったことが可能になります。
  4. 多様な音楽フォーマットのサポート: MPDは、MP3、FLAC、OGG、WAVなど、多くの音楽フォーマットをサポートしています。
  5. プレイリストとデータベース管理: ユーザーはプレイリストを作成し、音楽ライブラリを管理することができます。MPDは音楽ファイルのデータベースを維持し、効率的な検索とアクセスを可能にします。

apt updateapt install mpd は、Debian系Linuxディストリビューション(Ubuntuなどを含む)で使用されるコマンドです。これらのコマンドは、システムのパッケージリストを更新し(apt update)、その後 mpd(Music Player Daemon)をインストールする(apt install mpd)ために使用されます。

sudo apt update
sudo apt install mpd

ここでの各コマンドの役割は以下の通りです。

  1. apt update: このコマンドは、システムのパッケージリストを更新します。これにより、利用可能なパッケージとその最新バージョンの情報が、リポジトリからシステムにダウンロードされます。パッケージをインストールまたはアップグレードする前にこのコマンドを実行することが一般的です。
  2. apt install mpd: このコマンドは、mpd(Music Player Daemon)をシステムにインストールします。mpdは音楽再生のためのサーバー型アプリケーションで、ネットワーク経由で音楽を再生・制御するために使用されます。

mpdの状態を確認すると、インストール直後は停止しています。

sudo systemctl status mpd

起動して、自動起動の設定も行います。

sudo systemctl start mpd
sudo systemctl enable mpd
  1. systemctl start mpd: このコマンドは、mpd サービスを直ちに起動します。インストール直後には、mpd は自動的には起動しないので、このコマンドで手動で起動する必要があります。
  2. systemctl enable mpd: このコマンドは、mpd サービスを「有効化」します。つまり、システム起動時に自動的にmpdが起動するように設定します。これは一度だけ実行すれば、以降のシステム起動時には自動的にmpdが起動するようになります。

mpd(Music Player Daemon)の設定を行う際には、mpd.conf ファイルを編集して、このオーディオデバイスを使用するように指定する必要があります。

sudo vi /etc/mpd.conf

aplay -l の出力に基づいて、mpd.conf のオーディオ出力セクションを設定します。以下は、一般的な設定の例です。

audio_output {
    type        "alsa"
    name        "Intel 82801AA-ICH"
    device      "hw:0,0"    # カード0, デバイス0
    mixer_type  "software"  # ソフトウェアミキサーを使用
}

ここでの重要な点は、device パラメータです。これは、aplay -l の出力に基づいて設定します。例では hw:0,0 としていますが、これは最初のサウンドカードの最初のデバイスを指します。これは、aplay -l の出力で表示される card 0:device 0: に対応しています。

その他のパラメータは、お使いの環境や好みに応じて調整してください。例えば、format はオーディオのサンプリングレート、ビット深度、チャンネル数を設定します。mixer_typemixer_devicemixer_control は、音量調整に関する設定です。

設定を行った後、mpd を再起動する必要があります。これは通常、以下のコマンドで行います(システムによって異なる場合があります)。

sudo systemctl restart mpd

次は、音楽ファイルを仮想マシンであるubuntuに配置しなければなりません。しかし、Vagrantを使用している場合、VirtualBoxの仮想マシンにファイルを転送する方法はいくつかありますが、Vagrantには直接的な「ファイル転送」コマンドはありません。代わりに、以下の方法を利用できます。

1. 同期フォルダを使用する

Vagrantは、ホストマシンとゲストマシン(仮想マシン)間でフォルダを同期する機能を提供します。これは、Vagrantfileに設定を記述することで行えます。

例えば、ホストマシンの特定のフォルダを仮想マシン内の特定のパスに同期させるには、Vagrantfileに以下のような行を追加します。

config.vm.synced_folder "ホスト上のパス", "/ゲスト上のパス"

この設定により、ホストマシン上の指定したフォルダが仮想マシン内の指定したパスと同期されます。

2. SCP(Secure Copy)を使用する

Vagrantには直接的なファイル転送コマンドはありませんが、SSHを使用して仮想マシンに接続しているため、SCP(Secure Copy Protocol)を使用してファイルを転送することができます。

例えば、ホストマシンから仮想マシンにファイルを転送するには、以下のコマンドを使用します。

scp -P [ポート番号] [転送するファイルのパス] vagrant@[仮想マシンのIPアドレス]:[転送先のパス]

ここで、[ポート番号]はVagrantが使用するSSHポート(通常は2222)、[仮想マシンのIPアドレス]は仮想マシンのIPアドレス(デフォルトでは127.0.0.1)です。VagrantのデフォルトSSHキーを使用する場合、-iオプションで指定する必要があります。

3. VagrantのSSH機能を使用する

Vagrantにはvagrant sshコマンドがあり、これを使用して仮想マシンにSSH接続できます。接続後、通常のLinuxコマンドを使用してファイルを操作できます。接続後、scp、rsync、または sftp を使用してファイルを転送します。実際に、rsyncをクラウドサービスのインスタンス同士でファイルの転送するのに使用しています。

例えば、ホストマシンの特定のフォルダを仮想マシン内の特定のパスに同期させたい場合、Vagrantfileに以下のような行を追加します。

Vagrant.configure("2") do |config|
  # 他の設定...

  config.vm.synced_folder "ホスト上のパス", "/ゲスト上のパス"

  config.vm.provider "virtualbox" do |vb|
    # ... 他のVirtualBox設定 ...

  # 他の設定...
end

今は、ローカル環境なので、同期フォルダの設定がお勧めです。以下は、実際に入力したコマンドです。仮想マシンの再起動は必要です。

config.vm.synced_folder "/home/mamu/music", "/var/lib/mpd/music"

ホストマシンの /home/mamu/music ディレクトリがゲストマシン上の /var/lib/mpd/music ディレクトリと同期されます。

ホストマシン上でのファイルの変更がリアルタイムでゲストマシンに反映され、その逆も同様です。ただし、いくつか留意点があります。

  1. パーミッションと所有権: ファイルのパーミッションや所有権がホストとゲストで異なる場合、問題が発生する可能性があります。特に、サービスが特定のユーザー権限で動作している場合は注意が必要です。
  2. ファイルシステムの違い: ホストとゲストで異なるファイルシステムを使用している場合、互換性の問題が生じることがあります。
  3. パフォーマンス: 特に大量のファイルを扱う場合、同期フォルダはパフォーマンスに影響を与える可能性があります。

適切に設定されれば、この機能は非常に便利であり、ソフトウェア開発やテスト環境の構築において重要な役割を果たします。

メモ:
Vagrantfileで同期フォルダを設定する場合、config.vm.synced_folder 行を追加するだけで十分です。この設定は、config.vm.provider "virtualbox" ブロックの外に記述する必要があります。これは、同期フォルダの設定が特定のプロバイダ(この場合はVirtualBox)に依存しないためです。

次に、ホストと仮想マシンの通信について考えます。仮想マシンにSSH経由で接続すると以下のようなメッセージが表示されると思います。ここでホストの実際のIPアドレスは192.168.0.139です。

root@g570:~/ub22# vagrant ssh
Last login: Thu Dec 14 03:23:59 2023 from 10.0.2.2
vagrant@ubuntu2204:~$

VagrantによるSSH接続時に表示される「Last login: [日付] from 10.0.2.2」というメッセージは、SSH接続を行ったクライアント(この場合はホストマシン)のIPアドレスを示しています。しかし、ここで表示されるIPアドレスが実際のホストマシンのIPアドレス(このケースでは192.168.0.139)と異なる理由について説明します。

  1. NATネットワーキング:
    • VagrantはデフォルトでNAT(Network Address Translation)ネットワークモードを使用しています。このモードでは、仮想マシンはプライベートな内部ネットワーク(この場合は10.0.2.xの範囲)に配置され、ホストマシンはNATデバイスとして機能します。
    • このため、仮想マシンから見ると、SSH接続はホストマシンのNATインターフェース(10.0.2.2)から来ているように見えます。これは、実際のホストマシンのIPアドレス(192.168.0.139)とは異なります。
  2. 仮想ネットワークインターフェース:
    • 10.0.2.2はVirtualBox(または他の仮想化ソフトウェア)によって作成された仮想ネットワークインターフェースのIPアドレスです。これは、仮想マシン内部から見たホストマシンのIPアドレスを表しています。
  3. 実際のネットワークとの関係:
    • ホストマシンの実際のIPアドレス(192.168.0.139)は、物理ネットワークに対してのものです。しかし、Vagrantの仮想マシン内部からは、NATを介して接続されているため、異なるIPアドレスが表示されます。

要するに、10.0.2.2のIPアドレスは、NATモードにおけるホストマシンの内部IPアドレスであり、ホストマシンの外部ネットワーク上のIPアドレス(192.168.0.139)とは異なります。これは仮想マシンとホストマシン間の通信を管理するための仮想的なアドレスです。

実際に、Vagrantを使用している際に、ホストとゲスト(仮想マシン)間でポートフォワーディングを設定するには、Vagrantfile に特定の設定を追加します。この場合、ゲストのポート6600をホストのポート6600にフォワードする設定を追加します。MPDがポート6600を使用するためです。

以下はそのための Vagrantfile の設定例です。

Vagrant.configure("2") do |config|
  # 他の設定...

  # ポートフォワーディングの設定
  # ゲストのポート6600をホストのポート6600にフォワード
  config.vm.network "forwarded_port", guest: 6600, host: 6600

  # 他の設定...
end

この設定を Vagrantfile に追加した後、仮想マシンの再起動が必要です(vagrant reload)。これで、ホストマシンのポート6600を通じてゲストマシンのポート6600にアクセスできるようになります。

Vagrantでポートフォワーディングを設定すると、仮想マシン(ゲスト)から見た場合、ホストマシンからの通信は特定の内部IPアドレス(通常は10.0.2.2)から来ているように見えます。これはVagrantがVirtualBox(または他の仮想化ソフトウェア)のNATネットワークモードを使用しているためです。

NAT(Network Address Translation)モードでは、仮想マシンはホストマシンから隔離されたネットワーク内にあります。この隔離されたネットワーク内で、ホストマシンは仮想マシンに対して特定のIPアドレス(10.0.2.2)を持つゲートウェイとして機能します。

その結果、仮想マシンから見て、ホストマシンの実際のIPアドレス(この場合は192.168.0.139)ではなく、10.0.2.2から通信が来ているように認識されます。ポートフォワーディングを使用すると、ホストの特定のポート(この例では6600)への通信が仮想マシンの同じポートに自動的に転送されますが、この通信のソースIPアドレスは10.0.2.2として認識されます。まとめると以下のようになります。

  1. ホストマシン:
    • IPアドレス: 192.168.0.139
    • ネットワークインターフェース: 物理的なネットワークアダプタ
  2. Vagrant仮想マシン:
    • NATインターフェース:
      • IPアドレス: 10.0.2.15
      • 接続: ホストマシン(NATを介して)
      • 特徴: ホストマシンからのポートフォワーディングによりアクセス可能
    • ブリッジインターフェース:
      • IPアドレス: ホストマシンと同じセグメント(例: 192.168.0.x)
      • 接続: ホストマシンと同じ物理ネットワーク
  3. ポートフォワーディング:
    • ホストマシンのポート6600はVagrant仮想マシンのポート6600に転送
  4. 外部ネットワークへの接続:
    • ホストマシンとVagrant仮想マシンはインターネットなどの外部ネットワークに接続可能
[ホストマシン]
IP: 192.168.0.139
   |
   |--- [NATインターフェース (Vagrant VM)]
   |    IP: 10.0.2.15
   |    ポートフォワーディング: 6600 -> 6600
   |
   |--- [ブリッジインターフェース (Vagrant VM)]
        IP: 192.168.0.x (ホストと同じセグメント)

以上の理由で仮想マシンの音楽サーバーであるmpdに、仮想マシン以外からアクセスするためには次のことを考慮します。

仮想マシン上で動作しているソフトウェア(この場合はMPD)が localhost(つまり、127.0.0.1)にのみバインドされている場合、そのサービスは仮想マシンの外部からは直接アクセスできません。これは localhost がローカルホスト(同じマシン内)からの接続のみを許可するためです。

外部(この場合はホストマシンや他のネットワーク内のマシン)からの接続を許可するには、ソフトウェアを仮想マシンの実際のネットワークインターフェースにバインドする必要があります。これは通常、特定のIPアドレスを指定するか、すべてのインターフェースを表す 0.0.0.0 にバインドすることで実現できます。

たとえば、Webサーバーである場合でも、その設定ファイルで Listen 127.0.0.1:80 となっているのを Listen 0.0.0.0:80 に変更すると、そのサーバーは仮想マシンのすべてのネットワークインターフェースを通じてアクセス可能になります。

実際に行った作業は、仮想マシン内で設定ファイルを開き、bind_to_addressをlocalhostから変更します。再起動も必要です(sudo systemctl restart mpd)。

sudo vi /etc/mpd.conf

変更内容
localhost→0.0.0.0

この変更はセキュリティの観点から慎重に行うべきです。0.0.0.0 にバインドすると、サービスがネットワーク上のどのマシンからもアクセス可能になりますので、適切なファイアウォールの設定や認証メカニズムの確保が重要になります。

これで、ホストや他のパソコンからクライアントを使用して、mpdに接続できるはずです。再生クライアントをホストにてインストールします。

sudo apt install ncmpcpp

忘れないうちに、ファイアウォールが有効になっている場合、ポート6600のトラフィックを許可しておきます。

sudo ufw allow 6600/tcp

音楽ファイルの用意もできているので、ホストでクライアントを起動して再生してみます。

ncmpcpp -h 192.168.0.139
IPアドレスを省略するとlocalhostに接続するので以下でもOK
ncmpcpp

正常に再生されますが、ホスト自体にSSH接続しているので、音が鳴るのはリモートPCです。SSH接続しているPCで音が鳴るわけではありません。ここまでが、ホストで音出しに成功する事例でした。サーバーで音が鳴るので、クライアントがリモコンのようなものです。今度はリモートしているPCでも音が出るようにします。PulseAudioを使用しますが、今は下記のような状況です。

2023年時点で、多くのLinuxディストリビューションはPulseAudioからPipeWireへの移行を進めています。PipeWireは、オーディオとビデオの処理を統合することを目的とした新しいマルチメディアフレームワークです。PulseAudioやJACK(Jack Audio Connection Kit)の代替として設計されており、低レイテンシのオーディオ処理やプロフェッショナルなオーディオニーズにも対応しています。

PipeWireの主な特徴

  1. 低レイテンシ: プロフェッショナルなオーディオワークフローに適した低レイテンシのオーディオ処理を提供します。
  2. ネットワーク透過性: PipeWireはネットワーク透過性を持ち、オーディオとビデオのストリーミングをネットワーク越しに行うことができます。
  3. セキュリティとサンドボックス対応: Flatpakや他のサンドボックス環境との互換性を持ち、セキュリティを強化しています。
  4. PulseAudioとJACKの互換性: PulseAudioやJACKのAPIをエミュレートすることで、既存のアプリケーションとの互換性を保持しています。

MPDとPipeWire

MPD(Music Player Daemon)をPipeWireと共に使用する場合、MPDの設定をPipeWireに対応させる必要があります。PipeWireはPulseAudioのAPIをエミュレートするため、多くの場合、PulseAudio用に設定されたMPDはそのままPipeWireと互換性を持ちます。ただし、最適なパフォーマンスと互換性を得るためには、MPDの設定を見直し、必要に応じて調整することが推奨されます。

注意点

  • 移行中の状況: 2023年時点では、多くのシステムがPulseAudioからPipeWireへ移行中です。この移行は段階的に行われるため、特定のディストリビューションや環境によっては、まだPulseAudioがデフォルトのオーディオサーバーである場合があります。
  • 設定の変更: PipeWireへの移行に伴い、オーディオ関連の設定やトラブルシューティング方法が変わる可能性があります。特に、カスタムオーディオ設定や高度なオーディオ処理を行っている場合は、PipeWireのドキュメントやコミュニティのサポートを参照することが重要です。

PipeWireは、オーディオとビデオの処理を一元化し、Linuxのマルチメディアエコシステムを強化するための重要なステップです。そのため、今後のLinuxベースのオーディオ/ビデオアプリケーションやサービスにおいて、中心的な役割を果たすことが期待されています。

以上のように、PipeWireに流れが変わっているようですが、PulseAudioをインストールして設定します。PulseAudioはユーザー単位で設定され、以下のような特徴があります。

PulseAudioをrootユーザーで使用することは推奨されていません。というか、rootではコマンドを制限されました。理由はいくつかあります。

  1. セキュリティのリスク: rootユーザーとしてアプリケーションを実行すると、そのアプリケーションにシステム全体への完全なアクセス権が与えられます。これは、アプリケーションに脆弱性がある場合、システム全体が危険にさらされる可能性があることを意味します。
  2. 権限の問題: PulseAudioはユーザー単位で設定され、動作します。rootとして実行すると、ユーザー固有の設定や環境に適切に統合されない可能性があります。
  3. 互換性の問題: 一部のプログラムやシステムコンポーネントは、rootではないユーザーとして実行されることを想定して設計されています。rootでPulseAudioを実行すると、これらのコンポーネントとの互換性の問題が生じる可能性があります。

一般的に、Linuxシステムでアプリケーションをroot権限で実行することは、必要な場合を除き避けるべきです。これは、セキュリティとシステムの安定性を維持するための重要な原則です。PulseAudioの件で一般ユーザーでコマンドを入力するためです。また、仮想環境内でもPulseAudioをインストールします。

PulseAudioは、Linuxオペレーティングシステム用の便利なサウンドサーバーです。サウンドサーバーとは、様々なオーディオアプリケーションからのサウンドストリームを受け取り、それらを管理し、適切なオーディオデバイス(スピーカー、ヘッドフォンなど)に出力するソフトウェアのことを指します。

PulseAudioの主な特徴は以下の通りです。

  1. ネットワーク透過性:ローカルだけでなく、ネットワーク経由でのオーディオストリームの送受信が可能です。
  2. デバイス管理:多数のオーディオデバイスを同時に管理でき、ユーザーは簡単に出力デバイスを切り替えたり、音量を調整したりできます。
  3. ミキシングとストリームの管理:複数のアプリケーションからのオーディオストリームを同時に扱い、それぞれのアプリケーションごとに音量を個別に調整できます。
  4. 高度な機能:イコライザーや音声エフェクトなど、様々な高度なオーディオ処理機能を提供します。
  5. 拡張性と柔軟性:プラグインやモジュールを通じて機能を拡張でき、さまざまなオーディオ環境に柔軟に対応します。

ホストで実際に入力したコマンド。

sudo apt install alsa-utils pulseaudio

仮想環境内でも同様にインストールしておきます。仮想環境内では先ほど、alsa-utilsはインストールしたので、PulseAudioをインストールします。PulseAudioの状態を確認するコマンドは、ユーザー単位で設定され、動作することから、下記になります。

systemctl --user status pulseaudio

しかし、何かがおかしいみたいです。

mamu@g570:~/ub22$ systemctl –user status pulseaudio
Warning: The unit file, source configuration file or drop-ins of pulseaudio.ser>
○ pulseaudio.service
Loaded: masked (Reason: Unit pulseaudio.service is masked.)
Active: inactive (dead)

pulseaudio -kやpulseaudio –startでサービスを停止したり起動したりしましたが、うまくいかないのでパソコンを再起動するとなおりました。再起動後は、仮想マシンも立ち上げます。

mamu@g570:~$ systemctl –user status pulseaudio
● pulseaudio.service – Sound Service
Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor >
Active: active (running) since Thu 2023-12-21 20:25:13 JST; 4s ago
TriggeredBy: ● pulseaudio.socket
Main PID: 1525 (pulseaudio)
Tasks: 4 (limit: 9321)
Memory: 10.5M
CPU: 261ms
CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pulsea>
mq1525 /usr/bin/pulseaudio –daemonize=no –log-target=journal

12月 21 20:25:09 g570 systemd[1518]: Starting Sound Service…
12月 21 20:25:13 g570 systemd[1518]: Started Sound Service.

PulseAudioはubuntu22.04の場合、デスクトップには最初からインストールされているとネット上の反応でした。しかし、ubuntu22.04 Serverではインストールされていませんでした。Ubuntu 22.04 Desktop版では通常、PulseAudioがプリインストールされていますが、Ubuntu 22.04 Server版ではデフォルトでインストールされていないことがあります。これは、デスクトップ環境が一般的にオーディオ機能により大きく依存しているのに対し、サーバー環境ではそうではないためです。まずは、仮想マシン(MPDサーバー)からクライアントPCへのPulseAudio経由の音声ストリーミングを設定する際のPulseAudioの設定について説明します。

現在の設定にはいくつかのコメントアウトされたモジュール(module-esound-protocol-tcp, module-native-protocol-tcp, module-zeroconf-publish)と、有効になっている module-tunnel-sink が含まれています。

リモートしているPCで音が出るシナリオを2つ考えました。1つ目を示します。

仮想マシン(MPDサーバー)からクライアントPCへのPulseAudio経由での音声ストリーミングを設定する際のPulseAudioモジュールについての説明です。

  • module-native-protocol-tcp: このモジュールは、ネットワーク越しにPulseAudioサーバーへの接続を許可します。クライアントがリモートでサーバーに接続する必要がある場合に使用されます。ただし、MPDサーバーがクライアントPCのPulseAudioサーバーに接続するだけの場合、このモジュールは不要です。
  • module-zeroconf-publish: Zeroconf(またはBonjour)を使用してPulseAudioサーバーをネットワークに公開します。このシナリオでは、MPDサーバーがクライアントPCに直接接続するため、このモジュールも不要です。
  • module-tunnel-sink: これは、一つのPulseAudioサーバーが別のPulseAudioサーバーに接続してオーディオストリームを送信するために使用されます。このシナリオでは、MPDサーバー(仮想マシン上のPulseAudio)がクライアントPCのPulseAudioサーバーに接続するためにこのモジュールが必要です。

2つ目は以下になります。

  1. module-native-protocol-tcp: このモジュールは、TCP経由でのPulseAudio接続を許可するために使用されます。このシナリオでは、MPDサーバー(サーバー側)ではなく、クライアントPC(リモート側)にこのモジュールを有効化します。クライアントPCのPulseAudioサーバーは、このモジュールによってサーバー側からのオーディオストリームを受け取る準備ができています。サーバー側では、このモジュールは必要ないため、MPDが直接クライアントのPulseAudioサーバーに音声を転送します。
  2. module-zeroconf-publish: このモジュールは、Zeroconf(Bonjour)ネットワーキングを使用してPulseAudioサーバーをネットワーク上に公開します。このシナリオでは、直接的な接続が行われるため、このモジュールもサーバー側では不要です。
  3. module-tunnel-sink: このモジュールは、あるPulseAudioサーバーが別のPulseAudioサーバーに接続するために使用されます。しかし、このシナリオでは、MPDサーバーが直接クライアントのPulseAudioサーバーに音声を転送するため、このモジュールはサーバー側では不要です。クライアント側でPulseAudioが設定されていれば、module-tunnel-sink は必要ありません。

要するに、この設定では、MPDサーバーがクライアントのPulseAudioサーバーに直接接続し、音声を転送しているため、一般的に考えられるmodule-tunnel-sink の使用は必要ありません。代わりに、クライアント側で module-native-protocol-tcp を有効にすることによって、サーバーからの接続を受け入れ、オーディオストリーミングを実現します。

2つのシナリオを比較する。

1. module-tunnel-sink の使用:

  • シナリオ:PulseAudioクライアント(仮想マシンやサーバー)が、リモートのPulseAudioサーバー(例えばデスクトップマシン)に接続してオーディオを転送します。
  • 利点
    • 集中管理:オーディオストリームが一箇所のサーバーから管理されるため、複数のクライアントがリモートサーバーに接続できます。
    • 柔軟性:複数のクライアントが同一のリモートPulseAudioサーバーに接続して異なるオーディオストリームを送信できます。

2. MPDサーバーがクライアントPCのPulseAudioに直接接続:

  • シナリオ:MPDサーバーが直接クライアントのPulseAudioサーバーにオーディオを送信します。
  • 利点
    • 簡易性:ネットワーク越しのオーディオ転送を実現するための設定が比較的簡単です。
    • 効率性:中間サーバーを使用せずに直接オーディオを転送するため、レイテンシが少ない可能性があります。

今回は、クライアントが自分だけなので、後者を実際に設定して動作確認します。こんなイメージです。

[ホストマシン (PulseAudioサーバー)]
IP: 192.168.0.139
   |
   |--- [仮想マシン (MPDサーバー)]
        IP: 10.0.2.15
        ポートフォワーディング: 6600 -> 6600 (MPDコントロール)
        
[クライアントマシン (PulseAudioクライアント)]
IP: クライアントのIPアドレス
  1. ホストマシン:
    • PulseAudioサーバーを実行しています。
    • 仮想マシンからの音声データを受け取ります。
  2. 仮想マシン:
    • MPDサーバーを実行しており、音楽を再生します。
    • 仮想マシン内でPulseAudioが実行され、export PULSE_SERVER="tcp:ホストのIPアドレス"の設定により、MPDからの音声出力をホストマシンのPulseAudioサーバーに転送します。
    • ポート6600でMPDサーバーへの制御を受け入れるためにホストマシンからのポートフォワーディングを使用します。
  3. クライアントマシン:
    • ホストマシンのPulseAudioサーバーから音声データを受け取ります。
    • 実際の音声出力を行います。

この構成により、音声は仮想マシン上のMPDからホストマシンのPulseAudioサーバーを通じてクライアントマシンに転送され、ホストマシンはこのプロセスにおいて音声データのルーティングと中継を行います。

aplayコマンドを使用すると、下記のように、通常ユーザーではサウンドカードが見つからないが、sudo を使用するとサウンドカードが認識されていることを示しています。これは、オーディオデバイスへのアクセス権限に問題がある可能性を示唆しています。仮想環境でもこの問題は起きますが、先ほど解決しました。

mamushi@MB-T500:~$ aplay -l aplay: device_list:274: サウンドカードが見つかりません… mamushi@MB-T500:~$ sudo aplay -l [sudo] mamushi のパスワード: **** ハードウェアデバイス PLAYBACK のリスト **** カード 0: PCH [HDA Intel PCH], デバイス 0: ALC255 Analog [ALC255 Analog] サブデバイス: 1/1 サブデバイス #0: subdevice #0

この問題を解決するために以下のステップを試してみます。

  1. オーディオグループのメンバーシップ確認
    • 現在のユーザーがオーディオグループのメンバーであるかを確認してみます。これは groups コマンドで確認できます。もしオーディオグループに含まれていない場合は、ユーザーをグループに追加しておいたほうがいいかもしれません。コマンドを実行した後、変更を反映するためにはログアウトして再ログインするか、システムを再起動する必要があります。

      sudo usermod -aG audio [ユーザー名]
  2. PulseAudioの権限の確認
    • PulseAudioがユーザーレベルで正しく実行されていることを確認してください。systemctl --user status pulseaudio コマンドを実行して、サービスが正常に動作しているか確認します。
  3. PulseAudioの再起動
    • PulseAudioを再起動してみます。これには以下のコマンドを使用します。

      pulseaudio -k
      pulseaudio --start
  4. オーディオ出力の再確認
    • 再起動後、pactl list sinks コマンドを再度実行して、物理オーディオデバイスが認識されているかを確認します。
  5. ALSAモジュールのロード
    • 必要に応じて、ALSAモジュールを手動でPulseAudioにロードします。

      pactl load-module module-alsa-card

これらの手順により、ユーザーの権限とPulseAudioの設定を調整し、システムが物理オーディオデバイスを正しく認識するようにすることができます。それでも問題が解決しない場合は、システムのオーディオドライバの設定や物理的なオーディオデバイスの接続を再確認する必要があります。また、ハードウェアの問題やオーディオドライバの不具合の可能性も考慮する必要があります。

実際には、仮想環境内で以下のコマンドを入力しました。

sudo nano ~/.bashrc

記述内容
export PULSE_SERVER="tcp:ホストのIPアドレス"
例
export PULSE_SERVER="tcp:192.168.0.139"

記述内容の意味は次のようになります。

~/.bashrcファイルにexport PULSE_SERVER="tcp:ホストのIPアドレス"を追加すると、その設定はBashシェルを起動するたびに適用されます。ここでの具体的な変更点は以下の通りです。

  1. PulseAudioサーバーの指定: export PULSE_SERVER="tcp:ホストのIPアドレス"という行は、PulseAudioサウンドシステムのサーバーを指定しています。ここで「ホストのIPアドレス」は、PulseAudioサーバーが実行されているホストのIPアドレスに置き換えられます。
  2. ネットワーク経由でのサウンドストリーミング: この設定により、ローカルシステム(このコマンドを実行するシステム)は、指定されたネットワーク上のPulseAudioサーバーにサウンド出力を送信するようになります。これは、例えば、ネットワーク上の別のコンピュータにスピーカーが接続されている場合に便利です。今は、仮想マシンのPulseAudioが、仮想マシンを実行するマシンにサウンド出力を送信します。
  3. 自動化: ~/.bashrcにこの行を追加することで、シェルが起動されるたびにこの設定が自動的に適用されます。これにより、ユーザーが手動で毎回設定を行う必要がなくなります。

~/.bashrc ファイルに export PULSE_SERVER="tcp:ホストのIPアドレス" を記述することで、ゲストシステム(仮想マシン)はホストシステムのPulseAudioサーバーを音源(オーディオ出力先)として使用します。この設定により、ゲストシステムはホストシステムのオーディオデバイスを直接利用することができ、ゲストシステム自体にオーディオデバイスを設定する必要がなくなります。ですので、Vagrantfileにある音源の記述は削除してもOKです。

この方法は、特に以下のような場合に便利です。

  • ゲストシステムがオーディオハードウェアを直接サポートしていない場合。
  • ゲストシステムでオーディオ関連の作業を行うが、それをホストシステムのスピーカーやヘッドフォンから出力したい場合。
  • ゲストシステムを軽量化し、オーディオドライバや関連ソフトウェアのインストールを避けたい場合。

また、PulseAudioサーバーをネットワーク経由で使用する場合、サーバー側のファイアウォール設定でポート4713を開放する必要があります。PulseAudioはデフォルトでTCPポート4713を使用してクライアントからの接続を待ち受けるため、このポートがファイアウォールによってブロックされていると、クライアントからの接続が拒否されます。

さらに、仮想マシンのMPDの設定が必要です。

sudo nano /etc/mpd.conf

記述内容
audio_output {
    type        "pulse"
    name        "PulseAudio Output"
    server      "クライアントのIPアドレス:4713"
}

UbuntuなどのLinuxディストリビューションでufw(Uncomplicated Firewall)が使用されている場合、次のコマンドを実行してポート4713を開放することができます。

sudo ufw allow 4713/tcp

このコマンドにより、TCPプロトコルを使用するポート4713へのアクセスが許可されます。この設定をするのは、この場合、クライアントマシンです。また、クライアントマシンでPulseAudioサーバーに外部からの接続を許可したいので次の手順で設定ファイルに記述します。

sudo nano /etc/pulse/default.pa

記述内容
load-module module-native-protocol-tcp auth-ip-acl=192.168.0.0/24 auth-anonymous=1 port=4713

記述内容の意味。

  • load-module module-native-protocol-tcp: TCPプロトコルを使用してPulseAudioサーバーに接続するためのモジュールをロードします。
  • auth-ip-acl=192.168.0.0/24: IPアドレスが192.168.0.0/24のサブネット内のどのクライアントからの接続も許可します。これはホストマシンと同じローカルネットワーク上のデバイスからの接続を意味しています。
  • auth-anonymous=1: 認証を必要とせずに接続を許可します。これにより、ユーザー名やパスワードなしでも接続が可能になりますが、セキュリティが低下する可能性がありますので注意が必要です。
  • port=4713: PulseAudioサーバーがリッスンするポートを4713に指定します。これはPulseAudioのデフォルトポートです。

PulseAudioを再起動します。

pulseaudio -k
pulseaudio --start

先のようにエラーでうまくいかない時はパソコンを再起動します。このこのクライアントはubuntu desktopなので、PulseAudioはインストール済みのようでした。これでクライアントで接続して再生しても、サーバーで音が鳴らず、クライアントで鳴るはずです。クライアントマシンにncmpcppをインストールして動作確認します。

sudo apt install ncmpcpp

ホストに接続して再生します。

ncmpcpp -h 192.168.0.139

無事、接続したクライアントで音出しに成功しました。

WindowsでPulseAudioを使用するには?

Windows上でPulseAudioを使用する方法はいくつかあります。Windows版PulseAudioの直接的なインストール以外にも、以下のような方法が考えられます。

Windows Subsystem for Linux (WSL):

WSLを使用すると、Windows上でLinux環境を実行できます。
WSL内でLinux版のPulseAudioをインストールし、それを使ってオーディオ処理を行うことが可能です。
ただし、WSL経由でWindowsのオーディオハードウェアにアクセスするには追加の設定が必要になる場合があります。

仮想マシン(VirtualBox, VMwareなど):

VirtualBoxやVMwareなどの仮想マシンソフトウェアを使用して、Windows上で完全なLinuxシステムを実行することができます。
このLinuxシステム内でPulseAudioをセットアップし、必要に応じてホストOSとの間でオーディオストリーミングを行うことができます。

Dockerコンテナ:

Dockerを使用して、PulseAudioがインストールされたLinuxコンテナを作成し、実行することも可能です。
この方法では、コンテナ内で実行されるPulseAudioによってオーディオ処理が行われます。
コンテナとホストシステム間でのオーディオデータのやりとりには、追加の設定が必要です。

以下のようにPulseAudioが正常に起動していない時は?

vagrant@ubuntu2204:~$ journalctl –user -u pulseaudio -f Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: Stopped Sound Service. Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: Starting Sound Service… Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: pulseaudio.service: Main process exited, code=exited, status=1/FAILURE Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: pulseaudio.service: Failed with result 'exit-code’. Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: Failed to start Sound Service. Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: pulseaudio.service: Scheduled restart job, restart counter is at 5. Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: Stopped Sound Service. Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: pulseaudio.service: Start request repeated too quickly. Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: pulseaudio.service: Failed with result 'exit-code’. Dec 17 04:37:20 ubuntu2204.localdomain systemd[1143]: Failed to start Sound Service.

pulseaudio.service: Main process exited, code=exited, status=1/FAILURE というメッセージは、サービスが何らかのエラーで終了していることを示しています。また、pulseaudio.service: Start request repeated too quickly. は、サービスが再起動を試みていますが、連続して失敗していることを示しています。

この状況を解決するための行ったこと。

  1. PulseAudioの設定リセット
    • PulseAudioのユーザー設定ファイルをリセットすることで問題が解決することがあります。これを行うには、以下のコマンドを実行します。もしくは削除する。

      mv ~/.config/pulse ~/.config/pulse_backup
    • これにより、古い設定ファイルがバックアップされ、新しい設定でPulseAudioが再起動されます。
  2. PulseAudioの手動起動
    • pulseaudio -k コマンドを使用して、現在のPulseAudioセッションを終了します。
    • その後、pulseaudio --start コマンドでPulseAudioを手動で再起動します。
  3. サービスの状態確認
    • 再起動後、systemctl --user status pulseaudio コマンドを使用して、PulseAudioサービスの状態を確認します。
  4. エラーメッセージの確認
    • 再び journalctl --user -u pulseaudio -f を実行して、新しいエラーメッセージが表示されていないか確認します。
  5. 依存関係の確認
    • PulseAudioに必要な依存関係がすべてインストールされているかを確認します。不足しているものがあれば、インストールします。

これらの手順により、PulseAudioの問題が解決する可能性があります。PulseAudioはユーザーレベルで実行されるため、sudo を使用せずにコマンドを実行する必要があります。

教育

Posted by admin