운영체제 기본/Linux의 파일시스템/VFS와 파일 객체: 두 판 사이의 차이
VFS의 경로·dentry·inode·열린 파일과 ext4/procfs 연산 연결 설명 |
경로 탐색 예시를 총론과 같은 /home/ldmsys/a.txt로 통일 |
||
| 11번째 줄: | 11번째 줄: | ||
== 경로에서 파일 객체의 대상을 찾는다 == | == 경로에서 파일 객체의 대상을 찾는다 == | ||
<code>/home/ | <code>/home/ldmsys/a.txt</code>를 열려면 커널은 경로의 구성 요소를 차례로 해석해야 한다. 이때 <code>dentry</code>는 부모 디렉터리 아래의 이름과 대상을 연결하는 메모리 객체다. 이미 캐시된 연결을 사용할 수 없다면 해당 디렉터리의 <code>inode->i_op->lookup()</code> 같은 파일시스템 연산으로 대상을 확인한다. 찾아낸 <code>inode</code>는 파일의 종류, 권한 등과 연산 정보를 담는 객체이며, 파일 이름 자체와는 구분된다. 여러 이름이 같은 inode를 가리킬 수도 있다.<ref name="vfs-overview"/><ref name="vfs-namei">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/namei.c?h=v6.12 Linux v6.12, fs/namei.c], lookup_fast(), __lookup_slow(), step_into(), handle_mounts().</ref> | ||
경로 탐색에는 dentry만 아니라 마운트 정보도 필요하다. 예를 들어 <code>/proc</code>에 procfs가 마운트되어 있으면 그 지점을 지나면서 탐색 대상 파일시스템이 바뀐다. 그래서 커널의 <code>struct path</code>는 마운트와 dentry를 함께 가리킨다. <code>super_block</code>은 이 과정에서 만나는 파일시스템 인스턴스의 공통 상태를 나타내며, inode도 자신이 속한 super_block을 참조한다. 하나의 경로 공간에 연결된다는 것은 모든 경로가 같은 디스크나 같은 파일시스템에 속한다는 뜻이 아니다.<ref name="vfs-namei"/><ref name="vfs-fs-h">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/fs.h?h=v6.12 Linux v6.12, include/linux/fs.h], struct inode, struct file, struct super_block.</ref> | 경로 탐색에는 dentry만 아니라 마운트 정보도 필요하다. 예를 들어 <code>/proc</code>에 procfs가 마운트되어 있으면 그 지점을 지나면서 탐색 대상 파일시스템이 바뀐다. 그래서 커널의 <code>struct path</code>는 마운트와 dentry를 함께 가리킨다. <code>super_block</code>은 이 과정에서 만나는 파일시스템 인스턴스의 공통 상태를 나타내며, inode도 자신이 속한 super_block을 참조한다. 하나의 경로 공간에 연결된다는 것은 모든 경로가 같은 디스크나 같은 파일시스템에 속한다는 뜻이 아니다.<ref name="vfs-namei"/><ref name="vfs-fs-h">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/fs.h?h=v6.12 Linux v6.12, include/linux/fs.h], struct inode, struct file, struct super_block.</ref> | ||