저는 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
여기서 실제로 수행되는 작업을 더 잘 이해하고 싶습니다. 예를 들면 다음과 같습니다.
왜 CD 네비게이션이 필요합니까? 처리할 루트(컴퓨터) 폴더의 파일을 지정할 수 없나요?
왜 ln 뒤에 -s를 추가해야 합니까?
ln 명령으로 두 디렉토리를 모두 탐색했지만 둘 중 하나에서 phpmyadmin.conf를 찾을 수 없었습니다. 따라서 시스템은 해당 디렉토리가 어디에 있는지 어떻게 알 수 있습니까(시스템 전체 검색이 없다고 가정).
답변1
심볼릭 링크
자동으로 파일 이름 역참조
심볼릭 링크는 실제로 커널에 의해 특별히 처리되는 텍스트 파일이며, 그 내용은 다른 파일/디렉토리에 대한 경로입니다.
readlink
다음을 사용하여 심볼릭 링크 파일의 내용을 읽을 수 있습니다.
포인터/C++ 참조 비유
C/C++에 익숙하다면 심볼릭 링크는 대부분의 컨텍스트에서 C++ 참조 또는 자동으로 역참조된 포인터처럼 작동합니다(모두는 아님: 예를 들어 대상이 아닌 심볼릭 링크에서 직접 작동함) rm
. mv
차이점은 실제 C++ 참조는 메모리 주소에 바인딩되는 반면 기호 링크는 파일 시스템 주소에 바인딩된다는 것입니다.
매달린 심볼릭 링크
심볼릭 링크의 내용은 유효한 파일 경로 참조일 필요는 없습니다. 그러면 매달려 있는 심볼릭 링크(예: 매달린 포인터 또는 매달린 참조)가 있게 됩니다.
상대 심볼릭 링크
기호 링크의 파일 경로가 절대 경로( 로 시작 /
)가 아닌 경우 상대 파일 경로는 기호 링크 위치를 기준으로 확인됩니다(비기호 링크 컨텍스트에서는 상대 경로가 를 기준으로 확인됨 $PWD
).
-s 플래그 및 하드 링크
플래그 -s
는 "만들기에스ln
ymlinks"를 생성할 수도 있습니다 .하드 링크. 하드 링크는 파일 시스템 구현에 더 가까운 다른 수준에서 작동합니다(따라서 다른 파일 시스템 간에 하드 링크를 만들 수 없습니다).
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
동일한 물리적 파일 시스템에서 ln
다른 이름을 만듭니다 file data
( ln
파일 시스템 교차는 실패함). fileName
그 중 하나를 제거하거나 삭제할 수 fileName2
있으며 하나 이상의 이름이 남아 있는 한 계속 존재합니다 file data
.
absoluteSymlikTofileName
이름의 자동 역참조입니다 fileName
. 경로가 무언가로 해결되는 한 기호 링크는 유효합니다. 대상을 삭제하면 심볼릭 링크가 댕글링 상태가 됩니다. 이는 절대적인 심볼릭 링크이므로 유효성을 변경하지 않고도 다른 위치로 이동할 수 있습니다.
relativeSymlinkToFileName
fileName
해당 디렉토리와 동일한 디렉토리에서 호출되는 이름을 말합니다 relativeSymlinkToFileName
. 이름이 지정된 파일(또는 디렉터리)이 있는 다른 디렉터리로 이동하면 fileName
해당 디렉터리를 가리킵니다.
답변2
ln
디렉터리를 지정하지 않으면 명령은 현재 디렉터리에 기호 링크를 만듭니다. 따라서phpmyadmin.conf
을 넣을/etc/apache2/conf-enabled/
수도 있습니다.ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf
이는 거의 모든 Unix 명령의 표준 동작입니다.
이
-s
옵션은소프트 링크그리고하드 링크.여기에서 자세한 내용을 읽어보세요.나는 질문("시스템이 그것이 어디에 있는지 어떻게 알 수 있는가?")을 잘 이해하지 못합니다.
phpmyadmin.conf
현재 디렉터리에 생성됩니다(이 경우/etc/apache2/conf-enabled/
).
답변3
ln -s /etc/phpmyadmin/apache.conf phpmyadmin.conf
/etc/apache2/conf-enabled/phpmyadmin.conf
3. 이 명령은 대상이 있는 위치에 심볼릭 링크를 생성합니다 /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
심볼릭 링크는 단지 텍스트일 뿐입니다. 링크 자체는 활성 상태로 유지되며 대상이 존재하는지 여부에 관계없이 동일한 대상을 가리킵니다. 예를 들어 이동식 드라이브를 가리키는 심볼릭 링크는 드라이브 존재 여부에 관계없이 지속되거나 심볼릭 링크가 가리키는 파일을 교체할 수 있습니다(대상이 일시적으로 존재하지 않을 수 있다는 사실은 심볼릭 링크에 영향을 주지 않습니다). 협회). 대상이 존재하지 않으면 심볼릭 링크가 호출됩니다.부서진
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
plain 보다 더 일반적으로 사용되지만 plain ln
의 의미는 ln
이전 버전과의 호환성이 손상되므로 변경할 수 없습니다.
답변4
- 이 명령은 실제로 선택 사항입니다. 후속 명령의 실제 구문을 좀 더 단순
cd
하게 만듭니다 .ln
- 스위치는 스위치에 다음을 생성하도록
-s
지시합니다 .ln
상징적인하드 링크 대신 링크. 두 가지 유형의 링크 사이에는 약간의 차이가 있지만 기호 링크는 본질적으로 "찾고 있는 파일이 실제로 종료되었습니다"라고 말하는 파일 시스템의 표시라고만 말하면 충분합니다.여기." - 실제로 존재하지 않는 대상에 대한 링크를 만들 수 있습니다. 이를 종종 "고아" 링크라고 합니다.