Mac環境でVivadoを動かしたい話①

# 何をしたいか

手持ちのMacBookでVerilogの勉強をしたいので、まずはその環境を作りたい。RTLシミュレータとして、XilinxのVivadoを使用したいが、Windows用とLinux用しか用意されていない。mac環境でやろうとすると、VMwareだったりVirtualBoxでLinux仮想マシンを立ち上げて、その中でvivadoを動かすということが考えられる。しかし、とはいうもののこれはマシンリソースをだいぶ食うので避けたい(昔、VirtualBox+CentOSで作ってみたことがあるが、発熱と電池消耗がハンパなかった)。
ということで、今回は勉強も兼ねてDockerで構築してみたいと思う。

# 環境
- MacBook Air (M1, 2020)
- MacOS BigSur 11.2.3

# DockerDesktop for Macのインストールとhello-worldの実行

<a href="https://www.docker.com/get-started">公式サイト</a>にmac用のバイナリが公開されている。それどころかIntel版とApple版の2種類が用意されている！せっかくなのでAppleシリコン版を選択。
hello-worldイメージをダウンロードして、コンテナ実行できることを確認。

```zsh
% docker container run hello-world
```

"Hello from Docker!"メッセージが表示されるまでの流れが示されていて、

1. DockerHubからhello-worldイメージを取得(pull)してきて、
1. このイメージから新規コンテナを作成・実行して、
1. このメッセージを生成して、ターミナルに送信した

ということらしい。コマンドで明示的に与えたのは2だけだが、ローカルのイメージファイルを検索して、なければDockerHubからイメージを取得してきてきてくれる。


# ubuntuイメージの確認
これまでcentos派だったのだが、昨今の動向もあり今回はubuntuで進めてみる。DockerHubのイメージもubuntuベースのものが多いようにも思える。

お試しでhello-worldに記載のあった方法でubuntuコンテナを起動して、xを飛ばすところまでを確認してみる。

hello-worldの実行とは異なり、作成後のコンテナを操作するために"-it"オプションを指定する。ホスト名が211966417e8bでrootでログインしているようだ。

```zsh
% docker run -it ubuntu bash
root@211966417e8b:/#
```

さらにパッケージのアップデートとx11パッケージのインストールを行う

```zsh
root@211966417e8b:/# apt-get update
root@211966417e8b:/# apt-get install -y x11-apps
root@211966417e8b:/# xeyes &
[1] 648
root@211966417e8b:/# Error: Can't open display: 

[1]+  Exit 1                  xeyes
```

最近のMacはX11を同梱してなくて、Xquartzを追加でインストールする必要があるとか。

# xを動かすまで
結構苦戦したので、別章で。

### XQuartzの環境設定
<a href="https://www.xquartz.org">XQuartz</a>をインストールして、Preference→Securityで

- "Authenticate connections"
- "Allow connections from network clients"

にチェックを入れて、XQuartzを再起動。

### hostのIPアドレスの確認
ubuntu側で設定するDISPLAY変数用にホストのIPアドレスを取得しておく。今回の場合、ホスト=macのこと。```ipconfig getifaddr en0```の結果を使用する。

### コンテナの再起動
-eオプションでDISPLAY変数の値を渡し、-vオプションで.Xauthorityをubuntu側にマウントする。

```zsh
% docker run -e DISPLAY="<IPaddr>:0" -v ~/.Xauthority:/root/.Xauthority -it ubuntu bash
```

こうして起動したコンテナに対して、再度

```zsh
root@c5f2445da776:/# apt-get update
root@c5f2445da776:/# apt-get install -y x11-apps
root@c5f2445da776:/# eyes &
```

無事目玉が表示されたのでOK。

### XQuartzの設定

ところでXQuartzを起動するとxtermが自動起動されてしまう。こちらは使用しないので、以下の手順で自動起動しないようにする。
＃いくつかのサイトを参照したがうまくいかず、どうやらパスが変わったらしい

```zsh
# 元の設定を確認
% defaults read org.xquartz.X11          
{
    "NSWindow Frame x11_prefs" = "372 447 484 336 0 0 1680 1025 ";
    SUHasLaunchedBefore = 1;
    SULastCheckTime = "2021-05-16 11:36:30 +0000";
    "app_to_run" = "/opt/X11/bin/xterm";
    "apps_menu" =     (
                (
            Terminal,
            xterm,
            n
        ),
                (
            xman,
            xman,
            ""
        ),
                (
            xlogo,
            xlogo,
            ""
        )
    );
    "cache_fonts" = 1;
    "done_xinit_check" = 1;
    "enable_iglx" = 0;
    "login_shell" = "/bin/sh";
    "no_auth" = 0;
    "nolisten_tcp" = 0;
    "startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
}

# 起動時に実行するアプリを空にする
% defaults write org.xquartz.X11 app_to_run ""

# 設定が反映されていることを確認
% defaults read org.xquartz.X11               
{
    "NSWindow Frame x11_prefs" = "372 447 484 336 0 0 1680 1025 ";
    SUHasLaunchedBefore = 1;
    SULastCheckTime = "2021-05-16 11:36:30 +0000";
    "app_to_run" = "";
    "apps_menu" =     (
                (
            Terminal,
            xterm,
            n
        ),
                (
            xman,
            xman,
            ""
        ),
                (
            xlogo,
            xlogo,
            ""
        )
    );
    "cache_fonts" = 1;
    "done_xinit_check" = 1;
    "enable_iglx" = 0;
    "login_shell" = "/bin/sh";
    "no_auth" = 0;
    "nolisten_tcp" = 0;
    "startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
}

```

これでXQuartzを起動しても、不要なxtermは実行されなくなった。

## 停止させたコンテナの破棄
最初のhello-worldコンテナだったり、ubuntuコンテナをexitで抜けた後、これらのコンテナは「停止」状態になっている。明示的に破棄しない限りストレージ領域を食い潰すので、以下のコマンドで破棄する。

```zsh
# コンテナを確認。statusは全てexitedになっている
% docker container ls -a
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS                           PORTS     NAMES
9c8d40b83710   ubuntu        "bash"                   6 minutes ago   Exited (127) 4 minutes ago                 compassionate_pike
c5f2445da776   ubuntu        "bash"                   3 hours ago     Exited (129) About an hour ago             elated_rosalind
5eeb98e95524   ubuntu        "bash"                   3 hours ago     Exited (0) 3 hours ago                     vigorous_carson
00945096ebc4   ubuntu        "bash"                   3 hours ago     Exited (0) 3 hours ago                     practical_feistel
1a7cf61e2203   ubuntu        "bash"                   3 hours ago     Exited (1) 3 hours ago                     youthful_galileo
f07cd430c93f   ubuntu        "bash"                   3 hours ago     Exited (100) 3 hours ago                   flamboyant_gauss
00797699839d   ubuntu        "bash"                   3 hours ago     Exited (0) 3 hours ago                     mystifying_haibt
8c43d7de8a61   ubuntu        "bash -v /Users/kamu…"   3 hours ago     Exited (127) 3 hours ago                   pensive_driscoll
d9dd49abc9a2   ubuntu        "bash -e DISPLAY=loc…"   3 hours ago     Exited (1) 3 hours ago                     sad_haslett
c87d6fa7033f   ubuntu        "bash"                   3 hours ago     Exited (127) 3 hours ago                   dazzling_dirac
211966417e8b   ubuntu        "bash"                   3 hours ago     Exited (129) 3 hours ago                   happy_kilby
25894b2736b4   ubuntu        "bash"                   4 hours ago     Exited (127) 3 hours ago                   dreamy_pike
1638b28b41bb   hello-world   "/hello"                 4 hours ago     Exited (0) 4 hours ago                     sharp_proskuriakova

# 停止中のコンテナをまとめて破棄する
% docker container prune -f
Deleted Containers:
9c8d40b83710131bb740b5ff1d47d967cbcd2630f7a3b847c85ff10239542353
c5f2445da776b9cd35b9f0e0a5ee3d2a333d27c3e6ac6d5cd8cce7151ea5e9db
5eeb98e955246b72bfc8867dbd7ac544b10b70650a664b18f5e15e4175aa751d
00945096ebc44d0c5cd0c7ef6a729db2a341f357effb88657a23659348c51627
1a7cf61e220322cff6716ee5281d52040e161a9bc9b753311c6ec6a48d45de95
f07cd430c93f8509273fe33e0dc66343d1cbd18211e0fed0dabc75005a977b5f
00797699839d80c0884efe35b957b1df4d4417d56cab044d30215b53db168990
8c43d7de8a6128a8304cf1d34f761a9327d3244a64fad267d7fb023665452c95
d9dd49abc9a29a8b1e083581c658ed92bdf173ce58977f4afc96ced2a2d7bab4
c87d6fa7033f9e547f23c64c13e24e713f5d1a407e8aa8d7631b99fbb081ef16
211966417e8bcb48dac2dd165ad2ed0693d3facd381c2df1f5f84e4eda1c82b2
25894b2736b441195b712c2e4688b8ce0a5f22e5e834b162cdec8b4c11d231ac
1638b28b41bbb9b29d5dfd2fb347bd2ace7c7f8dcbbad0c948eb1fb63282119e

Total reclaimed space: 507.7MB

# 削除されていることを確認
% docker container ls -a   
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

四苦八苦してubuntuコンテナをたくさん作ったが、それでも507MB。かなり軽い(何もパッケージ入ってないけど)。

ひとまずここまで。もう少しdockerを掘り下げて、Dockerfileの作成を行いたい。