web-dev-qa-db-ja.com

から作られたシンボリックリンクとは何ですか?シンボリックリンクの構造を理解する

私はUbuntu 15.10を使用していますが、Linuxは非常に新しいです。ウィキペディアを読んだ後 一般にシンボリックリンクとは で、Ubuntu Unix-bashターミナルでシンボリックリンク作成コマンドを実行した後、私は何度か作業したシンボリックリンクの構造をよりよく理解する必要がありますUbuntu学習環境の作成(および「破棄」)。

PHPmyadmin(PMA)サービスをインストールするたびに実行する短い構文があります。それを実行しないと、サービスは機能しませんでした。私が収集した情報から、この次の構文は、Apacheをconfの指示を含む特定のPMAファイルに接続するシンボリックリンクを作成します。

これは私が毎回実行した構文です:

cd /etc/Apache2/conf-enabled/
Sudo ln -s /etc/phpmyadmin/Apache.conf phpmyadmin.conf
service Apache2 restart

ここで実際に行われていることをよりよく理解したいと思います。たとえば、

  1. なぜCDナビゲーションが必要なのですか?ルート(コンピューター)フォルダーから作業するファイルを指定できませんでしたか?

  2. Lnの後に-sがあるのはなぜですか?

  3. 私はlnコマンドで両方のディレクトリに移動しましたが、どちらにもphpmyadmin.confを見つけることができませんでした-それで、システムはそれがどこにあるかをどのようにして知ることができます(システム全体の検索がないと仮定します)。

6
user149572
  1. lnコマンドは、ディレクトリが指定されていない場合、現在のディレクトリにシンボリックリンクを作成します。したがって、phpmyadmin.conf/etc/Apache2/conf-enabled/。あなたもできたでしょう

    ln -s /etc/phpmyadmin/Apache.conf /etc/Apache2/conf-enabled/phpmyadmin.conf
    

    これは、ほとんどすべてのUnixコマンドの標準的な動作です。

  2. -sオプションは、ハードリンクではなく、ソフトリンクを作成することを指定します。 詳細はこちら

  3. 私は質問を完全に理解していません(「システムはそれがどこにあるかをどのようにして知ることができますか?」)。 phpmyadmin.confが現在のディレクトリに作成されます(この場合は/etc/Apache2/conf-enabled/)。

6
gardenhead

シンボリックリンク

ファイル名への自動逆参照

シンボリックリンクは文字通り、カーネルによって特別に扱われるテキストファイルであり、その内容は別のファイル/ディレクトリへのパスです。

readlinkを使用してシンボリックリンクファイルの内容を読み取ることができます。シンボリックリンクファイルを標準で開くと、システムはシンボリックリンクの内容によって参照されるファイル/ディレクトリを開きます。

ポインター/ C++リファレンスの類推

C/C++に精通している場合、シンボリックリンクはほとんどのコンテキストでC++参照または自動逆参照されたポインターのように動作します(すべてではありません:たとえば、rmまたはmvはシンボリックリンクで直接動作します) 、ターゲット上ではありません)。違いは、実際のC++参照はメモリアドレスにバインドするのに対し、シンボリックリンクはファイルシステムアドレスにバインドすることです。

ぶら下がりシンボリックリンク

シンボリックリンクの内容は、有効なファイルパス参照である必要はありません->ぶら下がりシンボリックリンク(ダングリポインターやダングリング参照など)があります。

相対シンボリックリンク

シンボリックリンクのファイルパスが絶対パスでない場合(/で始まる)、相対ファイルパスはシンボリックリンクの場所に対して相対的に解決されます(非シンボリックコンテキストでは、相対パスは$PWDに対して相対的に解決されます)。


-sフラグとハードリンク

-sフラグは「create s ymlinks」用です。 lnhardlinksも作成できます。ハードリンクは、ファイルシステムの実装に近い別のレベルで動作します(そのため、異なるファイルシステム間でハードリンクを作成することはできません)。

Unixファイルシステムはファイル名(/ディレクトリ名)とファイルの内容(ディレクトリの内容)を別々に保存し、名前はそれらの内容への自動逆参照された参照カウントされたポインタです。ハードリンクは、参照カウントを増やしながら、同じコンテンツに別の名前を作成します。

$ echo 'the contents' > f1
$ ls -l f1 
  * 1 * #the 2nd column is the reference count
$ ln f1 f2 #create another name for the contents of f1
$ ls -l f1
   * 2 * #the contents of f1 has two named references to it
$ rm f1  #the contents of f1 lives on (in f2) #
         # because rm only removes the reference to the data block
         #and this isn't the only reference
         #(rm ivokes a system call literally named `unlink`)

ディレクトリのハードリンク

ディレクトリハードリンクを作成することはできませんが、...は暗黙的に作成されるディレクトリハードリンクです。したがって、ディレクトリのハードリンク数は、サブディレクトリの数を反映しています(各サブディレクトリには、親への..ハードリンクが付属しています)。


シンボリックリンクとハードリンク—全体像の概要:

echo 'file data' > fileName 
ln fileName fileName2 #hardlink
ln -s "$PWD/fileName" absoluteSymlinkTofileName 
ln -s fileName relativeSymlinkTofileName 

同じ物理ファイルシステムで、lnfile dataの別の名前を作成します(lnはファイルシステム全体で失敗します)。 fileNameまたはfileName2のいずれかを削除できます。少なくとも1つの名前が残っている限り、file dataは存続します。

absoluteSymlikTofileNameは、fileName名への自動逆参照です。そのパスが何かに解決される限り、シンボリックリンクは有効です。ターゲットを削除すると、シンボリックリンクがぶら下がります。これは絶対的なシンボリックリンクなので、有効性を変更せずに他の場所に移動できます。

relativeSymlinkToFileNameは、fileNameのディレクトリと同じディレクトリにあるrelativeSymlinkToFileNameという名前を指します。 fileNameという名前のファイル(またはディレクトリ)が存在する別のディレクトリに移動すると、代わりにそのファイルがポイントされます。

7
PSkocik
ln -s /etc/phpmyadmin/Apache.conf phpmyadmin.conf

3.このコマンドは、場所/etc/Apache2/conf-enabled/phpmyadmin.confにシンボリックリンクを作成します。ターゲットは/etc/phpmyadmin/Apache.confです。この後、ファイル/etc/Apache2/conf-enabled/phpmyadmin.confを開くことは、/etc/phpmyadmin/Apache.confを開くことと同じです。 /etc/phpmyadmin/Apache.confが存在する場合、/etc/Apache2/conf-enabled/phpmyadmin.confの内容は同じです。 /etc/phpmyadmin/Apache.confが存在しない場合、/etc/Apache2/conf-enabled/phpmyadmin.confが存在しない場合と同様に、/etc/Apache2/conf-enabled/phpmyadmin.confを開くことができません。

シンボリックリンクは単なるテキストです。リンク自体は存在し続け、そのターゲットが存在するかどうかにかかわらず、同じターゲットを指します。これにより、たとえば、リムーバブルドライブへのシンボリックリンクを使用して、ドライブが存在するかどうかにかかわらず既存の状態を維持できます。リンク)。ターゲットが存在しない場合、シンボリックリンクはbrokenと呼ばれます

1.リンクは、現在のディレクトリを変更せずに作成された可能性があります。もちろん、コマンドを変更して、目的のリンクへのフルパスを含める必要があります。

ln -s /etc/phpmyadmin/Apache.conf /etc/Apache2/conf-enabled/phpmyadmin.conf

シンボリックリンクが絶対パスである場合(つまり、そのターゲットが絶対パスである場合)、リンクを作成する前にディレクトリに変更しても意味がありません。シンボリックリンクが相対である場合、ln -sの最初の引数がリンクのターゲットであり、lnの時点の現在のディレクトリではなく、リンクの場所に相対的に解釈されるため、利点があります。コマンドが実行されます。たとえば、次のように相対リンクを作成できます。

ln -s ../../phpmyadmin/Apache.conf /etc/Apache2/conf-enabled/phpmyadmin.conf

ただし、現在のディレクトリが/etc/Apache2ではない場合、一般に../..//etcではないため、../../phpmyadmin/Apache.confは既存のターゲットではありません。たとえば、それはシェルの完了によってピックアップされません。

2. lnコマンドは、シンボリックリンクの前に存在していました。元々は ハードリンク を作成しましたが、使用例は非常に狭く、あまり使用されていません。 ln -sは単純なlnよりも頻繁に使用されますが、単純なlnの意味を変更することはできません。下位互換性が失われるためです。

任意のオペレーティングシステム上のfilesystemは、ディスク(または固定サイズの「ブロック」に分割されていると見なすことができる他のいくつかのメディア)に存在する単なるデータ構造です。つまり、そのようなブロックに、ファイルの命名方法、おそらく所有者や権限などの他のデータ、およびその内容がディスク上のどこにあるかを記録する方法です。

Unix/Linuxファイルシステムでは、ファイルは、サイズ、所有者、グループ、権限に関する情報を含むブロック、および(本質的に)実際のデータを含むブロックのリストによって表されます。従来のファイルシステムには、そのようなiノードが一定数含まれており、ディスクの一部が予約されています。彼らはちょうど0から上に番号が付けられます。ファイルシステムのdirectoryは、ペア(filenaname、inode番号)のリストを含むファイルとして実装されます。

この構造では、同じファイルを異なる名前で数回表示できます(inodeは参照の数を記録します)。 「ファイルを削除する」とは、ディレクトリ内のエントリを何らかの理由で未使用としてマークし、iノード内の参照数を減らすことです。参照カウントがゼロになると、ファイルによって使用されるスペース(inode、データに使用されるブロック、およびデータブロックへのポインター)を再利用できます。 「ファイル名の変更」はディレクトリ内のエントリを変更し、「ファイルの移動」は1つのディレクトリエントリを削除して別のエントリを作成するだけです。

ファイルへの「ハードリンク」(ln old new)を作成するには、ǹewの下にoldと同じiノード番号を記録するだけです。この操作の後、両方のディレクトリエントリは完全に等価になることに注意してください。また、これは同じファイルシステム、つまり同じディスク内でのみ機能することにも注意してください。この制限を克服するために、発明されたシンボリックリンク。シンボリックリンクは基本的に、リンク先のエンティティのnameを含む小さなファイルです。これはln -s old newによって作成されます。 oldが消え、newが古いリンクとして残ることに注意してください。

上記は少し簡略化されており、一部の最新のファイルシステムは異なる構造になっています。ただし、ファイルとディレクトリの動作はUnixには根づきすぎて変更できないため(多くの場合)、記述されているように構造化されているかのように動作する必要があります。

2
vonbrand
  1. cdコマンドは実際にはオプションです。後続のlnコマンドの実際の構文が少し単純になるだけです。
  2. -slnのスイッチは、ハードリンクではなくsymbolicリンクを作成するように指示します。 2つのタイプのリンクの間にはいくつかの違いがありますが、シンボリックリンクは基本的にファイルシステム上のマーカーであり、「探しているファイルは実際にはhere。」であることを示しています。
  3. 実際には存在しないターゲットへのリンクを作成できます。これはしばしば「孤立した」リンクと呼ばれます。
1
DopeGhoti