「 linux 」一覧

Raspberry Pi でパケット遅延器


Raspberry Pi を使って、パケットの遅延器を作ってみました。
Linux なら2枚の NIC を使って簡単に作ることができます。これの Raspberry Pi 版となります。

USB-NIC を増設

Raspberry Pi 2/3 には1つの LAN ポートしかないため、2つめを追加する必要があります。
そこで今回 USB NIC を追加しました。手元にあったのが ESXi でも使うことが出来た LAN-GTJU3H3 だったのでこれを使用しました。
ちょうど Raspbian 2017-09 版でも装着したら、すぐに使えるという状態だったので手軽でした。


同様のチップを採用しているものも素直に動くのでは、と思います。

続きを読む


iptables で Symmetric NAT


ずいぶん久しぶりに Linux を使っての NAT Box を作成しました。
手持ちのブロードバンドルーターが Symmetric NAT のタイプではなかったので、検証のために Linux で Symmetric NAT を作成しました。

NATの種類

NATには、いくつか種類があって フルコーン、アドレス制限、アドレスポート制限、シンメトリック と4種類ほどに大別されます。
・・・というのが数年前のお話でした。実はこれでは現実問題対応出来ないとのことで、現在ではこの区別はレガシー扱いとなっています。

今は、NATのマッピング規則と、フィルタリング規則という2つの観点からルーターNATの特性を判定します。
手持ちのルーターでは、エンドポイント非依存マッピングで、アドレスポート依存フィルタリングというシロモノでした。
というわけで P2P のゲームやアプリにおいては割と都合の良い感じになっています。
しかしプログラムの作成立場としては、ある程度のケースが欲しいもので今回シンメトリックNAT を作ることにしました。

マッピング規則、フィルタリング規則、これらについては検索すると多くの情報が見つかり、わかりやすい記述を見つけることが出来ると思うので、ここでは説明を省略します。
続きを読む


Mesa3D のレンダラーの切り替え


Linux の OpenGL 実装で有名な Mesa3D ですが、レンダラーの切り替えができることがわかったのでメモしておきます。
ちなみに The Mesa 3D Graphics Library って現時点においては 17.0 となってました。しかしながら動作実験環境は Ubuntu 16.04 で apt でインストールできるものを使用しているため、これよりも古いです。

切り替え方法

以下の環境変数で指定が可能です。

  • LIBGL_ALWAYS_SOFTWARE
  • GALLIUM_DRIVER

この環境変数で LIBGL_ALWAYS_SOFTWARE=1 とするとソフトウェア(エミュレーション)でのレンダラーが選択されるようです。
そして GALLIUM_DRIVER=softpipe を指定することで llvmpipe との切り替えができるようです。


続きを読む


USB Wifi Linux ドライバを変えて再試験


ちょっと前の某雑誌で、当ブログでも紹介していた USB WiFi の紹介がありました。
ただ当ブログで紹介していたドライバとは違うものだったので、確認してみたいと思います。
ちなみに 以前の内容はこちらです。

ドライバの確認・インストール

まず使用環境は Ubuntu 16.04 ですが、正確には 16.04.1 においても使えるかどうか確認してみました。
ドライバは https://github.com/abperiasamy/rtl8812AU_8821AU_linuxにあるものです。

使用機材は、 WN-AC433UA (IO DATA) で試しました。
前回紹介したドライバは、 https://github.com/gnab/rtl8812au でした。
基本的にインストールはこれと同じように行っていけるのですが、 今回の rtl8812AU_8821AU_linux では、 DKMS 対応の Makefile も含まれているので、こちらを使って準備しました。

これでしばらくするとインストールが完了します。

動作チェック・感想

こちらのドライバのほうが以前紹介したものよりはよさそうな印象をうけました。
というのも、前回の記事の中にあった不正な文字列は今回は見当たらなかったですし、NetworkManagerあたりにもスムーズに認識させることができていた点からです。

気になる速度の方は、iso ファイルのコピーで確認してみたところ 約 16.5 MB/s でした。つまり 132 Mbps あたり。
リンク速度の方は、iwconfig で確認したところ以下のような感じでした。

5GHz 帯で、 433 Mbps でのリンクとなっていました。
433M で実効 133 M というともう少し速度が出てほしいところです・・・。


ちなみにルーターの方は ac 側で 1733 Mbps までの対応のものを使用しています。
ルーターとの距離も 2m 内くらいだったので、やっぱり速度のほうにはもう少し頑張ってほしいところです。

追加検証

そもそも速度計測方法がイマイチということに気付いたので別方法で計測しました。前回は CIFS でのファイルコピーで別の処理コストもかかっていました。
これを iperf を用いて純粋に転送速度だけを測ってみました。

結果は、UP/Down どちらも大きな変化はなく、 220Mbps ほどでした。理論値の半分くらいにまで到達したのでまずまずの結果かなと納得しました。ちなみに 11n のほうでは自分の環境では 80Mbps 程度のリンクとなり実効速度も 53Mbps ほどでした。

11ac の環境は偉大だと言うことがよくわかりました。


ラズパイ2で使えたUSB WiFi 2016


前回に続いて Raspberry Pi 2 で使えた USB WiFi 2016版です。
少なくとも手元で動作チェックをして動いたものだけをここに記載しています。

オススメできるのは手軽さから自動でドライバを認識するタイプですね。
自分でドライバを入手・ビルドするタイプはなかなかうまくいかないことが多かったです。

なおここで使用している Raspbian は 2016/09版を使用しています。

usb_wifi_adapters2016

続きを読む


Linux で使えた USB WiFi 2016


USB WiFi を Linux で使おうとすると予想通り大変です。
Windows でドライバなしで使える(標準ドライバ)とかがどれだけ恵まれているかを実感させられます。今回は個人的に試してみて Linux でも使えたものをまとめてみました。

usb_wifi_adapters2016

この記事を書いている段階では生産中止になっていない入手可能なものに厳選しています。

続きを読む


gcc 組込み関数(memcpyとか)のインライン展開抑制


アライメントに寛容な x86 の話ではなく、 ARM プロセッサのお話になります。OSが動いていてソフトウェア例外を処理できるような状況では非アライメントなデータであってもなんとか動くので表面化しませんが、そのアタリをケアしない状況ではプログラムが停止してしまう原因の1つです。

さて非アライメントなデータ列をコピーしたりクリアしたりする際に、memcpy, memset などを使用することがあります。
デバッグ時にはうまく動いていたのに、最適化を有効にしたリリースビルドでは, このあたりでうまく動作せずに例外を出してしまったりすることがあります。

仕方なくこれらの関数の自前版を用意してこちらを使うようにしてしまうのも1つの手です。しかし memcpy, memset などのまま対処することも可能なことがわかりましたのでここで紹介したいと思います。
ここまでに言い忘れてしまいましたが、 gcc を使用した開発環境でのお話です。

原因

そもそも最適化によって何が起こり、正常に動かなくなってしまうのか。この原因は gcc が自分の組み込み関数を使用し、最適化によってインライン展開されてしまうことによります。

インライン展開されてもアライメント寛容なコードであればまだ良かったりしますが、速度重視のために最適化されているのでそうはならないのが現実です。

対策

gcc のコンパイルオプションで実はこのインライン展開の抑制が可能です。
-fno-builtin-(functionname) というオプションになります。なので、 memset,memcpy らを抑制する場合には、 -fno-builtin-memset, -fno-builtin-memcpy といったようなオプションを指定することとなります。


Ubuntu 16.04 で Vulkan を使う


以前には Ubuntu 14.x で Vulkan を試してみました。今は Ubuntu も 16.04 LTS が出てちょっと経ちましたので、これでやってみたいと思います。結論としては、従来よりも安定して導入・使用開始できそうな気配を感じています。

ubuntu-vulkan_vulkanscene

続きを読む



Lenovo Ideacentre Stick 300 に Ubuntu


Ideacentre Stick 300 には Windows がインストールされていましたが、Windows10 にあげてしまう前に、もうちょっと試してみたいということもあって Ubuntu をインストールしてみることにしました。
続きを読む