2 つの既存のファイルがあります:abcd
およびxyz
。
$ cat abcd
abcd
$ cat xyz
xyz
これらのファイルをソフトリンクしようとすると、次のメッセージが表示されます。
ln: cannot create xyz: File exists
使いたくない
ln -sf abcd xyz
xyz
コマンドを使用すると、内容が内容で上書きされるためですabcd
。
私が望むのは、リンクが解除されたら、abcd
すべての元のコンテンツを表示する必要があるということです。xyz
つまり、一時的に2つのファイルをリンクしたいのです。
ソフト/ハードリンク(例:インストールなど)以外に他のソリューションがあるかどうかを提案してください。
編集:、、、などSolaris OS
のコマンドを手動で入力せずに使用しています。mount --bind
mount -B
bindfs
fusermount
また:を試してみましたmount -o bind abcd xyz
が、次のメッセージが表示されましたcannot open /etc/vfstab
。確認してみると、私だけがアクセスできることが確認/etc/vfstab
されたRoot
。
答え1
ln
これは私たちがしなければならないことではありません。ln
既存のファイルへのハードリンクを作成します。つまり、ディスク上の同じファイルを指す複数のディレクトリエントリを作成します。リンクされたファイルがどのように機能するかは、1つのファイルを編集するとすべてのファイルに影響を与えることです。
必要な機能はUnix固有の機能ではありません(後でリンクを解除するためにファイルを1つとして表示するように接続)。 Linuxただし、バインドマウントと呼ばれる機能は(数年前)に実装され、あるファイルまたはディレクトリを別のファイルまたはディレクトリ(ファイルの上のファイル、ディレクトリの上のディレクトリ)をマウントできます。
提案されたソリューション:あるファイルが一時的に別のファイルになるようにするには、バインドマウント(mount -B file1 file2
)を使用します。このファイルfile1
はにインストールされますfile2
。後で削除すると、これら2つのファイルが元のものと同じように再表示されます。
# echo A >A
# echo B >B
# mount -B A B
# cat A
A
# cat B
A
# umount B
# cat A
A
# cat B
B
「リンクされた」ファイルを2つのファイルの関連付けとして表示するには、3番目のファイルを作成して後で削除する必要があります。
答え2
このコマンドは次のとおりです。
ln -sf abcd xyz
あなたが思うようにxyz
コンテンツとして扱われないコンテンツabcd
。シンボリックリンクはファイルではないため、内容はありません。
xyz
コンテンツを失うことなく一時的にリンクするには、abcd
コンテンツを何とか保存する必要があります。
- 内容を一時ファイルにコピーできます。これは説明が必要ないと思います。
- メモリを使用することもできます。つまり、コンテンツを変数に保存することもできます。
- ハードリンクを使用できます。
さて、最後のものをお見せしましょう。あなたの質問に記載されているとおりabcd
ですxyz
。
ハードリンクは目的の場所にコンテンツを
xyz
保持します。zyx
zyx
xyz
$ ln xyz zyx
現在、
xyz
2zyx
つのハードリンクがあります。インデックスノードxyz
あなたの質問に記載されているデータが含まれています。以下で確認できます。$ cat zyx xyz
これ
zyx
で準備ができたので、強制的xyz
に再接続できますabcd
。$ ln -sf abcd xyz
zyx
それでも文字を保持していますxyz
。以下で確認できます。$ cat zyx xyz
これで
xyz
ソフトリンクされていますabcd
。確認するには、次のコマンドを実行してください。$ cat xyz abcd
起動状態を復元するには、
xyz
元のコンテンツに再接続してください。つまり、元のinodeに再接続します。$ ln -f zyx xyz
動作していることを確認するには、次の手順を実行します。
$ cat xyz xyz
これで、以下を使用してハードリンクを切断できます
zyx
。$ rm zyx
または今後の作業のために保管してください。どちらにしても、
xyz
最初に行った操作はまだ含まれています。$ rm zyx $ cat xyz xyz
答え3
接続が解除されると、abcdとxyzの両方が元のコンテンツを表示する必要があります。
もしそうなら、あなたが望むものはリンクではありません。両方のファイルがリンクされている場合、内容は同じです。より正確には、2つのディレクトリエントリが同じファイルを指している場合はリンクされます。ファイルのリンクを解除しても、2つのファイルは残りません。ディレクトリエントリのリンクを解除するとは、ディレクトリエントリを削除することを意味します(ファイルを削除するシステムコールとも呼ばれますunlink
)。
他のファイルにファイルを隠す汎用機能はありません。あなたはそれを使用することができますファイルシステムバインディングファイルシステムは、ディレクトリを他のディレクトリとシャドウマッピングします。xyz
ディレクトリをディレクトリにシャドウマッピングするには、abcd
次の手順を実行します。
bindfs -n -o nonempty xyz abcd
その後、以前のコンテンツはabcd
非表示になり、abcd
任意の方法でアクセスできますxyz
。 Bindfsはヒューズファイルシステムの作成バインドマウント。シャドウを元に戻して元のコンテンツを表示するには、abcd
ファイルシステムをアンマウントします。
fusermount -u abcd
ファイルシステムをマウントしても、ディスクに保存されている内容は変わりません。シャドウはコンピュータに制限され、次回再起動するまで持続します。シャドウを維持するには、起動時にインストールされたリスト(/etc/fstab
)にこのインストールを追加する必要があります。ただし、シャドウを維持するには、インストールするのが正しい方法ではない可能性があります。ファイルを移動してシンボリックリンクを作成するだけです。
mv abcd abcd.orig
ln -s xyz abcd
戻るには、シンボリックリンクを削除して元のファイルに戻ります。
rm abcd
mv abcd.orig abcd
答え4
私が理解したのは、両方のファイルをリンクしたいのですが、両方のファイルのデータが失われたくないようです。投稿にSolarisというタグを付けたので、このオペレーティングシステムを使用するとします。したがって、他のオペレーティングシステムの機能を参照することは無意味に見えます。この回答では、データに 1 つ以上の zfs データセットを使用すると仮定します。
ファイルシステムのzfsスナップショットを作成し、ファイルの代わりにリンクを挿入し、ln -sf abcd xyzを作成し、必要な操作を実行した後にロールバックできます。
root@solaris:/rpool# zfs create rpool/filesystem1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file2
root@solaris:/rpool# ls -l /rpool/filesystem1
total 2
-rw------- 1 root root 1024 Jun 8 20:33 file1 .
-rw------- 1 root root 1024 Jun 8 20:33 file2
root@solaris:/rpool# zfs snapshot rpool/filesystem1@withtwofiles
root@solaris:/rpool# rm /rpool/filesystem1/file2
root@solaris:/rpool# ln -s /rpool/filesystem1/file1 /rpool/filesystem1/file1
root@solaris:/rpool# ls -l /rpool/filesystem1
total 4
-rw------- 1 root root 1024 Jun 8 20:33 file1
lrwxrwxrwx 1 root root 24 Jun 8 20:33 file2 -> /rpool/filesystem1/file1
root@solaris:/rpool# zfs rollback rpool/filesystem1@withtwofiles
root@solaris:/rpool# ls -l /rpool/filesystem1
total 6
-rw------- 1 root root 1024 Jun 8 20:33 file1
-rw------- 1 root root 1024 Jun 8 20:33 file2
root@solaris:/rpool#
リンクを解除する代わりに、リンクを使用してファイルシステムを簡単にロールバックできます。