FreeNAS 9.3 jail で bash のプロセス置換を使う

# 問題

FreeNAS の jail では、bash の[プロセス置換](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBE)の機能が使えません。

```
# cat <(find /root -type f)
cat: /dev/fd/63: No such file or directory
```

これはインストール時の最後のメッセージが関係します。

```
Message from bash-4.3.42_1:                                                     
======================================================================          
                                                                                
bash requires fdescfs(5) mounted on /dev/fd                                     
                                                                                
If you have not done it yet, please do the following:                           
                                                                                
        mount -t fdescfs fdesc /dev/fd                                          
                                                                                
To make it permanent, you need the following lines in /etc/fstab:               
                                                                                
        fdesc   /dev/fd         fdescfs         rw      0       0               
                                                                                
======================================================================     
```

こいつが曲者なんですね。jail ではこの mount を実行するとエラーになります。

```
# mount -t fdescfs fdesc /dev/fd
mount: fdesc: Operation not permitted
```

# 対応

この ```mount``` の実行に関して参考にしたページ:
[jail環境でJenkinsを動かす](http://d.zinrai.info/blog/html/2013/09/03/freebsd_jail_jenkins.html)

jail起動と終了の際に、自動的に実行する事になります。その手段は偶然見つけました。FreeNASのjailの構造を御存知の方なら常識なのだと思いますが。

ホストの ```/mnt/tank/jails``` にjailが配置されていますが、ここに ```.＜jail名＞.meta``` というディレクトリがあります。この中に色々なスクリプトがありました。

```
# pwd
/mnt/tank/jails/.bash.meta
# ls -l
total 15
-rw-r--r--  1 root  wheel   0 Apr 24 00:03 autostart
-rw-r--r--  1 root  wheel   0 Apr 24 00:03 fstab
-rw-r--r--  1 root  wheel   5 Apr 24 00:03 host
-rw-r--r--  1 root  wheel   3 Apr 24 00:03 id
-rw-r--r--  1 root  wheel   5 Apr 24 00:03 ipv4
-rw-r--r--  1 root  wheel  23 Apr 24 00:03 jail-flags
-r-xr-xr-x  1 root  wheel  61 Apr 24 00:03 jail-post-delete
-r-xr-xr-x  1 root  wheel  60 Apr 24 00:03 jail-post-start
-r-xr-xr-x  1 root  wheel  59 Apr 24 00:03 jail-post-stop
-r-xr-xr-x  1 root  wheel  60 Apr 24 00:03 jail-pre-delete
-r-xr-xr-x  1 root  wheel  59 Apr 24 00:03 jail-pre-start
-r-xr-xr-x  1 root  wheel  58 Apr 24 00:03 jail-pre-stop
-rw-r--r--  1 root  wheel   9 Apr 24 00:03 jailtype
-rw-r--r--  1 root  wheel  18 Apr 24 00:03 mac
-rw-r--r--  1 root  wheel   0 Apr 24 00:03 vnet
```

これらの中身を少し調べて、最終的にうまくいった結果がこちらです。

```
# diff -U0 jail-post-start.org jail-post-start
--- jail-post-start.org 2016-04-23 12:04:51.858708196 +0900
+++ jail-post-start     2016-04-23 23:54:27.123699907 +0900
@@ -4,0 +5,3 @@
+# 2016.04.23. added by Katz
+mount -t fdescfs fdesc /mnt/tank/jails/${JAILNAME}/dev/fd
+
# diff -U0 jail-pre-stop.org jail-pre-stop
--- jail-pre-stop.org   2016-04-23 12:04:51.857695746 +0900
+++ jail-pre-stop       2016-04-23 23:56:19.192699426 +0900
@@ -5,0 +6,3 @@
+
+# 2016.04.23. added by Katz.
+umount /mnt/tank/jails/${JAILNAME}/dev/fd
```

今度はプロセス置換がうまくいきます。

```
# cat <(find /root -type f)
/root/.bash_history
/root/.profile
/root/.cshrc
/root/.k5login
/root/.lesshst
/root/.login
/root/.history
```

やった！:+1: