PintOS-jungle)Soft Link

Mongle·2021년 3월 9일
0

OS프로젝트

목록 보기
8/8
post-thumbnail

메뉴얼

메뉴얼에 적혀있는대로 soft link라는 용어보다 Symbolic link라고 검색했을 때 훨씬 다양한 정보를 얻을 수 있다. 메뉴얼에는 최소한의 정보만 담겨있기 때문에 소프트 링크에 대해서 따로 공부해야 구현이 편해진다.


Hard Link
하드 링크는 두 개의 파일 이름이 아나의 inode와 같은 데이터 블럭을 가리킨다. 하드 링크의 장점은 링크와 실제 파일이 완전히 같고 링크가 파일 시스템 공간을 전혀 차지하지 않는다는데 있다.

Symbolic Link
심볼릭 링크에서 원본 파일과 링크는 전혀 별개의 파일이다. 원본 파일은 실제 데이터를 포함하고 있는 파일이고 링크는 첫번째 파일의 이름을 포함하는 포인터이다. 시스템은 링크를 열게되면 그 링크의 내용인 원래 파일의 이름을 읽게된다.
심볼릭 링크는 자신에 대한 inode는 별도로 가지고 있고 그 만큼의 파일 시스템 공간을 차지한다.

구현

struct inode_disk {
... 생략 ...
    uint32_t is_dir;
    uint32_t is_link;
};

link파일인지 확인해주는 멤버 변수를 추가한다.

int symlink(const char *target, const char *linkpath)

함수의 인자로 target 파일의 이름과 linkpath(링크의 경로)가 들어온다.

1) 먼저 linkpath를 parse_path해서 파일의 경로(link_dir)와 이름(link_name)을 파싱해준다.
2) 파일 시스템에 link_dir가 존재하는지 확인해준다. (없으면 error리턴)
+) link_dir를 열어준다.
3) inode_cluster와 inode_sector를 만들어준다. (만들 공간이 없으면 error 리턴)
4) inode에 연결된 data에 target의 이름을 write해준다.
+) link_dir를 닫아준다.

이제 filesys_open을 할 때 is_link를 확인해줘야한다. is_link가 ture일 경우에는 disk를 읽어서 disk에 쓰여진 경로를 파싱해서 연결된 파일을 찾아가서 그 파일의 inode를 가져와야한다.

profile
https://github.com/Jeongseo21

0개의 댓글