カテゴリー別アーカイブ: Ubuntu

MPD (Music Protocol Daemon)のインストール

MPDをUbuntuマシンにインストールして、Bluetoothスピーカーで聴く設定方法です。

rtmpdumpで録音した番組を聴く方法を色々試してみましたが、MPDはファイルの同期など必要なく録画したテレビ番組を見るようにただリモンの再生ボタンを押すだけという手軽さが気に入りました。

ここではMPDのインストール方法と、ちょっとハマったBluetoothスピーカで聴くための設定方法を書きます。

MPDとは

MPD (Music Protocol Daemon)は、コンピュータに貯めてある音楽ファイルを再生させるためのプログラムです。

コンピュータに貯めた音楽ファイルを再生する方法は次の3パターンがあります。

  • 手元のスマホやパソコンにコピー(同期)して再生する。
  • 音楽ファイルを配信して手元で再生する。
  • 音楽ファイルを貯めているコンピュータで直接再生する。

MPDは、最後の音楽ファイルを貯めているコンピュータで再生するためのプログラムです。そのため基本的にそのコンピュータに接続されたスピーカーからしか音を出せません1。移動しながら聴くというよりは、家や職場など決まった場所で聴くのに向いています。逆に言うと移動しないためデジタル信号を音に変換するDACやスピーカーの大きさに制限がなく音に凝ることが可能です。

MPDのインストール

今回のパソコン環境は、次のようにUbuntu 16.10(デスクトップ版)です。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.10
Release:	16.10
Codename:	yakkety

MPDに必要なプログラムは全てパッケージ化されているので、インストールに難しい所は全くありません。

$ sudo apt install mpd avahi-daemon

avahi-daemonは、zeroconfのために必要です。zeroconfを使用しない場合は、インストールする必要はありません。

MPDの設定

MPDの設定ファイルは、/etc/mpd.confです。このファイルを編集して自分の環境に合わせます。

私は次のようにして、Musicフォルダをパスワード無しで直接公開し、内蔵スピーカとBluetoothスピーカーで聞けるようにしました。またZeroconfを有効にしているので、MPDが動いているコンピュータはDHCPで動的にIPアドレスが割り振られていても問題ありません。

# MPDが音楽ファイルを探すディレクトリー設定
music_directory		"/home/user/Music"

playlist_directory	"/var/lib/mpd/playlists"
db_file			"/var/lib/mpd/tag_cache"
log_file		"/var/log/mpd/mpd.log"
pid_file		"/run/mpd/pid"
state_file		"/var/lib/mpd/state"
sticker_file            "/var/lib/mpd/sticker.sql"

user			"mpd"

# MPDがlistenするアドレス。anyだと全てのインターフェイスでlistenする。
bind_to_address		"any"

# 音楽ファイルが追加や削除されると自動的にMPDに反映されるようにする。
auto_update    		"yes"

# Zeroconfを有効にする。
zeroconf_enabled	"yes"
zeroconf_name		"Music Player T400"

input {
        plugin "curl"
}

# 内蔵スピーカ
audio_output {
	type		"alsa"
	name		"Internal Speaker"
	mixer_type      "disable"
}

# USB接続のスピーカ
# deviceは、aplay -lコマンドを使って調べる。
audio_output {                                                                  
        type            "alsa"                                                  
        name            "USB Speaker"                                           
        device          "hw:1,0"
}

# sinkの値は、pactlコマンドを使って調べます。
# http://aki.sunnyday.jp/blog/?p=1310
# この設定については後で詳しく説明します。
# PluseAudioの設定を修正しないとBluetoothスピーカからは音が出ません。
audio_output {
	type		"pulse"
	name		"Bluetooth Speaker"
	server		"localhost"
	sink		"bluez_sink.00_1A_7D_E2_36_7B"
}

# ncmpcppでビジュアライゼーションを有効にしたい時だけ。
# https://wiki.archlinuxjp.org/index.php/Ncmpcpp                                
#audio_output {                                                                 
#    type                    "fifo"                                             
#    name                    "my_fifo"                                          
#    path                    "/tmp/mpd.fifo"                                    
#    format                  "44100:16:2"                                       
#}                                                                              

filesystem_charset	"UTF-8"
id3v1_encoding		"UTF-8"

MPDの設定はこれだけです。

設定がすんだら再起動して設定を反映させます。

$ sudo systemctl restart mpd.service
$ sudo systemctl status mpd.service
● mpd.service - Music Player Daemon
   Loaded: loaded (/lib/systemd/system/mpd.service; enabled; vendor preset: enab
   Active: active (running) since 木 2017-02-23 09:23:34 JST; 8s ago
     Docs: man:mpd(1)
           man:mpd.conf(5)
           file:///usr/share/doc/mpd/user-manual.html
 Main PID: 32426 (mpd)
    Tasks: 6 (limit: 4915)
   CGroup: /system.slice/mpd.service
           └─32426 /usr/bin/mpd --no-daemon

 2月 23 09:23:34 T400 systemd[1]: Started Music Player Daemon.
 2月 23 09:23:35 T400 mpd[32426]: Feb 23 09:23 : server_socket: bind to '0.0.0.0

MPDのテストと音楽ファイルを再生

Zeroconfの確認

まず初めにzeroconfiが有効になっているか確認します。私はAndroidのZeroConf Browserを使用しました。

MPDが見つからない時は、avahiが動いているかとMPDの設定でzeroconfを有効にしているか確認します。avahiが動いているかは、netstatコマンドを使用します。

$ netstat -ln46|grep 5353
udp        0      0 0.0.0.0:5353            0.0.0.0:*
udp        0      0 0.0.0.0:5353            0.0.0.0:*
udp6       0      0 :::5353                 :::*

zeroconfでMPDを見つけるには、avahi-utilsパッケージに含まれるavahi-browseコマンドも使用できます。ただしこのコマンドは、コマンドを実行したコンピュータ上のサービスを表示しません。

$ avahi-browse -t -all
+ enp0s25 IPv6 Music Player on RERUN                         Music Player Daemon  local
+ enp0s25 IPv4 Music Player on RERUN                         Music Player Daemon  local

systemdでの問題

Ubuntuなどsystemdを使用しているマシンでは、次のようなログを残してZeroconfでMPDを見つけられないことがあります。

/var/log/mpd/mpd.log

zeroconf: No global port, disabling zeroconf

この場合は、Creating a home music server using mpdにあるようにmpd.socketを停止します。

sudo systemctl stop mpd.service
sudo systemctl stop mpd.socket
sudo systemctl disable mpd.socket
sudo systemctl start mpd.service

これでZeroconfでMPDを見つけられるようになります。

MPDで音楽を再生

MPDは音楽を再生するサーバなので、クライアントプログラムが必要です。

クライアントプログラムには、次のように色々な種類があります。

CUI
mpc, ncmpc, ncmpcppなど。mcpは純粋にコマンドラインで使用するプログラムなのでシェルプログラムと組み合わせて使用するのに都合が良いです。ncmpcとncmpcppは、ncursesを使用するので、CUIと言ってもGUIのような感じで使用できます。ncmpcとncmpcppの使い方はほとんど同じなので、使い方はNcmpcppを参照して下さい。
GUI
sonata, arioなど。sonataは、初期設定ではアルバム名が表示されませんが、設定で変更できます。それでもarioの方が私は好みでした。
Android
MPDroid, plainMPDCなど。MPDroidが人気みたいですが、私はplainMPDCが気に入りました。ただplainMPDCは結構頻繁にMPDと接続できなることが欠点です。

Bluetoothスピーカ

MPDの音声をBluetoothスピーカに送る設定の部分は合っているはずですが、Bluetoothスピーカから音が出ない、または再生できないといういうエラーになります。ここでだいぶ悩みました。

mpd.confからBluetoothに関わる部分を抜き出すと次のようになっています。

audio_output {
	type		"pulse"
	name		"Bluetooth Speaker"
	server		"localhost"
	sink		"bluez_sink.00_1A_7D_E2_36_7B"
	# sink            "bluez_sink.00_1A_7D_E2_36_7B.a2dp_sink" # On Ubuntu 17.04
}

鍵となるのは、serverとsinkの設定です。serverはPulseAudioの動いているホスト名で、sinkは音声の送り先です。

sinkの値が間違っているのかと思いpactlコマンドを使って調べましたが、間違っていません。

$ sudo pactl list|grep Sink
Sink #0
Sink #37
	Monitor of Sink: alsa_output.pci-0000_00_1b.0.analog-stereo
	Monitor of Sink: n/a
	Monitor of Sink: bluez_sink.00_1A_7D_E2_36_7B
		a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)

そしてはたとひらめきました。

PulseAudioの設定にserverを指定するということはネットワークに関する設定が絡んでいるのでないかと推定しました。そこでググるとTCP サポートと匿名クライアントがヒットしました。内容を要約するとPulseAudioをネットワーク経由で使うには、ネットワークモジュールのロードと設定が必要だということです。

Ubuntu 16.10のデスクトップ版ではPulseAudioの設定は/etc/pulse/default.paにあります。これを確認すると、ネットワークモジュールがロードされないような設定になっています。

そこでPulseAudioの設定ファイルを次のように修正しました。

# ローカルホストからの接続のみをパスワード無しで受け入れる。
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

設定を修正したら、PulseAudioを再起動させます。pulseaudioコマンドを使用する方法もあるようですが、sysctlコマンドまたはserviceで再起動する方法が分からなかったのでパソコンごと再起動しました。

再起動したらpacmdコマンドでmodule-native-protocol-tcpがロードされているか確認します。

$ pacmd list-modules
<SNIP>
index: 11
	name: <module-native-protocol-tcp>
	argument: <auth-ip-acl=127.0.0.1>
	used: -1
	load once: no
	properties:
		module.author = "Lennart Poettering"
		module.description = "Native protocol (TCP sockets)"
		module.version = "9.0"
<SNIP>

これでMPDクライアントから再生を指示するとBluetoothスピーカからも音声が流れてきて問題が解決しました。

参照と注釈

  1. MPDは基本的にそのプログラムが走っているコンピュータのスピーカーからしか音を出せませんが、PulseAudioを使うことで別のコンピュータに音声を送って聴くことができます。

「らじる★らじる」をrtmpdumpで録音する

「らじる★らじる」はrtmpdumpコマンドを使用すると簡単に録音できる。rtmpdumpで録音したファイルは、ffmpegコマンドでMP3に変換する。

たまたまNHKのラジオドラマ(オーディオドラマと今は呼ぶらしい)を聞いて、それ以来NHKのラジオドラマを気に入ってしまいました。ラジオドラマは、テレビと違って目を使う必要がないのでご飯を食べながら楽しむのにちょうど良さそうです。

しかしNHKラジオのネット放送「らじる★らじる」radikoと違って放送を後から聞くことができません。そこで「らじる★らじる」を録音して好きな時間に聞けるようにしました。これでNHKのラジオ語学講座も一週間遅れでの配信を待つ必要がなくなります。

「らじる★らじる」の録音

「らじる★らじる」の放送を録音するには、rtmpdumpコマンドを使用します。録音したファイルは、ffmpegコマンドでMP3ファイルに変換します。

インストール

rtmpdumpコマンドのインストールは、Ubuntuでは次のように簡単に導入できます。同時にMP3に変換するffmepgコマンドとID3タグを編集・表示するeyed3コマンドをインストールしておきます。

$ sudo apt install rtmpdump
$ sudo apt install ffmpeg eyed3

録音方法

「らじる★らじる」の放送を録音するrtmpdumpコマンドの肝は指定するオプションです。そこでもう何も考えずにriocampos/らじるらじるをrtmpdumpで録音する(仙台・名古屋・大阪も)を参考にさせてもらいます。

ファイルをMP3に変換

rtmpdumpはMP3よりも高圧縮なMPEG4 Audio(M4A)形式で録音しますが、私の音楽プレイヤがサポートしていないようなのでffmpegコマンドを使って一般的なMP3形式にトランスコードします。必要であればビットレートの指定などもffmpegコマンドのオプションで指定できます。

$ ffmpeg -i nhk.m4a -acodec libmp3lame nhk.mp3

MP3ファイルにID3タグを登録

ID3タグはffmpegコマンドにmetadataオプションを指定することで登録できます。複数のタグを指定する場合は、metadataオプションを必要なだけ追加します。

$ ffmpeg -i nhk.m4a -acodec libmp3lame -metadata "artist"="らじる ★ らじる" nhk.mp3
$ eyeD3 nkh.mp3
nhk.mp3	[ 469.47 KB ]
-------------------------------------------------------------------------------
Time: 01:00	MPEG1, Layer III	[ 64 kb/s @ 48000 Hz - Stereo ]
-------------------------------------------------------------------------------
ID3 v2.4:
title: 		artist: らじる ★ らじる
album: 		year: 
track: 		
Publisher/label: 

たくさんのID3タグがありますが、今回は次のタグ(metadataキー)を使用しました。

metadataのキー 意味
album アルバム名(番組名)
artist アーティスト名(らじるに固定)
title タイトル(放送日)
publisher 出版社名(放送局)
date 出版年(放送年)

「らじる★らじる」を録音するシェルスクリプト

以上のコマンドをまとめて「らじる★らじる」を録音するシェルスクリプトを作成しました。このスクリプトを使えば、次のようにcrontabに設定することでNHKのラジオドラマを自動的に録音してMP3ファイルに変換することができます。

45 22 * * 1,2,3,4,5 rec-radio.sh fm 15m 青春アドベンチャー
0 22 * * 6 rec-radio.sh fm 50m FMシアター
20 19 * * 0 rec-radio.sh r1 30m 新日曜名作座

UbuntuでCapsLockキーをControlキーに

LinuxでCapsLockとControlキーを入れ替えるには一般的にxmodmapコマンドを使用します。しかしUbuntuでCapsLockキーとControlを入れ替えるには、dconfコマンドで簡単に変更できます。

参照したページではUbuntu 14.04LTSが対象と書かれていましたが、Ubuntu 16.04LTSでも有効でした。

dconfでCapsLockキーもControlキーに

今回はControlキーが壊れたようで認識しなくなったので、交換ではなく次のようにしてCapsLockもControlキーとすして使えるようにしました。

$ dconf write /org/gnome/desktop/input-sources/xkb-options "['ctrl:nocaps']"

xmodmapでCapsLockキーもControlキーに

xmodmapコマンドを使用してCapsLockキーもControlキーと使用できるようにするには、例えば設定を記述するファイルとして~/.Xmodmapファイルを作成して、そこに次のように設定を書き込みます。

keycode  66 = Control_L Control_L Control_L Control_L
remove Lock = Control_L
add Control = Control_L

これをxmodmapコマンに読み込ませます。

$ xmodmap ~/.Xmodmap

この方法は、dconfと異なりログアウトすると設定を忘れてしまうので、.bash_profileにxmodmap ~/.Xmodmapを追加しておく必要があります。

参照

UbuntuTips/Desktop/HowToSetCapsLockAsCtrl – ubuntu Japanese Team Wiki

MongoDB 3.2(stable)をUbuntu 16.04にインストール

現在(2016年6月10日)MongoDB 3.xのUbuntu 16.04用のパッケージは、MongoDBから提供されていません。そのためUbuntu 14.04用のパッケージを使うことによる問題で、16.04用のパッケージが公開された時には解決しているはずです。

2016年8月26日:Ubuntu 16.04用のパッケージが提供されています。そのためもうsystemd用の起動設定ファイルを作成する必要はありません。

これまでUbuntu 14.04でMongoDBを運用してきましたが、新しいLTSであるUbuntu 16.04にアップグレードしたらmongodが起動しなくなってしまいました。

ここではUbuntu 16.04にMongoDB 3.2(stable)をインストール(アップグレード)する手順と、使用できるようにするまでのworkaroundを説明します。

MongoDB 3.2のインストール

MongoDBをアップグレードする場合は、データと/etc/mongod.confをバックアップしておきます。

MongoDBのインストール方法は、MongoDBが公開しているInstall MongoDB Community Editionに基づいて行います。

まず改変されていないか確認するための鍵を登録します。この鍵は、以前と変わっているので、アップグレードの場合も必要です。

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

次にパッケージのレポジトリを登録します。ここで3.2というバージョン指定をstableに変更すると、MongoDB 3.3が安定版になったらそのままアップグレードされ、常に最新の安定版MongoDBを使用できるようになります。

$ echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
$ sudo apt update

実際にMongoDBをインストールします。アップグレードの場合は、mongodb-orgだけでなくそのメタパッケージが指すパッケージ群を指定しないとアップグレードできません1

# 新規インストールの場合
$ sudo apt install mongodb-org

# アップグレードの場合
$sudo apt install mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools

本来ならばこれでmongodが起動するはずですが、起動ファイル(systemdの設定)が存在しないので自動では起動しません。たぶんUbuntu 16.04用のパッケージが公開されれば修正されるはずです。

mongodを自動起動させるworkaround

Ubuntu16.04用のパッケージが用意されているので、起動設定ファイルの作成ステップは不要です。Ubuntu 16.04用パッケージでは、起動用設定ファイルが/lib/systemd/system/mongod.serviceに作成されます。

mongodが起動しないのは、インストールしたパッケージがUbuntu 14.04用なのでUbuntu 16.04で自動起動させるために必要なsystemd設定が無いからです2

そこでsystemd用の起動設定ファイルmongodb.serviceRunning mongodb on ubuntu 16.04 LTSを参考にして作成します。

$ cat /etc/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongodb
Group=mongodb
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

mongod.serviceを作成したら、起動するか確認しておきます。

$ sudo systemctl start mongod
# or
$ sudo service mongod start

$ sudo systemctl status mongod
# or
$ sudo service mongod status
● mongod.service - MongoDB Database Service
   Loaded: loaded (/etc/systemd/system/mongod.service; disabled; vendor preset: 
   Active: active (running) since 金 2016-06-10 09:47:06 JST; 7s ago
 Main PID: 1479 (mongod)
   CGroup: /system.slice/mongod.service
           └─1479 /usr/bin/mongod --config /etc/mongod.conf

 6月 10 09:47:06 rerun systemd[1]: Started MongoDB Database Service.

起動することが確認できたら、自動起動するようにしておきます。

$ sudo systemctl enable mongod
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /etc/systemd/system/mongod.service.

mongoコマンドの警告表を止める方法

mongoコマンドでサーバに接続すると次のような警告メッセージが表示されることがあります。

$ mongo
MongoDB shell version: 3.2.7
connecting to: test
Server has startup warnings: 
2016-06-10T08:19:18.872+0900 I CONTROL  [initandlisten] 
2016-06-10T08:19:18.872+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-06-10T08:19:18.872+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-06-10T08:19:18.872+0900 I CONTROL  [initandlisten] 
2016-06-10T08:19:18.872+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-06-10T08:19:18.872+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-06-10T08:19:18.872+0900 I CONTROL  [initandlisten] 

この場合は、Disable Transparent Huge Pages (THP)を参考にしてkernelのtransparent huge pages機能を無効にします。

機能を無効にするには、/etc/rc.localにkernelの仮想設定ファイルに設定を書き込む命令を加えます。参照したページのように起動ファイルを作成したら、実行される順番によるのか警告を止めることができませんでした。

具体的には、/etc/rc.localexit 0の前に次の文を加えます。

if [ -d /sys/kernel/mm/transparent_hugepage ]; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

PHPのmongoライブラリ

Ubuntu 16.04では、PHP7が標準になりました。そのためmongodbライブラリをpeclコマンドでインストールすると、次のようなエラーが出てインストールできません。

$ sudo pecl install mongo
WARNING: "pecl/mongo" is deprecated in favor of "channel:///mongodb"
pecl/mongo requires PHP (version >= 5.3.0, version <= 5.99.99), installed version is 7.0.4-7ubuntu2.1
No valid packages found
install failed

そこで素直にパッケージに入っているmongoライブラリをインストールします。

$ sudo apt install php-mongo

脚注

  1. メタパッケージをアップグレードすれば、自動的にメタパッケージでインストールパッケージ群もアップグレードされるのだとずっと考えていました。

  2. Ubuntu 16.04ではsystemdがデーモンを起動させますが、Ubuntu 14.04ではUpstartが起動させていました。そのためUbunt 14.04用のパッケージにはsystemdで必要な設定ファイルが含まれていません。
    systemdに置き換えられたのは15.04からなので、Ubuntu 15.04と15.10でも同じ問題が発生します。

PT2で地デジと衛星放送を録画

chardev版のPT2ドライバをUbuntu 16.04にインストールしてテレビ放送(地デジ)を録画できるようにしました。以前は録画できるようになるまで結構苦労した気がするのですが、今回はすんなると簡単に録画サーバになりました。

これまでUSB接続の地デジチューナーを使用していましたが、しばらく前に壊れて録画できなくなっていました。しかしサーバを新しくセットアップしたので、改めて録画サーバ機能をセットアップしました。

いくつかの地デジチューナーを使用できるようですが、今回はあまり手間を掛けたくなかったので、デファクトスタンダードなPT2を使用することにしました。PT2はPCIバス接続という制限がありますが枯れたカードで、思いの外すんなりと必要なソフトをインストールすることができました。

構成

OS Ubuntu 16.04
チューナーカード PT2 Rev. B
ICカードリーダー SCR3310-NTTCom
B-CASカード 地デジ専用または衛星放送対応
チューナーカード
Linuxで使用できるチューナーカードはいくつかありますが、デファクトスタンダードはアースソフトのPT2とPT3です。しかしPT2はとっくに製造が終了しており、PT3も製造終了1となってしまいました。そのため最近はプレミア価格でPT3がヤフオクに出回っています。
今回は、手頃な価格で中古が手に入るPT2を使用しました。ただしこのカードは現在一般的なPCI Expressではない前世代のPCIバスに接続するので、購入前にPCIカードを取り付けられるか確認しておく必要があります。
B-CASカード
地デジ放送や衛星放送を視聴するには、テレビで視聴するときと同じようにそれぞれに対応したB-CASカードが必要です。PT2(PT3)にはこのカードが付属しません。そのためテレビやレコーダから抜いてくるか、B-CASカード付きのチューナーを別に購入する必要があります。
ICカードリーダ
B-CASカードの情報を読み取るために、USB接続の接触型ICカードリーダが必要です。
今回は以前から使用しているSCR3310-NTTComを使用しましたが、現在はこちらも製造終了しているようです。こちらも中古が結構流通しているようですが、別のICカードリーダーも結構な確率で使用できそうです。

ソフトのインストール

ICカードリーダーのパッケージをインストール

まずICカードリータのパッケージをインストールします。

$ sudo apt install pcscd pcsc-tools

# B-CAS を認識できるか確認
$ pcsc_scan

...
Japanese Chijou Digital B-CAS Card (pay TV)

pcsc_scanコマンドを実行しして、Japanese Chijou Digital B-CAS Card (pay TV)が表示に含まれればOKです。このコマンドは実行したままになるので、Ctrl-Cで停止させます。

dvb版PT2ドライバーを削除

地デジチューナのPT2を組み込むとdvb版ドライバがロードされます。このドライバを使用しないのでカーネルから削除します。

$ lsmod | grep earth_pt1
earth_pt1              28672  0
dvb_core              122880  1 earth_pt1

$ sudo rmmod earth_pt1

# ドライバーのロードを禁止する。
$ nano /etc/modprobe.d/blacklist.conf

また次回再起動した時に自動的にロードしないように/etc/modprobe.d/blacklist.confを編集しておきます。次の内容をファイルの最後に加えておくと、earth_pt1をロードしなくなります。

blacklist earth_pt1

chardev版PT2ドライバをインストール

新しくchardev版のPT2用ドライバーを取得してインストールします2

$ wget http://hg.honeyplanet.jp/pt1/archive/tip.tar.bz2
# tarのaオプションは、拡張子から自動的に圧縮アルゴリズムを識別してくれて便利。
$ tar axvf tip.tar.bz2
$ cd pt1-c8688d7d6382/driver

ただしこのままではコンパイルに失敗するので、次のパッチをpt1_pci.cに当てます3

--- pt1_pci.c.orig	2016-05-07 05:49:56.494036485 +0900
+++ pt1_pci.c	2016-05-07 05:50:05.597766146 +0900
@@ -16,6 +16,9 @@
 #include <asm/system.h>
 #endif
 #include <asm/io.h>
+#if LINUX_VERSION_CODE >=KERNEL_VERSION(4,2,0)
+#include <linux/vmalloc.h>
+#endif
 #include <asm/irq.h>
 #include <asm/uaccess.h>

このままインストールすると、カーネルをアップデートするたびに毎回コンパイルと再インストールが必要になります。そこでカーネルがアップデートされるたびに自動的に再コンパイルと再インストールされるようにDKMSに登録しておきます4

まず必要なパッケージをインストールして、ソースをコピーします。

$ sudo apt install dkms

$ sudo cp -r ../driver /usr/src/pt1-c8688d7d6382
# DKMS用の設定ファイルを作成する。
$ sudo nano /usr/src/pt1-c8688d7d6382/dkms.conf

DKMSに登録するためには、設定ファイルdkms.confを作成してソースのディレクトリに保存しておきます。設定ファイルの内容は、次のようになります。

PACKAGE_NAME="pt1"
PACKAGE_VERSION="c8688d7d6382"
CLEAN="make clean"
MAKE="make"
BUILT_MODULE_NAME="pt1_drv"
DEST_MODULE_LOCATION="/kernel/drivers/video/"
AUTOINSTALL="YES"

DKMSを使ってドライバーをインストールします。

$ sudo dkms install -m pt1 -v c8688d7d6382
$ sudo dkms status | grep pt1
pt1, c8688d7d6382, 4.4.0-21-generic, x86_64: installed

# ドライバーをカーネルにロードする。
$ sudo modprobe pt1_drv
$ lsmod|grep pt1
pt1_drv                40960  0

ただ私の環境だけかチューナのデバイスファイルのモードが、rootのみ読み書き可能で、他のユーザはアクセスできないように設定されてしまいます。

$ ls -l /dev/pt1video*
crw------- 1 root root 245, 0  5月  7 07:20 /dev/pt1video0
crw------- 1 root root 245, 1  5月  7 07:20 /dev/pt1video1
crw------- 1 root root 245, 2  5月  7 07:20 /dev/pt1video2
crw------- 1 root root 245, 3  5月  7 07:20 /dev/pt1video3

このままでは録画する時に不便なので、次のエントリーをrootのcrontabに登録して再起動するたびにデバイスファイルのモードを変更しています。

@reboot chmod a+rw /dev/pt1video*

rootのcrontabに登録するには、次のコマンドを使用します。

$ sudo crontab -e

これで誰でもアクセスできるようになりました。

$ ls -l /dev/pt1video*
crw-rw-rw- 1 root root 245, 0  5月  7 12:48 /dev/pt1video0
crw-rw-rw- 1 root root 245, 1  5月  7 12:48 /dev/pt1video1
crw-rw-rw- 1 root root 245, 2  5月  7 12:48 /dev/pt1video2
crw-rw-rw- 1 root root 245, 3  5月  7 12:48 /dev/pt1video3

録画ソフトをインストール

PT2用のchardevドライバーをインストールしたら、録画するプログラムをインストールします。

ただし放送のデコードに必要なライブラリarib25が含まれていないので、昔のソースから取り出して事前にインストールしておく必要があります。

$ sudo apt install zip pkg-config libpcsclite-dev

$ wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
$ unzip c44e16dbb0e2.zip && cd pt1-c44e16dbb0e2/arib25
$ make && sudo make install

arib25をインストールしたら、録画プログラムをインストールします。

$ cd ~/pt1-c8688d7d6382/recpt1
$ sudo apt install autoconf automake
$ ./autogen.sh
$ ./configure --enable-b25
$ make && sudo make install

録画テスト

全ての準備が整ったら、まずは受信信号を調べてみます。

$ checksignal 13
device = /dev/pt1video2
C/N = 33.592474dB

オプションの13は、地デジのチャンネルです。これは一般的なNHKなら1chとかのチャンネルとは別で、周波数チャンネルです。この対応は地域(送信塔)毎に異なっているので、対応表で自分の所の周波数チャンネル5を調べておく必要があります。

checksignalを終了するには、Ctrl-Cを入力します。

最後は実際に1分ほど13chを録画して見ます。

$ recpt1 --b25 --strip 13 60 test.mpg
using B25...
enable B25 strip
pid = 6840
C/N = 33.701023dB
Recording...
ecorded 62sec

これで100MiB前後のファイルが作成されるので、VLCなどの再生ソフトでちゃんと録画出来ているか確認します。

実際に使用するには、周波数チャンネルを指定したり時間を秒で指定するのが面倒です。そこで簡単なラップスクリプトを作っておくと便利になります。

参照と脚注

  1. アースソフトの地デジチューナー「PT3」が生産終了に – AKIBA Hotline!

  2. pt2/chardev

  3. パッチの作成には、Linux/テレビ関連/PT2を参考にさせてもらいました。

  4. PT2ドライバをDKMSに登録 – Kung Noi Blog

  5. 放送の周波数チャンネルを調べるには、マスプロの地上デジタル放送 チャンネル一覧表が便利です。

Ubuntu 16.04のZFSで/homeを冗長化

Ubuntu 16.04からZFSがサポートされたので、/homeをミラーリングしたZFS上に作成して冗長化してみました。

これまで使っていたディスクが壊れてしまい、新しくUbuntu 16.04をインストールすることになりました。そこでせっかくなので、このリリースからサポートされたZFSを使ってムフフなファイルたちを無くさないように大切な/homeを冗長化することにしました1

ここでは、ZFSをインストールして使用する方法を簡単にまとめます。ZFSならばバックアップの作成も簡単ですが、ここでは触れません。

システム構成

CPU Pentium G620
RAM 16GiB
Disk 1TB x 2
OS Ubuntu 16.04 Server
メモリ
最低4GB。できれば8GBで、多ければ多いほど良い。もっとも4GB未満でも動かないということもないようです。今回のマシンは、KVMホストもしているので16GBにしています。
ZFSのメモリというとECC付きメモリ or notという話は避けられません。ECC付きのメモリでないとファイルが知らない間に壊れているかもという恐ろしい話があります。一方で、それは他のファイルシステムでも同じで、ZFSだから壊れやすいとはことでもないという話もあります。私は個人的な用途なので気にせずECC無しのメモリを使用しています。
ディスク
ミラーリングの場合は、ディスクが二台必要です。三台でミラーリングして、冗長度を上げることも可能です。またRAIDZの場合は最低3台、RAIDZ2の場合は最低4台のドライブが必要です2
ZFSを構成するドライブ(パーティション)のサイズは、Btrfsと異なり全て同一である必要があります。容量の小さなドライブが混じっていると、全体がその最低サイズに合わせられます3。またディスクを入れ替える場合も、同じかそれ以上のサイズが必要です。
OS
Ubuntu 16.04 Server(64bit)。ZFSを使用できるのは、64bit版のみです。もっとも現在のUbuntuではDesktopとServe共に64bit版が標準なので、それほど気にする必要はありません。しかしアップグレードしてきた場合は32bit版を使っているかも知れないので、その場合は注意が必要です。

システムをインストール

grubブートローダにはちょっとした問題4があるので、ZFSはデータ用のファイルシステムとして使用することをオススメします。/(root)の復旧は/etcとインストール済みのパッケージ一覧があれば/(root)の復旧は簡単ですので、システム全体をZFSにして/(root)自体も冗長化する利点はそれほど大きくありません。

そこで今回は/(root)には冗長性を持たせないで、/homeだけにRAID1の冗長性を持たせることにしました。その代わり復旧に大切な/etcとパッケージ一覧、crontabcronにより適期的にZFS上にコピーしておきます。もちろんZFSのsnapshotを作成して過去に遡れるようにして。

まずsdaに小さなパーティション(8GiBで十分)を作成して、そこに通常通りシステムをインストールします。耐久性はそれほど要求されないので、USBフラッシュメモリにシステムをインストールしても良いかも知れません。

ZFSをインストール

ZFSに必要なカーネルモジュールzfs.koはカーネルに同梱されているので、必要なユーティリティをインストールするだけで完了です。このモジュールがコンパイル済みでカーネルに含まれているので、これまでのDKMSによるzfs.koのコンパイルを待つ面倒臭さがなくなりました。

$ sudo apt install zfsutils-linux

ユーティリティのインストールが完了したら、ZFSに必要なカーネルモジュールがロードされファイルシステムが使えるようになっているか一応確認しておきます。

$ lsmod |grep zfs
zfs                  2813952  3
zunicode              331776  1 zfs
zcommon                57344  1 zfs
znvpair                90112  2 zfs,zcommon
spl                   102400  3 zfs,zcommon,znvpair
zavl                   16384  1 zfs

$ cat /proc/filesystems |grep zfs
nodev	zfs

ミラーリング(RAID1)プールの作成

まずインストールしてあるディスクを確認します。

今後ディスクにアクセするときは、sdaなどの名前ではなく/dev/disk/by-idに表示される名前を使用します5。この名前は、インターフェイス(ata)とディスクのモデル名とシリアル番号の一部から作成されます。そのため今後ディスクを交換する時に、交換が必要なディスクを識別しやすくなります。

$ ls /dev/disk/by-id | grep ^ata
ata-ST31000524AS_9VPCZPQV
ata-ST31000524AS_9VPCZPQV-part1
ata-TOSHIBA_DT01ACA100_36D1KYUNS

ディスクを確認したら、それぞれに同じ容量のパーティションを作成します。

$ sudo cfdisk /dev/disk/by-id/ata-ST31000524AS_9VPCZPQV
$ sudo cfdisk /dev/disk/by-id/ata-TOSHIBA_DT01ACA100_36D1KYUNS

$ ls /dev/disk/by-id | grep ^ata
ata-ST31000524AS_9VPCZPQV
ata-ST31000524AS_9VPCZPQV-part1
ata-TOSHIBA_DT01ACA100_36D1KYUNS
ata-TOSHIBA_DT01ACA100_36D1KYUNS-part1

なぜかブートドライブに作成したパーティションが見えないのでudevadmin triggerコマンドを試してみます。ダメなときは再起動します。

$ ls /dev/disk/by-id/ | grep ^ata
ata-ST31000524AS_9VPCZPQV
ata-ST31000524AS_9VPCZPQV-part1
ata-ST31000524AS_9VPCZPQV-part2
ata-TOSHIBA_DT01ACA100_36D1KYUNS
ata-TOSHIBA_DT01ACA100_36D1KYUNS-part1

パーティションを作成せずにディスク丸ごとZFSにすることも可能で、この方がパフォーマンスが良いとのことです。しかし同じ1TBとして売られているディスクが、メーカーや製品が違ってもセクター数が同じという自信がありません。そこで私はいつも最大サイズより少し小さいパーティションを作成して使っています。

また最近のディスクはセクターサイズが4KiBなので、パーティションの区切りを4KiBのセクターサイズに合わせます。もっとも最近のfdiskなどは、そのことを考慮して配置してくれるので特に気にする必要はありません。

ディスクにパーティションを作成したら、プールを作成します。

$ sudo zpool create -o ashift=12 -o autoexpand=on \
  tank mirror \
  ata-ST31000524AS_9VPCZPQV-part2 \
  ata-TOSHIBA_DT01ACA100_36D1KYUNS-part1

$ sudo zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

	NAME                                        STATE     READ WRITE CKSUM
	tank                                        ONLINE       0     0     0
	  mirror-0                                  ONLINE       0     0     0
	    ata-ST31000524AS_9VPCZPQV-part2         ONLINE       0     0     0
	    ata-TOSHIBA_DT01ACA100_36D1KYUNS-part1  ONLINE       0     0     0

errors: No known data errors

-o ashift=12は、セクターサイズの指定です。
この指定によりセクターサイズを2^12B(4KiB)だと指定しています。通常は指定する必要はありませんが、512B/secのディスクを使用していると将来4KiB/secのディスクしか手に入らなくなった時に困ったことになります。

-o autoexpand=onは、将来ディスクを交換した時に可能ならプールのサイズを自動的に拡張する指定です。
このオプションがなくても特に困ることはありません。必要ならば、ディスクの交換後にプールのサイズをマニュアルで拡張することが可能です。ただし拡張できるのは、いずれの場合も冗長構成のディスク全てが現在のプールサイズよりも大きくなった場合に限られます。

tankは、プールの名前です。
/(root)直下のディレクトリ名(binなど)でなければ自由に選べますが、tankpoolが慣習として使われます。

また-O compression=lz4を一緒に指定してファイルシステム全体を圧縮することも可能です。後で見るように、ファイルシステムを作る時に個別に圧縮の有無と方式を指定することも可能です。

ファイルシステムを作成

プールを作成すると自動的に/にプール全体がマウントされますが、目的に応じてファイルシステムを切り出します。今回は、/home用に切り出します。

$ sudo zfs create -o atime=on -o relatime=on \
  -o compression=lz4 tank/home
$ sudo zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank        372K   868G    96K  /tank
tank/home    96K   868G    96K  /tank/home

-o atime=on -o relatime=onは、ファイルのアクセスタイムの更新方式を指定します。
Linuxはファイルにいつアクセスしたかという情報を記録しており、ファイルにアクセスするたびにファイルの情報を書き換えています。しかしこの情報が使われることはほとんどありません。そこで-o atime=offとしてアクセスタイムの更新を止めてしまうと、ファイルアクセスのパフォーマンスが上がります。しかし一部このアクセス情報を使用するプログラムもあるので、だいたい問題ない程度に更新の頻度を減らすようにします。

-o compression=lz4は、ファイルシステムを圧縮する方法を指定します。
ただ将来さらに優れた圧縮方法が導入されたら自動的にそれを使うように-o compression=onとしておいたほうが良かったかも知れません。zfs setコマンドで後から変更できます。

ファイルシステムを作成したら/homeの内容を移動させて置き換えます。

$ sudo rsync -av /home/ /tank/home
$ cd /
$ sudo rm -rf /home/*
$ sudo zfs set mountpoint=/home tank/home

ZFSはファイルシステムをマウントする時に/etc/fstabを見ないので、/etc/fstabを書き換える必要はありません。

swap on ZFS

スワップをわざわざZFS上に取る必要はないのですが、お試し的にスワップ領域をZFS上に取ってみました。

スワップ領域を作成

スワップ領域をZFS上に作成します6

$ sudo zfs create -V 16G \
  -b $(getconf PAGESIZE) tank/swap
$ sudo zfs set com.sun:auto-snapshot=false tank/swap
$ sudo zfs set sync=always tank/swap

ブロックサイズをページサイズと同じくすることで空きメモリが少ない状況で大きなブロックの書き換えを防ぎます。

sync=alwaysとすることで、キャッシュをすぐに空にしてメモリの使用量を抑えます。

スワップを有効にする

スワップボリュームを作成したら、後は通常のスワップ領域を追加するときと同じです。

まず/etc/fstabを編集して、次のエントリーを追加します。

# swap
/dev/zvol/tank/swap none	swap	default	0	0

次に実際にスワップ領域をフォーマットしてシステムに追加します。

$ sudo mkswap -f /dev/zvol/tank/swap 

$ sudo swapon --all --verbose
swapon /dev/zd32
swapon: /dev/zd32: found swap signature: version 1d, page-size 4, 同じ byte order
swapon: /dev/zd32: pagesize=4096, swapsize=17179869184, devsize=17179869184

fstabを設定してあるので、再起動しても自動的にスワップ領域が有効になります。

参照と脚注

  1. Linuxで使用できるディスクの冗長化には、歴史のあるmdや既に安定期に入りつつ有るBtrfsを使用できます。なのにZFSをなぜ選択したか? 単純にmdやBtrfsよりZFSのコマンドが私にとって分かりやすかったからです。

  2. RAIDZやRAIDZ2に必要なドライブの数は、次の式が成り立つ必要があります。ここで128KiBは、ZFSのデフォルトレコードサイズです。

    128KiB % (ドライブ数 – パリティ数) == 0
    %は、剰余を求める演算記号

    よって、RAIDZはパリティ1なので3,5,9台、RAIDZ2はパリティ2なので4,6,10台となります。

  3. Btrfsは、容量の異なるディスク(パーティション)を組み合わせても、だけ有効に使ってZFSよりも容量を稼げることがあります。またファイルシステムに空きが有る場合は、現在よりも容量の小さいドライブに置き換えることも可能です。

  4. 少し手間はかかりますが、/(root)自体をZFSにすることも可能です。
    ただしgrubブートローダに問題があり、/(root)の入ったプールを作成する時にいくつかのZFS機能を無効にする必要があります。最初の時だけ気にするなら良いのですが、zpool statusコマンドを実行するとzpool upgradeしてくださいというメッセージが親切にも表示されます。そこでzpool upgradeしてしまうと、システムが起動できなくなってしまいます。
    もちろん開発中のgrubではこの制限が取り除かれています。それでもZFSに新しい機能が導入されるたびにブートできなくなる不安がつきまといます。

  5. ZFSのプールを作成する時に/dev/sdaなどの名前を使用した場合は、zpool importコマンドでインポートし直せば/dev/disk/by-idでの名前に変更可能です。ZFSパッケージ登録記念:UBUNTU 15.10にZFS ON LINUX

  6. HOWTO use a zvol as a swap device
    スワップボリューム – archlinux
    Using a zvol for a swap device – FAQ zfsonlinux

dpkg -i相当のワンライナー

インストール済みのパッケージ一覧を得るには、/var/lib/dpkg/info/*を調べれば良い。

ディスクイメージからインストール済みのパッケージ一覧を取得する必要があり、そのためにワンワイナーを作成しました。

パッケージ情報

dpkg -iが実際に何を見ているのか分かりませんが、/var/lib/dpkg/infoディレクトリに各パッケージのファイル一覧が書かれたファイルなどが置かれています。

インストール済みのパッケージ名は、*.listというファイルから得られます。また一度インストールされた後に削除removeされたパッケージは、*.listのみで*.md5sumsというファイルが無くなっています。

そこで*.list*.md5sumsの両方が有るパッケージを探すことで、インストール済みのパッケージ一覧を取得できます。

ワンライナー

インストール済みのパッケージ一覧

$ ls /var/lib/dpkg/info/* | grep -e '\.list$' -e '\.md5sums$' | sed -e 's/\/var\/lib\/dpkg\/info\///' -e 's/\.list$//' -e 's/\.md5sums$//' | sort | uniq -c | grep '^\s*2 ' | sed -e 's/^\s*2 //'

インストール済みのパッケージは*.list*.md5sumsの両方あるので、拡張子を削除すると同じbasenameが2つ出てきます。そこで、basenameを数えて二つ有るbasenameを抜き出します。

削除したパッケージも一覧に含める

dpkg -iのように削除したパッケージ名も一覧に含めるには、basenameの数でインストール済みか削除済みかをマークします。

$ ls /var/lib/dpkg/info/* | grep -e '\.list$' -e '\.md5sums$' | sed -e 's/\/var\/lib\/dpkg\/info\///' -e 's/\.list$//' -e 's/\.md5sums$//' | sort | uniq -c | sed -e 's/^\s*2 /ii /' -e 's/^\s*1 /rc /'

UbuntuにSambaをインストール

WindowsとUbuntuマシン間でファイルを交換するために、UbuntuマシンにSambaをインストールしました。1Gbpsのネットワークならば、ローカルドライブ並みの速さでファイルの移動やアクセスができるようになりました。

Ubuntuは、Windowsで使用しているUSBメモリを挿すと自動的に/media/user_name以下にマウントされます。昔のようにデバイス名を確認してmountコマンドを入力する必要がなく、Windowsマシンと同じ感覚で使用できます。

そのためWidwosマシンとのファイル交換が少ない内は、USBメモリーにコピーしてやり取りしても大した手間ではありません。しかし多数のファイルや容量の大きなファイルを移そうとすると、ファイルのコピーに時間がかかり待ち時間がもったいなく思えます。

そこでWindowsとUbuntuマシン間でファイルを簡単にやり取りできるようにするため、UbuntuにSambaをインストールしました。これで一回の操作でファイルを移動でき、速さも1Gbpsのネットワークで繋がれたマシン間ではローカルドライブ並みです。

Sambaのインストール方法

Ubuntuのパッケージを使用してSambaをインストールします。

$ sudo apt-get update
$ sudo apt-get install samba

Sambaの設定

Sambaの設定は、/etc/samba/smb.confファイルを編集します。

最近のSamab4は、ActiveDirectoryの機能など非常に高機能になっています。しかしただのファイルサーバとして使用するには、設定は非常に簡単です。

パッケージをインストールした時の設定ファイルとの差分は以下のようになります。

--- smb.conf.bak	2016-05-05 12:25:56.638219192 +0900
+++ smb.conf	2016-05-06 08:08:23.171354734 +0900
@@ -185,18 +185,25 @@
 # public shares, not just authenticated ones
    usershare allow guests = yes
 
+### charset ###
+
+   dos charset = CP932
+   unix charset = UTF-8
+
 #======================= Share Definitions =======================
 
 # Un-comment the following (and tweak the other settings below to suit)
 # to enable the default home directory shares. This will share each
 # user's home directory as \\server\username
-;[homes]
-;   comment = Home Directories
-;   browseable = no
+[homes]
+   comment = Home Directories
+   browseable = no
+   path = %H/smbdir
 
 # By default, the home directories are exported read-only. Change the
 # next parameter to 'no' if you want to be able to write to them.
 ;   read only = yes
+   read only = no
 
 # File creation mask is set to 0700 for security reasons. If you want to
 # create files with group=rw permissions, set next parameter to 0775.
@@ -211,7 +218,7 @@
 # Un-comment the following parameter to make sure that only "username"
 # can connect to \\server\username
 # This might need tweaking when using external authentication schemes
-;   valid users = %S
+   valid users = %S
 
 # Un-comment the following and create the netlogon directory for Domain Logons
 # (you need to configure Samba to act as a domain controller too.)

dos charsetunix charsetで、ファイル名に使う文字コードを設定します。ここでは、Ubuntu側ではUTF-8を使用し、Windowsには標準のCP932(Shift_JIS)に見えるようにしています。

全てのユーザで同じフォルダ(ディレクトリ)を共有するのではなく、ユーザごとに自分のホームディレクトリにアクセスするために[home]ディレクティブを有効にします。

pathでアクセスできるディレクトリーを~/smbdir以下に限定します。これは、Ubuntuマシンの個人設定ファイルを変更・削除したりという間違いを起こさないようにするためです。

read onlynoにすることで、読み込み専用ではなく書き込みもできるようにします。

valid usersは、ディレクトリ(ここでは自分のホームディレクトリ)にアクセスできるユーザを限定するための指定です。今回はホームディレクトリ内なので、自分自身に限定するために%S(自分のユーザ名に置き換えられる変数)を指定しています。ユーザ名を列挙すると、他のユーザもアクセスできるようになります。また@groupと指定することで、特定のUbuntuグループに属するユーザ全員にアクセスを許可することも可能です。

Sambaの再起動

Sambaの設定を変更したら、testparmコマンドで問題がないことを確認してからSambaプログラムを再起動します。

$ sudo testparm
$ sudo /etc/init.d/samba restart

ユーザ登録

Windowsからアクセスできるディレクトリを指定したので、そのディレクトリを作成しておきます。

次にpdbeditコマンド1でユーザ登録を行います。ユーザ登録時にSambaに接続するパスワードを聞かれますが、このパスワードは、Ubuntuマシンにログインするパスワードとは別の文字列を指定することが可能です。

$ sudo mkdir ~user_name/smbdir
$ sudo chown user_name:user_group ~user_name/smbdir
$ sudo chmod 700 # アクセス設定

$ sudo pdedit -a user_name

トラブルシューティング

複数のWindowsマシン間で同じファイルを編集する時にファイルが壊れる問題が起きる場合は、ロック機構の設定を変更する必要があります。
Locks and Oplocks

参照と脚注

  1. 以前はユーザ登録にsmbpasswdコマンドを使用していましたが、現在は、pdbeditコマンドの使用が推奨されています。

MP3ファイルの音量を均一化

  • Ubuntu(Linux)でMP3ファイルの音量を均一化する(normalize)には、aacgainを使用する。
  • aacgain(mp3gain)は、タグを変更するだけなのでMP3の音質に影響しない。
  • MP3ファイルを変更する他に、出力するときに音量を修正する方法もあるらしい。

CDから音楽をリッピングしたりPodcastをダウンロードしてくると、MP3ファイルの音量がアルバムやファイルごとに違うことがよくあります。音量が小さくなったらボリュウームを上げるだけですが、急に音量が上がると「うっ!」となります。

そこでMP3の音量を程よい大きさに統一してくれる方法がないかと探してみると、MP3ファイルに音量設定を加える方法と再生するときに変更する方法がありました。

MP3ファイルの音量はaacgainで均一化

MP3ファイルの音量を一定にする方法を探すためにググると、mp3gainを使う方法が一般的なようです。

音量を一定ににするに処理は、音声ファイルの十得ナイフsoxでも行えます。しかしsoxコマンドは、MP3ファイルを一度デコードして音量を変更した後に再度エンコードします。そのため処理に時間がかかる上に再エンコードにより音質が劣化してしまいます。

それに対してmp3gainは、MP3ファイルの波形情報には手を加えずに音量が一定になるようにボリュームの設定をMP3に加えるだけです1。そのためmp3gainは、処理時間が短くてすみ波形に手を加えないので音質劣化もなく人気があります

mp3gainは、様々なプラットフォームに対応しておりWindowsやマックで使用することができます。もちろんLinuxでも使えるようですが、Ubuntuではパッケージ化されていません2

そこでmp3gainの代わりにaacgainを使用します3。このソフトは、mp3gainと同じ機能に加えてMP4とAACファイルの音量も均一化できます。

aacgainのインストール

aacgainは、公式パッケージに入っていないのでPPAからインストールします。

$ sudo add-apt-repository ppa:robert-tari/main
$ sudo apt-get update
$ sudo apt-get install aacgain

MP3ファイル間の音量を統一

MP3ファイルの音量を一定にするには、-rオプションを指定して、引数で一定にしたい音声ファイルを指定するだけです。これで指定されたMP3ファイルの音量が全て同じ(くらい)になります。

$ aacgain -c -r *.mp3

-cオプションは、クリップした時の警告を無視します。

GUIならeasymp3gain

aacgain(mp3gain)をWindowsなどのようにGUIで使用したい場合は、GUIラッパーのeasymp3gainを使用します。

$ sudo apt-get install easymp3gain-gtk

# or Qtを使用したい場合

#$ sudo apt-get install easymp3gain-qt

ただしインストールしただけではmp3gainが無いのでMP3を扱えません。そこでMP3を処理するにはmp3gainの代わりにaacgainを使用するように設定を変更します。

easymp3gain-gtkまたはeasymp3gain-qtを起動したら、OptionsメニューからAdvancedを選択して、MP3Gain backendをaacgainに変更します。

easymp3gainのOptions→Advanced設定
easymp3gainのOptions→Advanced設定

easymp3gainの使い方

easymp3gainの使い方は、次のような流れになります。

  1. Add File(s)またはAdd Folderボタンをクリックして一定にしたい音声ファイルを選択する。
  2. Analyzeボタンをクリックして音声ファイルを解析する。
  3. Gainボタンをクリックして、音量を一定にするための情報をを音声ファイルに加える。

再生時に音量を均一化

MP3ファイルを変更するのではなく、出力される全ての音量を調整するには、LADSPAプラグインを使用する方法があるようです。ただし試していないので、こんな方法もあるというポインタのみ記しておきます。

Automatically adjust the volume based on content? – ask ubuntu

参照と脚注

  1. mp3gainは、音量を一定にするために再生するときに音量をどのくらい上げるか・下げるかという情報を付加します。MP3Gain – wikipedia

  2. mp3gainは、Ubuntuでも以前はパッケージが配布されていました。しかしUbuntu 15.04以降はパッケージが削除されました。
    Debian Bug report logs – #761847
    Publishing history of mp3gain package in Ubuntu

  3. aacgainの他には、python-rgainやnormalize-audioを試してみました。またsoxでも–normオプションを使っても音量を統一できるということで試してみました。ただし使い方を間違っていたのか、どれもaacgainのようにはMP3ファイルの音量を揃えることはできませんでした。

Ubuntu 15.10マシンにBluetoothスピーカーを接続

  • Ubuntu 15.10マシンにBluetooth接続のワイヤレス・スピーカーを接続した。
  • Bluetoothスピーカーを接続するのに特別なパッケージのインストールは必要なかった。
  • 音飛びが発生することがある。

パソコンから離れた場所でポッドキャスト(音楽)を聞きたくて、Ubuntu 15.10マシンにBluetoothスピーカーを接続してみました。

当初FMトランスミッターを使ってラジオに飛ばすことを考えていましたが、電気屋さんでBluetooth接続のスピーカーがあることを知り失敗覚悟での挑戦でした。一応その場でググって成功事例があることは確認したのですが、思いの外すんなり行ってしまいちょっと拍子抜けでした。

環境

パソコン ThinkPad T400
OS Ubuntu 15.10
無線スピーカー ELECOM LBT-SPP20

Bluetoothには、従来のVer. 3.0までとBluetooth Low Energy(BLE)と呼ばれるVer. 4.0の二種類が存在します。これらは同じBluetoothですが互換性はありません 。非互換性は、ハードウエアレベルでの非互換性なので、ソフトウエアで対応することはできません。そのため購入前にBluetoothのバージョンが合っているか確認しておく必要が有ります。

今回購入したBluetoothスピーカー(ELECOM LBT-SPP20)は、スマホ対応ということでBluetooth Ver. 4.0(BLE)のみに対応しています。

最近のパソコンは、仕様にBluetoothの対応バージョンが記載されていますが、ThinkPad T400はBluetooth対応というだけでどのバージョンになっているのか記載がありませんでした1。そのためVer. 4.0のみ対応のBluetoothスピーカー(LBT-SPP20)は選ばないほうが賢明です。しかし手元にBluetooth 4.0対応のUSBドングルがあったので、非対応でもなんとかなるだろうという算段でした。

しかしThinkPad T400内蔵のBluetoothはVer. 4.0にも対応していたようで、LBT-SPP20と問題なくペアリングすることが出来ました2

Bluetoothスピーカーとのペアリング

Bluetoothスピーカーを使用するためには、最初にペアリングをおこなう必要が有ります。

Bluetoothスピーカーとのペアリングは次の手順で行います。なおこの手順は、Bluetoothスピーカーに限らずBluetoothデバイスに共通の手順です。

  1. Bluetoothスピーカーをペアリングモードにします。
  2. UbuntuマシンのBluetooth設定を開きます。
  3. デバイス欄下の[+]をクリックして、接続するBluetoothスピーカーを検索します。
  4. Bluetoothスピーカーが表示されたら、それを選択して「進む」をクリックします。
    発見されたBluetoothデバイスを選択して「進む」をクリックします。デバイスの検索には多少時間がかかります。
    発見されたBluetoothデバイスを選択して「進む」をクリックします。デバイスの検索には多少時間がかかります。

    少し待つとペアリングが完了します。
    これでBluetoothデバイスとのペアリングに成功です。
    これでBluetoothデバイスとのペアリングに成功です。

    LBT-SPP20は、ペアリングに失敗することが有りました。この時はもう一度ペアリングさせると上手く行きます。

ペアリングの結果は保存されるので、次回からは電源を入れれば自動的に通信して使用できる状態になります。

サウンド設定

ペアリングに成功したら、Bluetoothスピーカーから音が出るか確認します。

  1. サウンドの設定を開くと出力タブにペアリングしたBluetoothスピーカーが表示されているはずです。表示されない時は、Bluetooth設定の[-]でペアリングを削除して再度ペアリングを行います。
    サウンドの設定。内蔵スピーカーの下にBluetooth接続のスピーカー(LBT-SPP20)が表示されています。
    サウンドの設定。内蔵スピーカーの下にBluetooth接続のスピーカー(LBT-SPP20)が表示されています。
  2. テストボタンをクリックしてBluetoothスピーカーから音が出ることを確認します。
    LBT-SPP20は、ペアリング完了直後は音量が最大に設定されます。そのためテストを行う前に音量を最低に絞っておくことをオススメします。

これで問題がなければ、rhythmbox等で再生した音楽をBluetoothスピーカーで楽しめます。安いスピーカーとはいっても、やはりノートパソコン内蔵のスピーカーとは段違いの音質です。

問題点

UbuntuマシンとBluetoothスピーカーの接続はすんなり行ったのですが、いくつか問題が有ります。

ペアリングで音量設定が最大になる

LBT-SPP20は、ペアリングすると音量設定がリセットされて最大になってしまいます。ペアリング後に音量を下げておくのを忘れると大音量で再生され心臓によくありません。ペアリングが完了したら[-]ボタンを押して音量を最小(「ピポ」と音がする)にしてから、ちょうど良いところまで音量を上げることをオススメします。

音飛びすることがある

時々(結構な頻度かも)音飛びすることが有ります。その時にはsyslogに次のようなログが記録されています。

Jan  5 10:20:13 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 103796 us (= 18308 bytes) in audio stream
Jan  5 10:20:13 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 71287 us (= 12572 bytes) in audio stream
Jan  5 10:20:13 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 106171 us (= 18728 bytes) in audio stream
Jan  5 10:20:13 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 72159 us (= 12728 bytes) in audio stream
Jan  5 10:20:13 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 8108 us (= 1428 bytes) in audio stream
Jan  5 10:20:14 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 150157 us (= 26484 bytes) in audio stream
Jan  5 10:20:14 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 36300 us (= 6400 bytes) in audio stream
Jan  5 10:20:14 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 165 us (= 28 bytes) in audio stream
Jan  5 10:20:14 T400 pulseaudio[1810]: [bluetooth] module-bluez5-device.c: Skipping 101186 us (= 17848 bytes) in audio stream

この音飛びの原因はWi-Fiとの干渉かと思いThinkPad T400のWi-Fiを無効にしてみましたが改善されませんでした。ただなんとなく夜は昼間に比べて音飛びする頻度が低いような気がするので、どこかの電波(ノイズ)と干渉しているのかもしれません。

Bluetoothスピーカーが消える

UbuntuのBluetooth設定を見るとスピーカーと接続してていても、サウンド設定にBluetoothスピーカーが表示されないことが有ります。この時はペアリングを一度削除して、再度ペアリングをする必要が有ります。

参照と脚注

  1. ThinkPad T400の仕様について書かれたページを見つけたが、Bluetoothは ver. 2.1となっていた。なぜ接続できたんだろう? 見つけたページに誤りがある可能性と、LBT-SP20がver. 4.0の他に従来のBluetoothにも対応していた可能性が考えられます。
    Lenovo ThinkPad T400 Notebook specs

  2. ThnkPad T400内蔵のBluetoothを無線のハードウエアスイッチでOFFにすると、Bluetooth Ver. 4.0 USBドングルを接続してもBluetoothを有効にできませんでした。ドングル自体はUbuntuから認識できているようなのですが、もし内蔵のBluetoothがver. 4.0に対応していなかったら接続できなかったかもしれません。