プロセス内でのみ有効なマウントポイントを作成する (unshare)
[History] [Last Modified] (2018/06/28 09:24:18)
Recent posts
Qoosky について
プログラミング情報を投稿、有料販売するためのサービスをご利用いただけます。詳細は こちら をご参照ください。
Popular pages

概要

unshare コマンドを用いると、プロセス内でのみ有効なマウントポイントを作成できます。内部的には unshare システムコールが発行されます。

  • unshare コマンド → man 1 unshare
  • unshare システムコール → man 2 unshare

動作の理解

事前準備

ディレクトリだけでなくファイルも mount できます。

touch ./file1.txt
touch ./file2.txt

unshare なし

別プロセスのターミナル2 にもマウントポイントが共有されます。

ターミナル1

$ sudo /bin/bash
# mount --bind ./file1.txt ./file2.txt
# mount | wc -l  →ターミナル2(別プロセス)と同じ値
# umount ./file2.txt

ターミナル2

$ mount | wc -l  →ターミナル1(別プロセス)と同じ値

unshare -m

別プロセスのターミナル2 にはマウントポイントが共有されません。

ターミナル1

$ sudo unshare -m /bin/bash
# mount --bind ./file1.txt ./file2.txt
# mount | wc -l  →ターミナル2(別プロセス)の値 +1
# umount ./file2.txt

ターミナル2

$ mount | wc -l  →ターミナル1(別プロセス)の値 -1

利用例

I/O ポート /dev/port を利用する、run_myprog というプログラムがあるとします。別ファイルを作成して、これを /dev/port にマウントすることで、実際の I/O ポートとは別の状態をもとにプログラムを実行できます。これをホストPC には影響を与えずに行うためには unshare が利用できます。

main.bash

#!/bin/bash

if [ "${AFTER_UNSHARED}" = "" ]; then
    export AFTER_UNSHARED="1"
    unshare -m $0 $@
    exit $?
fi

if [ "${AFTER_UNSHARED}" = "1" ]; then

    dd if=/dev/zero of=/dev/shm/myport bs=16K count=1  # shm; shared memory
    chmod a+rw /dev/shm/myport
    mount --bind /dev/shm/myport /dev/port

    # ここで /dev/port を利用した何らかの処理を行います。
    # ./run_myprog
    file /dev/port
    sleep 10

    umount /dev/port
    rm /dev/shm/myport
    exit $?
fi

実行例

$ file /dev/port
/dev/port: character special (1/4)
$ chmod a+x ./main.bash
$ sudo ./main.bash
/dev/port: data  ←/dev/port に単なるファイルがマウントされています。
Related pages
    概要 Docker オーケストレーションツールの一つに Kubernetes (k8s) があります。k8s 実行環境の構築方法は複数ありますが、ここでは AWS や GCP 等のクラウドサービスを利用せず、Debian9 がインストールされた複数台の物理マシンがネットワーク内に存在する状況を考えます。これら複数の Debian9 上に k8s クラスタを立ち上げるためには
    バイナリファイルから文字列を抽出する (strings) 文字列らしい部分をバイナリファイルから抽出して出力するコマンドです。得体の知れないコマンドのオプションを調べたり strings /usr/bin/gcc | grep ^-- --help --target-help --sysroot= --all-warnings --ansi --assemble --assert --cla