Linux

Ubuntu 18.04でTP-Link AC600 Archer T2U Nanoを使う

光回線を導入するに当たって、折角なのでUbuntuがインストールされているデスクトップパソコン用のUSB WiFiアダプタを購入しました。5GHz(802.11ac/802.11a)にも対応したTP-Link AC600 Archer T2Uです。Ubuntu 18.04では、USBに刺しただけでは認識しれくれません。

WiFiアダプタ - TP-Link AC600 Archer T2U Nano をUbuntuで使用するための設定 にインストール方法が出ていましたが、リンク先のソースは更新がしばらく止まっていたので、そのオリジナルらしい、aircrack-ng/rtl8812auを導入しました。リンク先のページの手順でドライバのコンパイルとインストールが行えて、その後USBドングルを挿抜することで認識されました。

2021/3/5 追記: ノートパソコン(Intel Wi-Fi 6 AX200搭載)と、本機を刺したデスクトップパソコンをWSR-1166DHPL2/Nで接続し、SCPでファイル転送してみたところ、最大で130Mbps程度の速度が出ていました。 ノートパソコンは5GHz, デスクトップは2.4GHzでルータに接続しました。

eBayでX520-DA2(互換品)を買った

実験用にSFP+が2本刺さるNICをeBayで購入しました。 富士通のD2755-A11というものです。 Intel 82599Eが載っていて、X520-DA2と事実上同じもののようです。 3月末に注文したのですが、 さすがにコロナウィルスの影響か、遅れに遅れ、6月中旬になってやっと到着しました。

早速箱から出してみると、PCI Expressバスの信号線のAC結合キャパシタが一つ無くなっていることに気が付きました。

調べてみると、x8バスのうち、7番目のペアのようだったので、x4ではリンクすると予想し、 PCのx16スロットに挿して起動してみたところ、案の定x4で動作しました。 Linuxのログに次のように出力されています。

ixgbe 0000:03:00.0: Multiqueue Enabled: Rx Queue count = 6, Tx Queue count = 6 XDP Queue count = 0
ixgbe 0000:03:00.0: PCI Express bandwidth of 16GT/s available
ixgbe 0000:03:00.0: (Speed:5.0GT/s, Width: x4, Encoding Loss:20%)
ixgbe 0000:03:00.0: This is not sufficient for optimal performance of this card.
ixgbe 0000:03:00.0: For optimal performance, at least 20GT/s of bandwidth is required.
ixgbe 0000:03:00.0: A slot with more lanes and/or higher speed is suggested.
ixgbe 0000:03:00.0: MAC: 2, PHY: 16, SFP+: 5, PBA No: D2755A-011

次に、AC結合キャパシタとして0.1uFを実装して、再度起動させてみたところ、やはり同じメッセージです。 使っているマザーボードはZ370 Gaming plusなのですが、 こちらの記事を見ると、2番目のx16 PCIeスロットは、 どうやらx4接続のようです。というわけで、このマザーボードだと、x16を2個は事実上使えないのでした。

Ubuntu 18.04 LTSで動くUSBドングル購入

自宅で使っているデスクトップパソコンは、USB経由でWiMaxのルータに接続してインターネット接続をしています。 ルータの電源をパソコンからではなくて、コンセントから供給するために、パソコンとルータの通信は無線化することにしました。

少し検索して、I-O DATAのWN-G150UMKを購入しました。Amazonでたったの685円。 黒は685円なのに、なぜか白は1621円という謎。

早速パソコンに挿して見ると、画面右上にWiFiのマークが現れましたので、クリックしてSSIDの選択、 パスワードの入力で接続できました。ドライバを手動でインストールする必要もありませんでした。

iwconfigで見てみると、Bit Rate=1 Mb/sと常に表示されています。でも実際はしっかり速度は出ているようですので、 表示にはバグがありそうです。

**2019/12/13 追記:**次はBluetoothはどうかと思って少し調べてみたところ、 USB 4.0 Bluetoothドングル CSR4.0+ EDRというモノだとUbuntu 18.04で動作しているというコメントがありました。

**2021/2/6 追記:**光回線の導入に合わせて、5GHzにも対応したTP-Linkのドングルを購入しました。こちらはドライバの手動インストールが必要でした。

UbuntuのAlt+Tab動作をウィンドウ単位に変更する

以下の情報はUbuntu 18.04 LTSにて確認しています。

Ubuntuのデフォルトのウィンドウマネージャだと、Alt+Tabを押したときに、 アプリケーション単位で切り替えることができます。でも、Windowsの動作のように、 アプリケーション単位ではなく、ウィンドウ単位で切り替えたいと常々思っていました。

ちょっと調べたところ、いくつかの方法があるようですが、特別なアプリケーションのインストールが不要な方法を見つけましたので、ご紹介します。

答え自体はHow to prevent Gnome-shell’s Alt+Tab from grouping windows from similar apps? にあるものです。

dconf-editorを必要ならインストールします。(端末から)起動してorg/gnome/desktop/wm/keybindingsに移動します。

switch-applicationsから、’<Alt>Tab’を削除します。変更後は次のようになるようにします。

“switch-applications”

編集する際は、次の画面で"Use default value"をオフにすると、その下の"Custom value"を編集できるようになりますので、そこから’<Alt>Tab’を削除します。

“Edit”

次に、switch-windowsに’<Alt>Tab’を追加します。こちらも変更後は次の画面のようになります。

“switch-windows”

以上で完了です。

ちなみに、調べている時に初めて知ったのですが、デフォルトではAlt+(Tabキーの上のキー. 日本語キーボードだと半角/全角キー, 英語キーボードだと`キー)でアプリケーション内でのウィンドウ切り替えができるようです。 このデフォルト動作もそれほど悪くはないかも知れませんが、個人的には上記のように一つのキーストロークで全部のウィンドウを切り替えられる方が頭の負担が減って良い気がします。

Linuxのファイアウォールufwの設定

ufwの設定で、特定のポートを開放する方法は各所に書かれているのですが、ちょっと調べた範囲では、任意ポートをオープンにする方法は見つかりませんでした。

希望としては、特定のネットワークアドレスから、自ホストへの全てのポートへのアクセスを許可したいです。

結果としては、UFW Essentials: Common Firewall Rules and Commandsにある情報でわかりました。

$ sudo ufw allow from 192.168.0.0/24

とすることで、ネットワークアドレス192.168.0.0/24からのアクセスを許可できます。

$ sudo ufw status

で確認すると、

To                      Action             From
--                      ------             ----
Anywhere                ALLOW              192.168.0.0/24

という行が追加されていました。

情報量少ないですが、自分用のメモということで。

パソコン新調したので、Linuxのカスタマイズ

新しいパソコンにUbuntuを入れた関係で、環境構築に励んでいます。

デフォルトでnautilusというファイルマネージャが入っているのだと思いますが、 使い勝手はいまいちです。ちょっと調べてみて、rangerというのが便利そうでした。 (参考:CLIファイルマネージャrangerの基本設定) ただ、gnome-terminal(“端末”)だと、どうしても画像プレビューができない様子でした。 それで、rxvt-unicodeをapt-getでインストールしました。 デフォルトだとフォントがあまりにもひどいので、最低限の設定として、以下を.Xresourcesとして作成しました。 (rxvtの設定参考情報:RXVT Customization with ~/.Xresources, urxvtことrxvt-unicodeを使うことのメモ)

URxvt*background: Black
URxvt*foreground: White
URxvt*visualBell: true
URxvt.fading: 40
URxvt.letterSpace: -1
URxvt*font: xft:Takaoゴシック

また、w3mimgdisplayはパスが通っていないので、.bashrcに以下の行を追加しました。

export W3MIMGDISPLAY_PATH=/usr/lib/w3m/w3mimgdisplay

そして、~/.config/ranger/rc.confのpreview_imagesの行を次のようにしました。

set preview_images true

これらの作業で、画像が端末中でプレビューできるようになりました。

Zynq上でiperf3による帯域テスト

前々から気になっていた、Zynqでのイーサネット帯域を測定しました。

Zynqで使用しているカーネルは3.15.0-xilinx(z-turn board付属)です。 通信相手は、仮想マシンで動作しているUbuntu(カーネルは3.13.0-32-generic)です。 Windows上でのiperfと通信させても、それほど大きな違いはありませんでした。

Zynq側iperfのコンソール出力を以下に示します。

root@ubuntu-armhf:/home/ubuntu/iperf-3.1.3/src# ./iperf3 -s
warning: this system does not seem to support IPv6 - trying IPv4
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.0.100, port 33239
[  5] local 192.168.0.90 port 5201 connected to 192.168.0.100 port 33240
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  59.0 MBytes   495 Mbits/sec
[  5]   1.00-2.00   sec  61.8 MBytes   516 Mbits/sec
[  5]   2.00-3.00   sec  61.9 MBytes   519 Mbits/sec
[  5]   3.00-4.00   sec  61.8 MBytes   518 Mbits/sec
[  5]   4.00-5.00   sec  61.9 MBytes   518 Mbits/sec
[  5]   5.00-6.00   sec  61.6 MBytes   519 Mbits/sec
[  5]   6.00-7.00   sec  61.6 MBytes   517 Mbits/sec
[  5]   7.00-8.00   sec  61.8 MBytes   518 Mbits/sec
[  5]   8.00-9.00   sec  61.6 MBytes   515 Mbits/sec
[  5]   9.00-10.00  sec  61.6 MBytes   518 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.00  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.00  sec   615 MBytes   515 Mbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
^Ciperf3: interrupt - the server has terminated
root@ubuntu-armhf:/home/ubuntu/iperf-3.1.3/src# ./iperf3 -c 192.168.0.100
Connecting to host 192.168.0.100, port 5201
[  4] local 192.168.0.90 port 33104 connected to 192.168.0.100 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.01   sec  50.0 MBytes   416 Mbits/sec    0    233 KBytes
[  4]   1.01-2.02   sec  49.7 MBytes   412 Mbits/sec    0    298 KBytes
[  4]   2.02-3.02   sec  48.9 MBytes   409 Mbits/sec    1    242 KBytes
[  4]   3.02-4.00   sec  47.5 MBytes   405 Mbits/sec    0    247 KBytes
[  4]   4.00-5.02   sec  50.0 MBytes   412 Mbits/sec    0    247 KBytes
[  4]   5.02-6.02   sec  48.8 MBytes   409 Mbits/sec    0    266 KBytes
[  4]   6.02-7.02   sec  48.8 MBytes   411 Mbits/sec    0    267 KBytes
[  4]   7.02-8.00   sec  48.5 MBytes   413 Mbits/sec    0    281 KBytes
[  4]   8.00-9.02   sec  49.0 MBytes   404 Mbits/sec    0    293 KBytes
[  4]   9.02-10.00  sec  48.5 MBytes   414 Mbits/sec    0    303 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   490 MBytes   411 Mbits/sec    1             sender
[  4]   0.00-10.00  sec   489 MBytes   410 Mbits/sec                  receiver

iperf Done.

通信方向によって、かなり帯域に違いがあります。サーバモードで動作しているときの方が高速のようです。

ADCデータキャプチャのためのLinuxとFPGAの設計

現在Elecrowにて製作中のADC基板ができてきた折に、Z-turnボードと接続してイーサネットにてADCデータを取得するためのファームウェア周りを作成しています。

FPGAについて

Zynqに接続されているDDRメモリにADCデータを保存します。 DMAマスタをRTLで記述するのは割と面倒(とにかくAXIはポートが多いので、どうしても行数は増える)なので、できるだけ楽をしたいと思います。 そういうわけで、Vivado HLS一択です。DMAコントローラのコードは次のように至極単純です。

ちなみに、AXI DMAを使えばいいじゃないか、という意見もありそうです。 しかしながら、AXI DMAは一回の転送で最大8MBしか転送できないという理解不能な制限があるので、今回はわざわざ作成しました。 SGDMAを駆使すればできると思いますが、とりあえずデータを取り込むことが目的なので、そのあたりは別途余裕ができたところで検討したいと思います。

#include "hls_stream.h"
#include "ap_int.h"
#include "axi_dma.h"

void axi_dma(ap_uint<64>* addr, ap_uint<32> offset, ap_uint<32> len, hls::stream<ap_uint<64> > &in){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE s_axilite port=offset
#pragma HLS INTERFACE s_axilite port=len
#pragma HLS INTERFACE m_axi depth=4096 port=addr
#pragma HLS INTERFACE axis port=in
    ap_uint<32> i;
    
    for (i = 0; i < len; i++){
#pragma HLS PIPELINE
    	addr[offset+i] = in.read();
    }
}

ん?Hugoでc++のシンタックスハイライトが効かない…

AXI Liteインタフェースでoffsetアドレス、転送長をレジスタで設定します。また、モジュールの開始終了もAXI Lite経由で操作できるようになっています。