MENU

LinuxのDMAチャネル割り当て状況を確認してデバイス競合を解消する手順

目次

まず /proc/dma でISA DMAチャネルの割り当てを確認する

DMAチャネルの使用状況を最短で把握するには、/proc/dma を参照します。

cat /proc/dma

現代のLinux(カーネル5.x〜6.x、Ubuntu 22.04/24.04・AlmaLinux 9・Debian 12など)では、以下の出力が標準的です。

 4: cascade

チャネル4の cascade は、ISA DMAコントローラ(8237A系)を2台カスケード接続するための予約エントリです。このエントリだけが表示される場合、ISA DMAを使用するレガシーデバイスが存在しないことを意味します。仮想マシン(KVM・VMware・Hyper-V)でも物理サーバーでも、現代の環境ではほぼこの状態になります。

ISA DMAデバイスが存在する環境では、使用中のチャネル番号とデバイス名が追加で表示されます。

 2: floppy
 4: cascade

上記はフロッピードライブがチャネル2を使用している例です。旧式のISAサウンドカード(SB16など)が接続されている環境ではチャネル1やチャネル5が表示されることもあります。

DMAとは何か―実務で押さえておくべき最低限の知識

DMA(Direct Memory Access)は、CPUを介さずにデバイスとメインメモリ間でデータを転送する仕組みです。ストレージやネットワークアダプターが大量データを転送する際に、CPUの処理を占有せずに済むため、システム全体のスループットが向上します。

ISAバス時代(〜1990年代)のDMAはチャネル番号(0〜7)を各デバイスに割り当てる方式で、同じチャネルを複数のデバイスで共有できないため、IRQ競合と並んでトラブルの原因になりやすい仕組みでした。現代のPCI/PCIe接続デバイスはバスマスタリングによってDMAを実現しており、チャネル番号の制約がないため /proc/dma には表示されません。

現代のLinux環境でDMA関連情報を調べる実践的な方法

PCI/PCIeデバイスのDMA状況は /proc/dma ではなく、以下のコマンドで確認します。

dmesgでDMA関連のカーネルメッセージを確認する

カーネルがDMAの初期化や割り当てに関するメッセージを出力している場合、dmesg で絞り込めます。

dmesg | grep -i dma

NVMeやSATAコントローラ、ネットワークカードのDMA初期化ログが表示されます。ブート直後の情報を見たい場合は journalctl -k | grep -i dma でも参照できます。journalctl はsystemd環境(RHEL 8以降・Ubuntu 20.04以降など)で利用可能で、再起動をまたいだ過去のカーネルログも確認できる点が dmesg との大きな違いです。

lspciでPCIデバイスのバスマスタリング状態を確認する

PCIデバイスがDMAを有効に活用するには「バスマスタリング」が有効になっている必要があります。

lspci -v 2>/dev/null | grep -E "(^[0-9a-f]|BusMaster)"

BusMaster+ と表示されていればバスマスタリング(DMA)が有効な状態です。BusMaster- の場合はDMAが無効になっており、デバイスのパフォーマンスが著しく低下している可能性があります。仮想マシン上のPCIパススルー設定後にパフォーマンスが出ない場合、この項目を最初に確認するのが定石です。

IOMMUのDMAリマッピング状態を確認する

セキュリティ強化のため、現代のサーバーではIOMMU(Input-Output Memory Management Unit)によるDMAリマッピングが有効になっている場合があります。

dmesg | grep -i iommu

KVMでのVFIOデバイスパススルーや、PCIデバイスの直接割り当てを行う際は、IOMMUが有効になっているかをこのコマンドで事前に確認します。DMAR: IOMMU enabled または AMD-Vi: AMD IOMMUv2 loaded のような行が見つかれば有効です。有効になっていない場合は、BIOSまたはUEFIの設定(Intel VT-d / AMD-Vi)を確認してください。

仮想環境・コンテナでの注意点

KVM・VMware・Hyper-Vなどの仮想マシン上では、/proc/dma4: cascade しか表示されないのが正常な状態です。ゲストOSはISAバスをエミュレートしていますが、実際のDMA転送はハイパーバイザーが処理するため、ゲストから見えるISA DMAチャネルには何も割り当てられていません。

Dockerコンテナ上でも cat /proc/dma は実行できますが、ホストカーネルのDMA状態をそのまま参照しているに過ぎないため、コンテナ固有のDMA情報を示すものではありません。コンテナ環境でデバイスのDMA状況を調べる必要がある場合は、ホスト上で直接 dmesglspci を実行します。

ISAレガシーデバイスが絡む場合の競合確認手順

産業用PC・データ収集ボードなど、ISA DMAを使用するデバイスを接続する場面では、/proc/dma/proc/interrupts/proc/ioports を合わせて確認します。

# DMAチャネルの割り当て確認
cat /proc/dma

# IRQ(割り込み)の割り当て確認
cat /proc/interrupts | head -30

# I/Oポートアドレスの使用状況確認
cat /proc/ioports | head -30

あるFA(ファクトリーオートメーション)現場では、旧式のアナログI/Oカードを新しいLinuxサーバーへ移植した際、/proc/dma に同じチャネル番号が2つ表示される現象が発生しました。カーネルモジュールのロード順序によって競合が起きており、/etc/modprobe.d/ 配下にモジュールパラメータを記述したファイルを追加してチャネル番号を明示的に指定することで解消しました。

# モジュールパラメータでDMAチャネルを固定する例(ファイル名は任意)
# /etc/modprobe.d/mycard.conf
options <モジュール名> dma=1

ISA DMAを扱うデバイスドライバはカーネルが一元管理しており、ユーザーが /proc/dma を直接書き換えることはできません。チャネルの変更はドライバのモジュールパラメータまたはデバイス本体のジャンパーピン設定で行います。設定変更後は modprobe -r でモジュールを一度アンロードしてから再ロードするか、再起動して反映を確認してください。

<PR>この記事に関連するおすすめ書籍

[試して理解]Linuxのしくみ 増補改訂版

プロセス・ファイルシステム・権限などLinuxの内部構造を図解で理解できる一冊。運用判断の勘所が腑に落ちます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次