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 に単なるファイルがマウントされています。
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- 使い所が難しいマイナーな運用コマンドコマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin /...
- ipコマンドの基本的な使い方ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
- プロセス関連のコマンドプロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
- rpmとyumのチートシートrpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
- メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...