목차
Background" >Background
가상 파일 시스템 " >가상 파일 시스템
공통 파일 모델" >공통 파일 모델
" >Dentry 객체
软链接 vs 硬链接" >软链接 vs 硬链接
文件 & 进程管理" >文件 & 进程管理
文件 & 磁盘管理" >文件 & 磁盘管理
파일 및 디스크 관리🎜" >파일 및 디스크 관리🎜
요약" >요약
인덱스 및 데이터" >인덱스 및 데이터
캐싱 전략" >캐싱 전략
왜 lsof인가?" >왜 lsof인가?
운영 및 유지보수 리눅스 운영 및 유지 관리 lsof로 시작하여 Linux 가상 파일 시스템에 대한 심층적인 이해를 얻으세요.

lsof로 시작하여 Linux 가상 파일 시스템에 대한 심층적인 이해를 얻으세요.

Aug 04, 2023 pm 04:15 PM
linux


Background

가끔 디스크 공간이 꽉 차는 경우가 있는데, 디스크의 구체적인 파일 점유를 확인해 보면 여전히 디스크에 여유 공간이 많이 남아 있는 것을 발견할 수 있습니다.
1. <code style="margin-right: 0.15em;margin-left: 0.15em;padding-right: 0.3em;padding-left: 0.3em;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;white-space: pre-wrap;border-width: 1px;border-style: solid;border-color: rgb(234, 234, 234);background-color: rgb(248, 248, 248);border-radius: 3px;display: inline;"><span style="font-size: 15px;">df</span>df 명령을 사용하여 디스크 사용량을 확인했는데 디스크가 꽉 찼음을 확인했습니다.

-bash-4.2$ df -ThFilesystem     Type      Size  Used Avail Use% Mounted on/dev/vda1      ext4       30G    30G 0         100% /devtmpfs       devtmpfs  489M     0  489M   0% /devtmpfs          tmpfs     497M     0  497M   0% /dev/shmtmpfs          tmpfs     497M   50M  447M  11% /runtmpfs          tmpfs     497M     0  497M   0% /sys/fs/cgroup
로그인 후 복사

2. du 명령을 실행하여 각 디렉토리의 디스크 사용량을 확인하고, 각 디렉토리의 파일 크기를 합산하여 디스크가 비어 있고, 공간이 10G 이상임을 확인합니다. 설명할 수 없을 정도로 누락되었습니다.


-bash-4.2$ du -h --max-depth=1 /home16M    /home/logs11G    /home/serverdog11G    /home
로그인 후 복사

🎜
3.为何会出现这样的情况呢?
因为虽然文件已被删除,但是一些进程仍然打开这些文件,因此其占用的磁盘空间并没有被释放。执行<span style="font-size: 15px;">lsof</span> 命令显示打开已删除的文件。将有问题的进程重启(或,清空),磁盘空间就会得到释放。
-bash-4.2# lsof | grep deletemysqld     2470         mysql    4u      REG              253,1           0     523577 /var/tmp/ibfTeQFn (deleted)mysqld     2470         mysql    5u      REG              253,1           0     523579 /var/tmp/ibaHcIdW (deleted)mysqld     2470         mysql    6u      REG              253,1           0     523581 /var/tmp/ibLjiALu (deleted)mysqld     2470         mysql    7u      REG              253,1           0     523585 /var/tmp/ibCFnzTB (deleted)mysqld     2470         mysql   11u      REG              253,1           0     523587 /var/tmp/ibCjuqva (deleted)
로그인 후 복사

那么,Linux 的文件系统,到底为什么这么设计呢?要了解这些,就要先弄清楚并不容易,下面将从一些基本概念入手,一步步将这些梳理清楚:
  • 什么是虚拟文件系统(VFS:virtual filesystem)?

  • 什么是通用文件模型?

    • 超级块对象(superblock object)

    • 索引节点对象(inode object)

    • 文件对象(file object)

    • 目录项对象(dentry object)

    • 文件的概念

  • 文件的表达

    • 内存表达

    • 磁盘表达

  • 目录树的构建

    • 소프트 링크와 하드 링크

  • 파일 및 디스크 관리

    • 색인 상태

  • 파일 및 프로세스 관리

    • 작업:

      열기 및 삭제

가상 파일 시스템

다음 그림은 Linux 운영 체제에서 파일 관리를 담당하는 기본 구성 요소를 보여줍니다. 위쪽이 사용자 모드, 아래쪽이 커널 모드입니다. 애플리케이션은 표준 라이브러리 libc를 사용하여 파일에 액세스하고 라이브러리는 커널 모드로 들어가기 위해 요청을 시스템 호출에 매핑합니다.

lsof로 시작하여 Linux 가상 파일 시스템에 대한 심층적인 이해를 얻으세요.

모든 파일 관련 작업의 진입점은 특정 파일 시스템(예: Ext3, ReiserFS 및 NFS)이 아닌 가상 파일 시스템(VFS)입니다. VFS는 시스템 라이브러리와 특정 파일 시스템 간의 인터페이스를 제공합니다. 따라서 VFS는 추상화 계층의 역할을 할 뿐만 아니라 실제로 다양한 구현에 의해 사용 및 확장될 수 있는 파일 시스템의 기본 구현을 제공합니다. 따라서 파일 시스템의 작동 방식을 이해하려면 먼저 VFS를 이해해야 합니다.

공통 파일 모델

VFS의 주요 아이디어는 공통 파일 모델을 도입하는 것입니다. 일반적인 파일 모델은 다음과 같은 객체 유형으로 구성됩니다.

슈퍼블록 객체

메모리: 파일 시스템이 설치될 때 생성되며, 파일 시스템에 대한 관련 정보를 저장합니다.
디스크: 슈퍼블록에 저장된 정보에 해당합니다. disk 파일 시스템 제어 블록(filesystem control block)

Inode 객체(inode 객체)

Memory : 접근 시 생성, 특정 파일에 대한 일반 정보를 저장(inode 结构)
Disk : 디스크의 저장소에 해당 파일 제어
각 inode 객체에는 파일 시스템의 파일을 고유하게 식별하는 inode 번호가 있습니다

파일 객체(file object)

Memory: 파일이 열릴 때 생성되며, 열린 파일과 프로세스 간의 상호 작용에 대한 정보를 저장합니다(파일 구조< /code >) <code style="margin-right: 0.15em;margin-left: 0.15em;padding-right: 0.3em;padding-left: 0.3em;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;white-space: pre-wrap;border-width: 1px;border-style: solid;border-color: rgb(234, 234, 234);background-color: rgb(248, 248, 248);border-radius: 3px;display: inline;">file 结构
打开文件信息,仅当进程访问文件期间存在于内核内存中。

目录项对象(dentry object)

内存:目录项一旦被读入内存,VFS就会将其转换成dentry 结构열린 파일 정보는 프로세스가 파일에 접근하는 동안에만 커널 메모리에 존재합니다.

Dentry 객체

Memory: 디렉토리 항목이 메모리로 읽혀지면 VFS는 이를 덴트리 구조 디렉토리 항목 개체 디스크: 특정 파일 시스템은 특정 방식으로 디스크에 저장됩니다.

디렉토리 항목(예: 파일 이름)과 해당 파일 사이의 링크에 대한 정보를 저장합니다. 🎜🎜🎜🎜 디렉토리 트리 🎜🎜🎜🎜 요약하자면, Linux의 루트 파일 시스템은 (시스템의 루트 파일 시스템)은 커널이 마운트를 시작하는 첫 번째 파일 시스템입니다. 커널 코드 이미지 파일은 루트 파일 시스템에 저장되며 시스템 부팅 프로그램은 루트 파일 시스템이 마운트된 후 실행하기 위해 일부 기본 초기화 스크립트와 서비스를 메모리에 로드합니다(파일 시스템과 커널은 두 부분으로 완전히 독립적입니다). ). 이후 다른 파일 시스템은 스크립트나 명령을 통해 파일 시스템이 설치된 디렉토리에 하위 파일 시스템으로 설치되어 결국 전체 디렉토리 트리를 형성합니다. 🎜🎜
start_kernel   vfs_caches_init     mnt_init       init_rootfs     // 注册rootfs文件系统      init_mount_tree // 挂载rootfs文件系统   …   rest_init   kernel_thread(kernel_init, NULL, CLONE_FS);
로그인 후 복사

就单个文件系统而言,在文件系统安装时,创建超级块对象;沿树查找文件时,总是首先从初识目录的中查找匹配的目录项,以便获取相应的索引节点,然后读取索引节点的目录文件,转化为dentry对象,再检查匹配的目录项,反复执行以上过程,直至找到对应的文件的索引节点,并创建索引节点对象。

软链接 vs 硬链接

软链接是一个普通的文件,其中存放的是另外一个文件的路径名。硬链接则指向同一个索引节点,硬链接数记录在索引节点对象的 i_nlink 字段。当<span style="font-size: 15px;color: rgb(68, 68, 68);">i_nlink</span>字段为零时,说明没有硬链接指向该文件。

文件 & 进程管理

下图是一个简单示例,说明进程是怎样与文件进行交互。三个不同进程打开同一个文件,每个进程都有自己的文件对象,其中两个进程使用同一个硬链接(每个硬链接对应一个目录对象),两个目录项对象都指向同一个 索引节点对象。

lsof로 시작하여 Linux 가상 파일 시스템에 대한 심층적인 이해를 얻으세요.

索引节点的数据又由两部分组成:内存数据和磁盘数据。Linux 使用 Write back 作为索引节点的数据一致性策略。对于索引节点的数据,当文件被打开时,才会加载索引节点到内存;当不再被进程使用,则从内存踢出;如果中间有更新,则需要把数据写回磁盘。
*  "in_use" - valid inode, i_count > 0, i_nlink > 0*  "dirty"  - as "in_use" but also dirty*  "unused" - valid inode, i_count = 0
로그인 후 복사

인덱스 노드가 아직 사용 중인지 여부는 <code style="margin-right: 0.15em;margin-left: 0.15em;padding-right: 0.3em;padding-left: 0.3em;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;white-space: pre-wrap;border-width: 1px;border-style: solid;border-color: rgb(234, 234, 234);background-color: rgb(248, 248, 248);border-radius: 3px;display: inline;"><span style="font-size: 15px;">open()</span><span style="font-size: 15px;">close()</span> 操作建立和销毁文件对象,文件对象通过索引节点提供的 <span style="font-size: 15px;">iget</span><span style="font-size: 15px;">iput</span> 更新索引节点的i_count字段,以完成使用计数。open 操作使得 i_count 加一, close 操作使得 i_count 减一。在 close 操作时判断索引节点是否释放,如果 i_count = 0,则意味着不再有进程引用,将会从内存释放。

文件 & 磁盘管理

文件与磁盘管理联系最紧密的操作,莫过于<span style="font-size: 15px;">touch</span><span style="font-size: 15px;">rm</span>open()

🎜close( )🎜 🎜 작업은 파일 개체를 생성하고 삭제합니다. 파일 개체는 인덱스 노드 🎜🎜iget🎜🎜 및 🎜 🎜iput🎜🎜 인덱스 노드의 i_count 필드를 업데이트하여 사용 횟수를 완료합니다. open 연산은 i_count를 1만큼 증가시키고, close 연산은 i_count를 1만큼 감소시킵니다. 닫기 작업 중에 인덱스 노드가 해제되는지 확인합니다. i_count = 0이면 더 이상 프로세스 참조가 없으며 메모리에서 해제된다는 의미입니다. 🎜🎜

파일 및 디스크 관리🎜

🎜파일 디스크 관리와 가장 밀접하게 관련된 작업은 🎜🎜touch🎜🎜 및 🎜🎜rm🎜🎜 작업, 특히 후자가 가장 중요합니다. strace(또는 dtruss)를 사용하여 rm🎜🎜의 실제 시스템 호출을 확인하세요.

# dtruss rm tmp...geteuid(0x0, 0x0, 0x0)         = 0 0ioctl(0x0, 0x4004667A, 0x7FFEE06F09C4)         = 0 0lstat64("tmp\0", 0x7FFEE06F0968, 0x0)         = 0 0access("tmp\0", 0x2, 0x0)         = 0 0unlink("tmp\0", 0x0, 0x0)         = 0 0
로그인 후 복사

可以发现 rm 实际是通过 unlink 完成的。unlink代表删除目录项,以及减少其索引节点的计数。由通用文件模型可知,父目录本身同样是一个文件,也就意味着目录项是其文件数据的一部分。删除目录项等价于从父目录的文件中删除数据,也就意味着首先要打开父目录的文件。那么,删除操作即可理解为:

  1. 删除命令(一个进程)使用 open 操作获得父目录文件对象

  2. 通过 <span style="font-size: 15px;color: rgb(68, 68, 68);">iget</span> 增加 目录文件的索引节点对象计数

  3. 读取目录文件数据

  • 将目录文件数据转化为目录项对象

  • 由于目录项包含文件的索引节点,类似的,需要通过 iget 增加文件的索引节点对象计数

  • 删除目录的目录项

  • 减少文件索引节点对象的硬链接计数i_nlink

  • 通过 <span style="font-size: 15px;color: rgb(68, 68, 68);">iput</span> 结束对文件索引节点对象的操作,使用计数 i_count 减一

    • 判断i_count是否为零,如果为零,则释放内存

    • 然后,判断i_nlink是否为零,如果为零,则释放磁盘空间

  • 通过 iput 结束对目录索引节点对象的操作。

  • 요약

    발생한 문제를 되돌아보면 실제로 두 가지 관점에서 이해할 수 있습니다.

    인덱스 및 데이터

    파일 시스템 및 파일, 디스크 관리 및 파일, 프로세스 관리 및 파일 핵심은 파일의 데이터가 아니라 파일의 인덱스입니다. 데이터와 인덱스를 분리하는 것은 파일 시스템을 이해하는 데 중요합니다.


    lsof로 시작하여 Linux 가상 파일 시스템에 대한 심층적인 이해를 얻으세요.

    캐싱 전략

    운영 체제는 Write back 전략을 사용하므로 메모리가 먼저 해제되어야만 디스크가 해제될 수 있다는 의미입니다.

    왜 lsof인가?

    디렉토리는 더 이상 파일에 대해 인덱싱되지 않지만 파일을 열 때 파일은 여전히 ​​인덱싱되어 있으므로 디스크 공간을 즉시 해제할 수 없기 때문에 위 모델에서 명확하게 이해할 수 있습니다. .
    lsof가 삭제된 파일과 출시되지 않은 파일을 찾을 수 있는 이유는 무엇입니까?
    lsof, 이름에서 알 수 있듯이: list open files, 이 명령의 원리는 열려 있는 파일 목록을 찾는 것이므로 삭제되었지만 해제되지 않은 파일을 찾을 수 있습니다.

위 내용은 lsof로 시작하여 Linux 가상 파일 시스템에 대한 심층적인 이해를 얻으세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux는 실제로 좋은 것은 무엇입니까? Linux는 실제로 좋은 것은 무엇입니까? Apr 12, 2025 am 12:20 AM

Linux는 서버, 개발 환경 및 임베디드 시스템에 적합합니다. 1. 서버 운영 체제로서 Linux는 안정적이고 효율적이며 종종 고 대전성 애플리케이션을 배포하는 데 사용됩니다. 2. 개발 환경으로서 Linux는 효율적인 명령 줄 도구 및 패키지 관리 시스템을 제공하여 개발 효율성을 향상시킵니다. 3. 임베디드 시스템에서 Linux는 가볍고 사용자 정의 가능하며 자원이 제한된 환경에 적합합니다.

Linux와 함께 Docker 사용 : 포괄적 인 가이드 Linux와 함께 Docker 사용 : 포괄적 인 가이드 Apr 12, 2025 am 12:07 AM

Linux에서 Docker를 사용하면 개발 및 배포 효율성을 향상시킬 수 있습니다. 1. Docker 설치 : 스크립트를 사용하여 Ubuntu에 Docker를 설치하십시오. 2. 설치 확인 : Sudodockerrunhello-World를 실행하십시오. 3. 기본 사용 : Nginx 컨테이너 생성 Dockerrun-Namemy-Nginx-P8080 : 80-Dnginx. 4. 고급 사용 : DockerFile을 사용하여 사용자 정의 이미지를 만들고 빌드 및 실행하십시오. 5. 최적화 및 모범 사례 : 다단계 빌드 및 dockercompose를 사용하여 Dockerfiles를 작성하기위한 모범 사례를 따르십시오.

Apache80 포트가 점유 된 경우해야 할 일 Apache80 포트가 점유 된 경우해야 할 일 Apr 13, 2025 pm 01:24 PM

Apache 80 포트가 점유되면 솔루션은 다음과 같습니다. 포트를 차지하고 닫는 프로세스를 찾으십시오. 방화벽 설정을 확인하여 Apache가 차단되지 않았는지 확인하십시오. 위의 방법이 작동하지 않으면 Apache를 재구성하여 다른 포트를 사용하십시오. Apache 서비스를 다시 시작하십시오.

아파치를 시작하는 방법 아파치를 시작하는 방법 Apr 13, 2025 pm 01:06 PM

Apache를 시작하는 단계는 다음과 같습니다. Apache 설치 (명령 : Sudo apt-get Apache2를 설치하거나 공식 웹 사이트에서 다운로드) 시작 apache (linux : sudo systemctl start : windes (선택 사항, Linux : Sudo SystemCtl

Oracle 모니터링을 시작하는 방법 Oracle 모니터링을 시작하는 방법 Apr 12, 2025 am 06:00 AM

Oracle 청취자를 시작하는 단계는 다음과 같습니다. Windows의 리스너 상태 (LSNRCTL 상태 명령 사용)를 확인하고 Linux 및 UNIX의 Oracle Services Manager에서 "TNS 리스너"서비스를 시작하고 LSNRCTL 시작 명령을 사용하여 리스너가 LSNRCTL 명령을 사용하여 리스너가 시작되었음을 확인하십시오.

데비안에서 nginx ssl 성능을 모니터링하는 방법 데비안에서 nginx ssl 성능을 모니터링하는 방법 Apr 12, 2025 pm 10:18 PM

이 기사에서는 데비안 시스템에서 NGINX 서버의 SSL 성능을 효과적으로 모니터링하는 방법에 대해 설명합니다. NginxOxporter를 사용하여 Nginx 상태 데이터를 프로 메테우스로 내보낸 다음 Grafana를 통해 시각적으로 표시합니다. 1 단계 : nginx 구성 먼저 Nginx 구성 파일에서 stub_status 모듈을 활성화하여 nginx의 상태 정보를 얻어야합니다. nginx 구성 파일에 다음 스 니펫을 추가하십시오 (일반적으로 /etc/nginx/nginx.conf에 있거나 포함 파일에 위치) : location/nginx_status {stub_status

데비안 시스템에서 재활용 빈을 설정하는 방법 데비안 시스템에서 재활용 빈을 설정하는 방법 Apr 12, 2025 pm 10:51 PM

이 기사는 데비안 시스템에서 재활용 빈을 구성하는 두 가지 방법 인 그래픽 인터페이스와 명령 줄을 소개합니다. 방법 1 : Nautilus 그래픽 인터페이스를 사용하여 파일 관리자를 엽니 다. 데스크탑 또는 응용 프로그램 메뉴에서 Nautilus 파일 관리자 (일반적으로 "파일")를 찾아 시작하십시오. Recycle Bin 찾기 : 왼쪽 탐색 표시 줄에서 재활용 빈 폴더를 찾으십시오. 찾을 수없는 경우 검색하려면 "기타 위치"또는 "컴퓨터"를 클릭하십시오. 재활용 빈 속성을 구성하십시오 : "Recycle Bin"을 마우스 오른쪽 버튼으로 클릭하고 "속성"을 선택하십시오. 속성 창에서 다음 설정을 조정할 수 있습니다. 최대 크기 : 재활용 빈에서 사용 가능한 디스크 공간을 제한하십시오. 유지 시간 : 재활용 쓰레기통에서 파일이 자동으로 삭제되기 전에 보존을 설정합니다.

오라클 리스너를 시작하는 방법 오라클 리스너를 시작하는 방법 Apr 11, 2025 pm 10:54 PM

오라클 리스너를 시작하는 방법? 리스너 상태를 확인하십시오 : lsnrctl 명령을 사용하십시오. 리스너 시작 : lsnrctl 명령을 사용하십시오. 리스너 상태 확인 : lsnrctl 명령을 다시 사용하십시오.

See all articles