モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

プロセス内でのみ有効なマウントポイントを作成する (unshare)

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2018/06/28
最終更新最終更新
2020/11/02
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    アラサーエンジニア

    0
    ステッカーを贈るとは?

    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

    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 /...
        けんちゃんけんちゃん12/1/2022に更新
        いいねアイコン画像0
      • ipコマンドの基本的な使い方
        ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
        こもれびさんこもれびさん3/8/2017に更新
        いいねアイコン画像0
      • プロセス関連のコマンド
        サムネイル画像-7b5901f600
        プロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
        kenken12/27/2021に更新
        いいねアイコン画像0
      • rpmとyumのチートシート
        サムネイル画像-f69c6665b8
        rpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
        まるたんまるたん3/2/2022に更新
        いいねアイコン画像0
      • メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識
        メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
        しおまめしおまめ9/30/2017に更新
        いいねアイコン画像0