Ubuntu Weekly Topics

2016年3月25日号 Launcherの画面下配置が可能に・サウンドドライバのDKMSパッケージのテスト・UbuntuBSD・UWN#459

この記事を読むのに必要な時間:およそ 4 分

画面下のLauncher

16.04では,Unity 7のLauncherの機能が拡充されます。具体的には,Launcherの位置を画面左から画面下へ移動できるようになりました。これによりOS XのDockと,Windowsのタスクバーをあわせた形のアイコンホルダとして利用できます。

ただし,現時点ではコマンドラインかgsettingsの設定ツールを用い,自分で操作が必要です。

サウンドドライバのDKMSパッケージのテスト

Ubuntuを使っていて,「音が出ない」問題を解決するための取り組みが開始されています。Canonicalに所属する開発者(公私ともにALSA関連で活躍していることで有名)のDavid Henningssonが,サウンドドライバをDKMSにしてデイリービルドを生成する仕組みに取り掛かっています。この成果物を利用することで,「音が出ない」問題に遭遇した場合の解決が簡単になると考えられます。特に,snd-intel-hdaを使う環境では役に立つでしょう。

……というだけで話が終わると魔法の呪文にしか聞こえないので,少し前提となる知識を掘り下げてみましょう。

まず,現在のPCの,いわゆる「オンボードサウンド」は,Linuxでは「snd-intel-hda」と呼ばれるドライバで動作するものが大勢を占めています。これはIntelが規格化したAC97の流れを組むHDA(High Definition Audio。開発コードネームであるAzaliaとも呼ばれます)規格に基づいたもので,サウンドを生成する論理コントローラと,デジタル=アナログ変換を担当するコーデックチップの2チップで構成され,非常に柔軟な入出力環境を構成できます。

たとえば,HDAは入出力端子を自由にマッピングできるように設計されていて,「今挿したデバイスはマイクですか,ヘッドフォンですか」といった問い合わせを表示し,それにあわせて「この端子はヘッドフォン出力として使う」「この端子はマイク」といった設定を動的に変更する機能が実現できるようになっています。最近のノートPCで見かける,ライン出力とマイク入力兼用のステレオミニ端子はこうした機能を利用しています注1)。

注1
こうしたジャック管理をLinuxから扱うためのJack Sense機能もあります。

しかしながら,HDAベースのサウンドデバイスはデスクトップPC・ノートPC・スマートフォン等,世の中にあまりにも数多く存在しており,さらに前述の柔軟な設定機能やコーデックとの接続も千差万別であることから,「コーデックがそもそも見えていない」「まったく問題なく認識されているように見えるが,初期設定はミュートなので音が出ない」「ミュートを解除しても何をどうやっても音が出ない。実は独自の細工を入れたドライバでないとダメ」「ドライバは認識され,コーデックも認識されていて音も出るが,音量は爆音。おそらくスピーカーや鼓膜を狙ってきている」「その逆に,聴力検査として使えそうな程度の音しか出ない」「ミキサーへの応答性がなぜかピーキーで,極小と極大の二値になる」「ヘッドフォンジャックになにか挿してもスピーカーがミュートされず,強制的に周囲の人と一緒に音楽を楽しむことができる」「それどころか,ヘッドフォンジャックになにか挿していないとスピーカーから音が出ないので,常にダミーで挿しておく必要がある。ヘッドフォンが出家を検討している気がする」「特に何も問題なく音が出てくる。ただしライン入力端子から」「出力系統はすべてが普通に機能するが,マイク入力だけはうまく動かないのでビデオ通話や生放送に使えない」「ヘッドフォンを接続するとシステムが再起動する」「ライン入力を一度使ったら最後,ケーブルを抜くとシステムが再起動する」「なんらかの入出力ジャックの変化があるとシステムが再起動する」「とにかく音を出すとまれに再起動する」といった,厄介かつ千差万別の問題に遭遇する場合があります。これらはAC97/Azaliaの仕様上,やむをえない部分もあるのですが,利用者に激しい混乱をもたらします注2)。

Linux全般の話として,これらの問題には利用者からのレポートや,趣味や生き様としてサウンドデバイスを蒐集する人の活躍により,ドライバに修正を加えることで対応しています。各種ベンダから直接情報提供が行われる場合もあります。これは,サウンドドライバを使うことだけを考えるのであれば,カーネルは新しければ新しいほど問題が少なくなることを意味します。

注2
これらの問題は,Intel HDAの便利な機能が裏目に出た結果です。本文中で触れた,「挿したデバイスをユーザーに確認し,以降そのデバイスが接続されているものとして扱う」機能を例にすると,そもそもこの機能は(Windows環境であれば)ベンダが提供する専用のドライバと組み合わせて利用されるものです。Linux環境ではそうした変更を必ずしも反映できないので,結果としておかしな事態を引き起こすことになります。ボリューム問題も同様の原因で,組み合わせる機器に応じて出力レンジを動的に変更できる(そして,どのコネクタに何が接続されるか分からないので,ライン出力だろうがヘッドフォン出力だろうが十分な供給電力を保証しておき,上限出力はドライバで制限する)機能や,ヘッドフォンが接続されたタイミングでスピーカー出力をOffにする,といった機能がうまく噛み合っていないことが原因です。

こうした背景がありつつ,しかし,サウンドドライバのことだけを考えてカーネルを更新することはかなり困難です。

カーネルバージョンが異なれば各種メモリ管理やドライバ・ファイルシステムの振る舞いなどが変わってきますし,電源管理などは新しいカーネルに移行することで問題が起きることも考えられます。また,ベンダーがバイナリで提供するドライバなどは,対象とするバージョンのカーネルの利用が必須です。

「ドライバだけ最新にしたい」という,Linuxにはつきもののジレンマを解決するためにDELLが開発したソリューションがDKMS(Dynamic Kernel Module Support)です注3)。DKMSは,「最新のドライバのソースコードをもとに,必要になった時点でドライバをコンパイルする」仕組みです。カーネルが更新されるたびに新しいドライバをコンパイルして,ロード可能なドライババイナリを都度作り出します注4)。

注3
InspironやOptiplex,PowerEdgeなどでお馴染みの,コンピューターメーカーのDELLです。DELLはハードウェアベンダの中ではLinuxに非常に熱心なプレイヤーのひとつで,サーバーハードウェアを「うまく」扱うためのさまざまな実装を提案しています。
注4
Windowsではそんな面倒なことはないのに!と思うかもしれません。Windowsではカーネルが変更になっても同一のバイナリドライバを利用することができますが,LinuxではそもそもNTカーネルのようなマイクロカーネル+HALによる抽象化レイヤの提供ではなく,モノリシックカーネルかつドライバを直接カーネルの一部としてロードする仕組みを採用していることから,異なるカーネルには異なるドライババイナリが必要になります。ABIが変更になっていないことを前提に,以前のドライバをマイナーな変更が加わったカーネルからロードするweak-bindと呼ばれる方策もありますが,基本的にUbuntuではカーネルABIは日々変更になっていくものなので,この文脈ではあまり役に立ちません。

このDKMSを使い,LKML(の,sound.gitサブモジュール)で日々開発される,最新のドライバを持ってくることで,サウンドまわりでトラブルがあった場合に簡単に問題を解決できるようにするのがこの取り組みの目的の一つです。

ところが,DKMSも完璧なアプローチではありません。Linuxカーネル内の各種インターフェースは(アプリケーションに対して開放しているシステムコールが現実的なレベルではほぼ不変と言って良いレベルにあるのに比べると)日々変更されており,以前のドライバソースが新しいカーネルでコンパイルできることは保証されていません。また,「うまくコンパイルできるかどうかは,実際にやってみないと分からない」という,少し困った性質を帯びています。なにしろ,このあたりは不作為で壊れてしまうものであって,壊そうと思って壊していたり,予測可能な形で壊れるわけではないからです。

ということで,このデイリービルドの目的の2つめは,「不作為にビルドできなくなってしまったドライバの存在に気づく」ことになります。

日々新しいドライバがDKMSパッケージとして提供され,さらに自動テストによって少なくともコンパイルできるかどうかが判明するため,なるべく新しいバージョンのドライバを使わざるをえないsnd-intel-hdaだけでなく,新しいバージョンのカーネルで取り込まれたサウンドデバイスを使いたい,といった場合にも役に立つと考えられます。「音が出ない上に,dmesgを見ると『こんなコーデックは知らない』といったメッセージが出ている」といった場合,ここで日々ビルドされるパッケージを導入することで,ドライバ起因の問題であれば解決できるようになるかもしれません。

なお,ここまで触れた「ドライバが古い」的なこと以外にも,初期設定等の問題で音が出ないこともよく起こります。音が出ない場合はこのプロジェクトの成果物を利用するより前に,ALSAが提供するデバッグ手順に基づいて,ミキサ等の確認を最初に行ってください。

“UbuntuBSD”

Debian/kFreeBSDのUbuntu版,と言えるプロジェクトが始まりました。UbuntuBSDは,「DebianのユーザーランドにFreeBSDのカーネル」という構成のDebian/kFreeBSDと同じように,「UbuntuのユーザーランドにFreeBSDのカーネル」で構成されるディストリビューションです。Linuxカーネルの採用する,パフォーマンス最優先のアプローチでは困る(そして各種sysctl程度ではチューニングしきれない)ような用途に使いたい,あるいは宗教上の理由でBSDベースでないといけない,技術的な興味がある,といった場合に利用する価値がありそうです。

インストーラはd-iベースで,かつてのAlternate CDによるインストールとほとんど同じ手順となっています。現在はベータレベルのため不具合も残っていますが,面白い試みです。

LinuxカーネルとBSDではそもそもメモリ確保戦略を含めた根本的な設計思想が異なるため,ZFSを安全に使うのであればDebian/kFreeBSDやUbuntuBSD,あるいは「UbuntuのユーザーランドにOpenSolarisから派生したカーネル」という構成のNexentaにを使うほうが安全,という未来がやってくる可能性もあります。

UWN#459

Ubuntu Weekly Newsletter 459 #459がリリースされています。

その他のニュース

今週のセキュリティアップデート

usn-2930-3:Linux kernel (Raspberry Pi 2)のセキュリティアップデート
  • https://lists.ubuntu.com/archives/ubuntu-security-announce/2016-March/003361.html
  • Ubuntu 15.10用のアップデータがリリースされています。CVE-2015-7566, CVE-2015-8767, CVE-2016-0723, CVE-2016-2384, CVE-2016-2782, CVE-2016-3134, CVE-2016-3135を修正します。
  • 対処方法:アップデータを適用の上,システムを再起動してください。
  • 備考:ABIの変更を伴いますので,カーネルモジュールを自分でコンパイルしている場合は再コンパイルが必要です。カーネルモジュール関連のパッケージ(標準ではlinux-restricted-modules, linux-backport-modules, linux-ubuntu-modulesなど)は依存性により自動的にアップデートされるため,通常はそのままアップデートの適用を行えば対応できます。
usn-2935-1/usn-2935-2/usn-2935-3:PAMのセキュリティアップデート
  • https://lists.ubuntu.com/archives/ubuntu-security-announce/2016-March/003362.html
  • https://lists.ubuntu.com/archives/ubuntu-security-announce/2016-March/003363.html
  • https://lists.ubuntu.com/archives/ubuntu-security-announce/2016-March/003364.html
  • Ubuntu 15.10・14.04 LTS・12.04 LTS用のアップデータがリリースされています。CVE-2013-7041, CVE-2014-2583, CVE-2015-3238を修正します。
  • pam_userdbがパスワードハッシュの検証の際,大文字と小文字を区別しないで比較を行っていました。これにより本来期待されたパスワード強度が実現されていませんでした。また,pam_timestampが適切に機能していない問題・pam_unixが長大なパスワードを受け取った際にハングアップする問題を修正します。
  • 対処方法:通常の場合,アップデータを適用することで問題を解決できます。
  • 備考:当初リリースされたパッケージには,不具合によりmultiarch環境でのアップグレードを失敗させる副作用がありました。12.04ではusn-2035-3のパッケージを,それ以外の環境ではusn-2035-2のパッケージを利用してください。
usn-2937-1:WebKitGTK+のセキュリティアップデート
usn-2938-1:Gitのセキュリティアップデート
  • https://lists.ubuntu.com/archives/ubuntu-security-announce/2016-March/003366.html
  • Ubuntu 15.10・14.04 LTS・12.04 LTS用のアップデータがリリースされています。CVE-2016-2315, CVE-2016-2324を修正します。
  • gitリポジトリに悪意ある加工を含むパス名が含まれていた場合,メモリ破壊を伴うクラッシュが発生する可能性がありました。これにより任意のコードの実行が可能と考えられます。
  • 対処方法:通常の場合,アップデータを適用することで問題を解決できます。

著者プロフィール

吉田史(よしだふみひと)

Ubuntu Japanese Team Member株式会社創夢所属。システム管理を中心にWindows/PC Unixを併用している。Ubuntu Japanese Teamではパッケージサーバの管理や翻訳などの作業を担当。

コメント

コメントの記入