2020-03-29

timeoutコマンドで設定したタイムリミットをキャンセルするには

timeoutコマンドを使用すると、任意のコマンドの実行時間を制限することができる。 例えば、
timeout 30 sleep 1h
は、sleep 1hというコマンドを実行し、30秒経つとTERMシグナルを送る。

一度設定したタイムリミットを延ばしたくなった場合、以下のようにするとよい。

kill -s SIGKILL PID
または、
kill -s SIGSTOP PID
なお、PIDtimeoutプロセスの方のPIDである。 後者の場合、SIGCONTを送れば、ストップしていた時間は延長されずにタイムリミットが経てばTERMシグナルが送られる。

2020-03-28

tcpdumpを一般ユーザーで実行する設定

Tcpdumpをsudoなしで一般ユーザーから実行するための設定方法を説明する。
  1. まず/usr/sbin/tcpdumpが実行できるユーザーを限定する。
    sudo groupadd pcapgroup
    sudo usermod -a -G pcapgroup user
    sudo chgrp pcapgroup /usr/sbin/tcpdump
    sudo chmod 750 /usr/sbin/tcpdump
    
    もしwheelでよければ、1行目のgroupaddは要らない。
  2. ケーパビリティを/usr/sbin/tcpdumpに設定する。
    sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
    
上記の設定後に、tcpdumpがpromiscuous modeに設定することも含めて、ユーザー権限でできるようになる。

参考

2020-03-23

RolandのミキサーM-200iのREACポートのオーディオをLinuxマシンで録音

Rolandという浜松にある音響機器メーカーが出しているM-200iというオーディオミキサーがある。 このミキサーには、REACポートというディジタル音声を40チャネル出力するポートが備わっている。 ステージボックスとの接続や他のミキサーとの接続に使用するポートで、Ethernetパケットに音声情報を載せて送るようになっている。

Windows用には、このポートを通して録音するソフトが出ている。 Mac OS X用には、サードパーティからREAC driverというGPL3のツールが出ている。 どちらもLinuxでは使用できないので、REAC driverのソースを参考に、Linuxで動くものを作成し始めた。

REAC driverのようなカーネル空間で動くオーディオドライバにすると扱いやすいのだろうが、そこまでするのは大変なので、ユーザー空間で動かすプログラムをつくることにした。 Linuxのsocketをつかってプログラムを書いてみたが、パケットロスを回避するのが難しく断念、最終的に、tcpdumpでファイルに保存しておき、後処理をすることにした。

  1. まず、M-200iのREACポートとLinuxマシンとをLANケーブルで接続する。 (1 Gbpsでリンクすることを期待していたのだが、dmesgを見るとなぜか100 Mbpsでリンクしていた。)
    e1000e: enp0s31f6 NIC Link is Up 100 Mbps Full Duplex, Flow Control: None
    e1000e 0000:00:1f.6 enp0s31f6: 10/100 speed: disabling TSO
    
    今回はストレートケーブルを使って、スイッチングハブなどを介さずに接続した。
  2. 以下のようにtcpdumpでキャプチャし、ファイルに保存する。このとき、オプション-Bでカーネル上のバッファサイズを大きく取っておく。今回使用した環境 (Intel Core i7-7700 + H270) では、256MiBに設定したらようやくパケットロスしなくなった。
    $ tcpdump -i enp0s31f6 -B 262144 -w a.pcap
    
    このときtcpdumpはパケットロスしたと報告するのだが、次のステップでパケットを解析すると、音声情報が載ったパケットのロスは無かった.
  3. そのあと、自作のプログラムで、チャネルを選択して24-bit WAVE形式に変換する。プログラム自体はそのうちGitHubで公開するかもしれない。
    $ reacrecorder --save-channels 21,22,39,40 --save-wav-24 --load-pcap-file a.pcap
    

REAC driverにはM-200iとのネゴシエーションなどいろいろな処理が書かれているのだが、今回の用途には必要なかった。 REAC masterとなるM-200iから常に音声データがブロードキャストされている。 そのパケットをキャプチャしてWAVEに変換すれば良いだけだった。