Linux一切皆文件,如果你没做到这一步,那这就是句话而已

前言

相信当你接触Linux的时候,身边的人就向你灌输一个概念,或者说你就总是听到一句话:Linux系统中一切皆文件

Linux下“一切皆文件”是Unix/Linux的基本哲学之一。不信,看下面这张图

普通文件、目录、字符设备、块设备和网络设备(套接字)等在Unix/Linux都被当做文件来对待。虽然他们的类型不同,但是linux系统为它们提供了一套统一的操作接口。

Linux的一切皆文件是指,Linux世界中的所有、任意、一切东西都可以通过文件的方式访问、管理。

反过来说,是Linux和GNU世界定的规范,任何东西都挂在文件系统之上,即使它们不是文件,也以文件的形式来呈现。

比如我们经常会讲的进程(/proc)、设备(/dev)、Socket等等,实际上都不是文件,但是你可以以文件系统的规范来访问它,修改属主和属性。

那你对这句话的理解是不是仅仅止步于此呢?那我想,下面的这些内容你真的要看一下了

实际操作认证

Linux下有lsof命令,可以查看所有已经打开的文件,你使用lsof -p [pid]的方式就可以查看对应的进程都打开了什么文件,而其中的type字段就是表明它是什么类型,通过man losf 命令你可以查看到它有下面这么多种。

TYPE       is the type of the node associated with the file - e.g., GDIR, GREG, VDIR, VREG, etc.

     or ``IPv4'' for an IPv4 socket;

     or ``IPv6'' for an open IPv6 network file - even if its address is IPv4, mapped  in  an IPv6 address;

     or ``ax25'' for a Linux AX.25 socket;

     or ``inet'' for an Internet domain socket;

     or ``lla'' for a HP-UX link level access file;

     or ``rte'' for an AF_ROUTE socket;

     or ``sock'' for a socket of unknown domain;

     or ``unix'' for a UNIX domain socket;

     or ``x.25'' for an HP-UX x.25 socket;

     or ``BLK'' for a block special file;

     or ``CHR'' for a character special file;

     or ``DEL'' for a Linux map file that has been deleted;

     or ``DIR'' for a directory;

     or ``DOOR'' for a VDOOR file;

     or ``FIFO'' for a FIFO special file;

     or ``KQUEUE'' for a BSD style kernel event queue file;

     or ``LINK'' for a symbolic link file;

     or ``MPB'' for a multiplexed block file;

     or ``MPC'' for a multiplexed character file;

     or  ``NOFD''  for a Linux /proc/<PID>/fd directory that can't be opened -- the directory      path appears in the NAME column, followed by an error message;

     or ``PAS'' for a /proc/as file;

     or ``PAXV'' for a /proc/auxv file;

     or ``PCRE'' for a /proc/cred file;

     or ``PCTL'' for a /proc control file;

     or ``PCUR'' for the current /proc process;

     or ``PCWD'' for a /proc current working directory;

     or ``PDIR'' for a /proc directory;

     or ``PETY'' for a /proc executable type (etype);

     or ``PFD'' for a /proc file descriptor;

     or ``PFDR'' for a /proc file descriptor directory;

     or ``PFIL'' for an executable /proc file;

     or ``PFPR'' for a /proc FP register set;

     or ``PGD'' for a /proc/pagedata file;

     or ``PGID'' for a /proc group notifier file;

     or ``PIPE'' for pipes;

     or ``PLC'' for a /proc/lwpctl file;

     or ``PLDR'' for a /proc/lpw directory;

     or ``PLDT'' for a /proc/ldt file;

     or ``PLPI'' for a /proc/lpsinfo file;

     or ``PLST'' for a /proc/lstatus file;

     or ``PLU'' for a /proc/lusage file;

     or ``PLWG'' for a /proc/gwindows file;

     or ``PLWI'' for a /proc/lwpsinfo file;

     or ``PLWS'' for a /proc/lwpstatus file;

     or ``PLWU'' for a /proc/lwpusage file;

     or ``PLWX'' for a /proc/xregs file;

     or ``PMAP'' for a /proc map file (map);

     or ``PMEM'' for a /proc memory image file;

     or ``PNTF'' for a /proc process notifier file;

     or ``POBJ'' for a /proc/object file;

     or ``PODR'' for a /proc/object directory;

     or ``POLP'' for an old format /proc light weight process file;

     or ``POPF'' for an old format /proc PID file;

     or ``POPG'' for an old format /proc page data file;

     or ``PORT'' for a SYSV named pipe;

     or ``PREG'' for a /proc register file;

     or ``PRMP'' for a /proc/rmap file;

     or ``PRTD'' for a /proc root directory;

     or ``PSGA'' for a /proc/sigact file;

     or ``PSIN'' for a /proc/psinfo file;

     or ``PSTA'' for a /proc status file;

     or ``PSXSEM'' for a POSIX semaphore file;

     or ``PSXSHM'' for a POSIX shared memory file;

     or ``PTS'' for a /dev/pts file;

     or ``PUSG'' for a /proc/usage file;

     or ``PW'' for a /proc/watch file;

     or ``PXMP'' for a /proc/xmap file;

     or ``REG'' for a regular file;

     or ``SMT'' for a shared memory transport file;

     or ``STSO'' for a stream socket;

     or ``UNNM'' for an unnamed type file;

     or ``XNAM'' for an OpenServer Xenix special file of unknown type;

     or ``XSEM'' for an OpenServer Xenix semaphore file;

     or ``XSD'' for an OpenServer Xenix shared data file;

     or the four type number octets if the corresponding name isn't known.

这里我也添加一些实例给大家更好地展示一下

# 进到proc目录

[root@k8s ~]# cd /proc

[root@k8s proc]# ls

1     1063  1077  11    12    1504  19    2175  24   280  297  301  317  39   407  413  49   519  726  737        bus       devices      filesystems  kallsyms    kpageflags  modules       partitions   softirqs       timer_list   vmstat

10    1066  1078  1100  13    16    2     2176  25   281  298  302  36   391  408  414  495  52   729  743        cgroups   diskstats    fs           kcore       loadavg     mounts        sched_debug  stat           timer_stats  zoneinfo

102   1068  1083  1102  14    1746  20    2177  26   282  299  303  37   392  409  415  5    53   733  8          cmdline   dma          interrupts   keys        locks       mpt           schedstat    swaps          tty

1038  1071  1085  1110  15    1748  2005  2178  27   29   3    304  38   4    410  416  50   6    734  9          consoles  driver       iomem        key-users   mdstat      mtrr          scsi         sys            uptime

1061  1072  1097  1113  1502  1749  2007  22    279  294  30   305  380  405  411  47   51   66   735  acpi       cpuinfo   execdomains  ioports      kmsg        meminfo     net           self         sysrq-trigger  version

1062  1073  1099  1164  1503  18    21    23    28   296  300  31   381  406  412  48   511  7    736  buddyinfo  crypto    fb           irq          kpagecount  misc        pagetypeinfo  slabinfo     sysvipc        vmallocinfo

# 可以看到上面有很多以数字为名称的目录,而这些目录就对应每一个进程

# 使用ps -ef|grep nginx可以找到Nginx主进程的PID是2175

[root@k8s proc]# ps -ef|grep nginx

root       2175      1  0 10:23 ?        00:00:00 nginx: master process /usr/sbin/nginx

nginx      2176   2175  0 10:23 ?        00:00:00 nginx: worker process

nginx      2177   2175  0 10:23 ?        00:00:00 nginx: worker process

root       2182   2007  0 10:24 pts/0    00:00:00 grep --color=auto nginx

# 进入/proc/2175目录,可以看到这个进程相关的目录

[root@k8s 2175]# ls

attr       cgroup      comm             cwd      fd       io        map_files  mountinfo   net        oom_adj        pagemap      projid_map  schedstat  smaps  statm    task     wchan

autogroup  clear_refs  coredump_filter  environ  fdinfo   limits    maps       mounts      ns         oom_score      patch_state  root        sessionid  stack  status   timers

auxv       cmdline     cpuset           exe      gid_map  loginuid  mem        mountstats  numa_maps  oom_score_adj  personality  sched       setgroups  stat   syscall  uid_map

# 这里面的内容就是2175进程的全部内容了,非常多的命令实际上都是从这个目录读取的信息,比如上面的ps命令

# 上面的文件我举几个例子解释一下

# 1. fd目录,里面是此进程打开的文件的情况,每个均链接至实际的文件或设备

[root@k8s 2175]# ll fd

总用量 0

lrwx------ 1 root root 64 9月  29 10:53 0 -> /dev/null

lrwx------ 1 root root 64 9月  29 10:53 1 -> /dev/null

lrwx------ 1 root root 64 9月  29 10:53 10 -> socket:[26530]

l-wx------ 1 root root 64 9月  29 10:53 2 -> /var/log/nginx/error.log

lrwx------ 1 root root 64 9月  29 10:53 3 -> socket:[26527]

l-wx------ 1 root root 64 9月  29 10:53 4 -> /var/log/nginx/error.log

l-wx------ 1 root root 64 9月  29 10:53 5 -> /var/log/nginx/access.log

lrwx------ 1 root root 64 9月  29 10:53 6 -> socket:[27700]

lrwx------ 1 root root 64 9月  29 10:53 7 -> socket:[27701]

lrwx------ 1 root root 64 9月  29 10:53 8 -> socket:[26528]

lrwx------ 1 root root 64 9月  29 10:53 9 -> socket:[26529]

# 2. limits,内容是此进程的系统限制信息

[root@k8s 2175]# cat limits

Limit                     Soft Limit           Hard Limit           Units

Max cpu time              unlimited            unlimited            seconds

Max file size             unlimited            unlimited            bytes

Max data size             unlimited            unlimited            bytes

Max stack size            8388608              unlimited            bytes

Max core file size        0                    unlimited            bytes

Max resident set          unlimited            unlimited            bytes

Max processes             14889                14889                processes

Max open files            1024                 4096                 files

Max locked memory         65536                65536                bytes

Max address space         unlimited            unlimited            bytes

Max file locks            unlimited            unlimited            locks

Max pending signals       14889                14889                signals

Max msgqueue size         819200               819200               bytes

Max nice priority         0                    0

Max realtime priority     0                    0

Max realtime timeout      unlimited            unlimited            us

# 3. stack,此进程的内核调用栈信息

[root@k8s 2175]# cat stack

[<ffffffff958b5859>] sigsuspend+0x39/0x70

[<ffffffff958b58ee>] SyS_rt_sigsuspend+0x5e/0x80

[<ffffffff95f92ed2>] system_call_fastpath+0x25/0x2a

[<ffffffffffffffff>] 0xffffffffffffffff

# 这些内容都不是普通的文件,你通过文件系统看,它们的大小都是0,但你看我能输出上面的这么多信息

[root@k8s 2175]# ll

总用量 0

dr-xr-xr-x 2 root root 0 9月  29 10:25 attr

-rw-r--r-- 1 root root 0 9月  29 10:25 autogroup

-r-------- 1 root root 0 9月  29 10:25 auxv

-r--r--r-- 1 root root 0 9月  29 10:23 cgroup

--w------- 1 root root 0 9月  29 10:25 clear_refs

-r--r--r-- 1 root root 0 9月  29 10:24 cmdline

-rw-r--r-- 1 root root 0 9月  29 10:25 comm

-rw-r--r-- 1 root root 0 9月  29 10:25 coredump_filter

-r--r--r-- 1 root root 0 9月  29 10:25 cpuset

...

[root@k8s 2175]# du -sh

0

另外,我们经常会使用到的/dev/null, /dev/random,都是可以在文件目录中看到,但它们都不是普通的文件,而是Linux Kernel为了实现某些功能,同时存在everything is a file的约定,才把它们体现在了文件系统上。

另外补一个我觉得挺有用的,且应该不少人不知道的一个小技巧

man 5 proc命令会输出/proc目录的帮助信息,它里面包含/proc/[pid]目录中每个目录和文件的说明信息

PROC(5)                                                                                                                 Linux Programmer's Manual                                                                                                                 PROC(5)

NAME

      proc - process information pseudo-file system

DESCRIPTION

      The proc file system is a pseudo-file system which is used as an interface to kernel data structures.  It is commonly mounted at /proc.  Most of it is read-only, but some files allow kernel variables to be changed.

      The following outline gives a quick tour through the /proc hierarchy.

      /proc/[pid]

             There is a numerical subdirectory for each running process; the subdirectory is named by the process ID.  Each such subdirectory contains the following pseudo-files and directories.

      /proc/[pid]/auxv (since 2.6.0-test7)

             This contains the contents of the ELF interpreter information passed to the process at exec time.  The format is one unsigned long ID plus one unsigned long value for each entry.  The last entry contains two zeros.

      /proc/[pid]/cgroup (since Linux 2.6.24)

             This file describes control groups to which the process/task belongs.  For each cgroup hierarchy there is one entry containing colon-separated fields of the form:

                 5:cpuacct,cpu,cpuset:/daemons

             The colon-separated fields are, from left to right:

                 1. hierarchy ID number

                 2. set of subsystems bound to the hierarchy

                 3. control group in the hierarchy to which the process belongs

             This file is present only if the CONFIG_CGROUPS kernel configuration option is enabled.

      /proc/[pid]/cmdline

             This  holds  the complete command line for the process, unless the process is a zombie.  In the latter case, there is nothing in this file: that is, a read on this file will return 0 characters.  The command-line arguments appear in this file as a set

             of strings separated by null bytes ('\0'), with a further null byte after the last string.

      /proc/[pid]/coredump_filter (since kernel 2.6.23)

             See core(5).

      /proc/[pid]/cpuset (since kernel 2.6.12)

             See cpuset(7).

      /proc/[pid]/cwd

             This is a symbolic link to the current working directory of the process.  To find out the current working directory of process 20, for instance, you can do this:

                 $ cd /proc/20/cwd; /bin/pwd

             Note that the pwd command is often a shell built-in, and might not work properly.  In bash(1), you may use pwd -P.

             In a multithreaded process, the contents of this symbolic link are not available if the main thread has already terminated (typically by calling pthread_exit(3)).

其实,这就是Linux最让人着迷的地方,总是感觉很多东西都很简单,一个命令行就可以解决问题,但是深入去研究一下,你又会发现,真的有很多更神秘的地方再等待着你去探索,越深入学习越觉得兴奋,起码我个人是这样觉得

加油吧,程序员

文章首发公众号:Java架构师联盟,每日更新技术好文

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 系统重启后nginx reload不生效原因分析 这是一种比较少见,困扰我很久的问题,虽然这个问题很简单,但是找到...
    三杯水Plus阅读 4,103评论 6 3
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,126评论 5 124
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_阅读 1,762评论 0 3
  • docker file简介 Dockerfile 是由一个个的指令组成,是用于表示创建一个镜像文件的过程。 doc...
    sknfie阅读 585评论 0 0
  • 1,编译安装nginx应用,提供wordpress服务 wgethttp://nginx.org/download...
    stephe_c阅读 346评论 0 3