/dev/sda1
ルートにパーティションがマウントされていてルートにパーティションがマウントされている場合は、/
まずマウントを解除せずにそのパーティションの元の内容にアクセスする方法はありますか?/dev/sdb1
/var
/var
sda1
sdb1
答え1
Linuxでは、バインドマウントを使用してファイル階層の一部を別の場所に再マウントできます。たとえば、次のようにできます。
# mkdir /mnt/bindroot
# mount --bind / /mnt/bindroot
この時点では、/mnt/bindroot
ルートファイルシステムの内容が含まれますが、さまざまなディレクトリに他のファイルシステムはマウントされません。
# ls /home
user1 lost+found
# ls /mnt/bindroot/home
<whatever was in /home before a filesystem was mounted over it>
FreeBSDの場合は、nullfs
マウントを使用して同様の操作を実行できますmount_nullfs
。を参照してください。
答え2
Linuxでは、chdirまたはデフォルトのディレクトリを開いて(マウントによって隠される前に)、単に待機するプロセスがあれば、バインドマウントとルート権限なしでこれを行うことができます。その後、他のプロセスはまたはを介して/proc/<pid>/cwd
ディレクトリにアクセスできます/proc/<pid>/fd/<dir_fd>
。
chdir 例:
# mkdir dir; touch dir/file # create a sample dir and file
# (cd dir; while sleep 3600; do :; done) & # start a bg process with its pwd being dir
[1] 3734
# mount -t tmpfs tmpfs dir # mount a tmpfs over dir which will hide its previous content
# ls dir
# ls /proc/3734/cwd # you can still access the old dir via /proc/<pid>/cwd
file
ディレクトリを開く例:
# mkdir -p dir1; touch dir1/file
# exec 9<dir1
# mount -t tmpfs tmpfs dir1
# ls dir1
# ls /proc/self/fd/9
file
後でマウントされたディレクトリを使用してこれを行うには、専用の名前空間を作成し、名前空間内のディレクトリをアンマウントするだけです。
この場合、/proc/<pid>/root/<path_to_dir>
ファイルを開いたりパスを指定せずに外部からアクセスすることもできます。
mkdir -p dir; touch dir/file
mount -t tmpfs tmpfs dir
unshare -m sh -c 'umount dir; while sleep 1000; do :; done' &
sleep .1
ls "/proc/$!/root/$PWD/dir" # will show 'file'
/proc/<pid>/root
マンページで追加の魔法の詳細を読むことができますproc(5)
。プロセスが終了した後でも、他の場所にバインドマウントして、/proc/<pid>/ns/mnt
プロセスの名前空間をアクティブに保つことができます。その後、再入力を使用できますnsenter(1)
。
答え3
注:レビューを見逃した人のために。
sudo mount --bind original_location backup_link
動作します。oldlocation
何かをインストールし、その上に影をインストールした後、下の場所にアクセスできます。
しかし、
sudo mount --bind
走らなければならないことに気づいた後ろにmount something original_location
、事前ではありません。- シャドウがマウントされてから、1つのシャドウよりも高いディレクトリをマウントする必要があります。
sudo mount --bind parent_of_original_location backup_link