Linux文件系统及操作

作者:xcbeyond
疯狂源自梦想,技术成就辉煌!微信公众号:《程序猿技术大咖》号主,专注后端开发多年,拥有丰富的研发经验,乐于技术输出、分享,现阶段从事微服务架构项目的研发工作,涉及架构设计、技术选型、业务研发等工作。对于Java、微服务、数据库、Docker有深入了解,并有大量的调优经验。 









对于初次接触Linux的人来说,与window相比而言,最大的不同之处就是文件啦。一般的文件大家都是很容易理解的,例如:Word文档,txt文档这都属于常规文件吧,但是在Linux环境下,设备也成了文件,使得初次接触Linux的人来说或多有些困惑吧,不过慢慢就习惯了。所以说,在Linux中,一切都是文件。也就是说,在Linux中,所有的东西都可以被看成文件,所有的操作都可以归结到对文件的操作,这样就使得Linux操作系统可以像处理普通文件一样来使用所有东西(磁盘文件,串口,键盘,显示器,打印机以及其他的设备)。

一、Linux文件系统结构

       无论学习什么东西,起初都会引入结构之类的话语来总领全体,使得对整个体系有了明了的认识与影像。而文件结构是文件存放在磁盘等存储设备中的组织方式,主要体现在对文件和目录的组织上。Linux文件系统是以目录和文件的层次来安排的(windows也是如此),目录或者文件都是拥有其属性(文件类型,长度,所有者,访问权限等)的,尤其是设置的目录和文件权限,以便提高其访问的安全性。

      其文件结构呈现一种多级树形结构,通过这种树形结构用户可以浏览整个系统下已经拥有权限的目录及文件。一般Linux系统安装完了后,会有形成固定的目录结构,其不同的目录存放着不同类别的文件,以此完成一些特定的任务。Linux根目录下包含的目录及其用途如下:
 

二、文件类型 

    [xcbeyond@bogon tmp]$ ls -al
    total 120
    drwxrwxrwt. 27 root     root     4096 Nov  2 06:26 .
    dr-xr-xr-x. 22 root     root     4096 Oct 19 01:45 ..
    drwx------.  2 root     root     4096 Oct 12 01:31 .esd-0
    drwx------.  2 xcbeyond xcbeyond 4096 Nov  2 05:23 .esd-500
    drwxrwxrwt.  2 root     root     4096 Nov  2 05:23 .ICE-unix
    drwx------.  2 xcbeyond xcbeyond 4096 Jul 20 07:02 keyring-B651js
    drwx------.  2 root     root     4096 Oct 12 01:31 keyring-dKrzCB
    drwx------.  2 xcbeyond xcbeyond 4096 Oct  7 05:45 keyring-G6gJe4
    drwx------.  2 xcbeyond xcbeyond 4096 Nov  2 05:23 keyring-JaMrno
    (省略……)

       从上述示例中,可以看到列出的文件信息中包含有文件类型、文件属性、用户名、用户所在组、文件大小、修改日期、文件名等。其中第一列信息(drwxrwxrwt)是比较重要的,也即是接下来着重说明的内容。

      第一列信息包含了10个字符,分为4组:

      ①第一组(第1位):文件类型
 

  不同的字符代表不同的文件类型,如:d代表目录文件。






         Linux文件类型符号见下表:

 

②第二组(第2-4位):文件所有者(user)权限

      ③第三组(第5-7位):文件所有者的同组用户(group)权限

      ④第四组(第8-10位):其他组用户(权限

      ※权限分为:读、写、执行三种

      1、普通文件

             普通文件是计算机用户用来存放的数据、程序等信息文件,一般被长期存放在存储设备(硬盘)中。普通文件一般又分为文本文件和二进制文件。

      2、目录文件

              目录文件是文件系统中一个目录所包含的目录项组成的文件,其只允许系统进行修改,用户进程可以读取目录文件,但不能对它们进行修改,只有内核才可以写目录文件。

      3、设备文件

              设备文件是用于为操作系统与I/O设备提供链接的一种文件,分为字符设备文件和块设备文件,其对应于字符设备和块设备。Linux把对设备的I/O作为普通文件的读取/写入,操作内核提供了对设备处理和对文本处理的统一接口。每一种I/O设备对应一个设备文件,存放在/dev目录下,如:行式打印机对应于文件/dev/lp。目前在最新的Linux发行版本中,一般不用用户创建设备文件,因为这些文件是和内核相关联的。

               在设备文件中有一个极其特殊的文件是/dev/null,学习shell脚本时,就会知道了,又本叫做“无底洞文件”,一般用于写入一些不想在console控制显示的message。

            (1)字符设备(Character Device):这是一个顺序的数据流设备,对这种设备的读写是按照字符进行的,而且这些字符是连续地形成一个数据流。字符设备不具有缓冲区,所以对这种设备的读写是实时的。

             (2)块设备(Block Device):这是一种具有一定结构的随机存取设备,对这种设备的读取是按照块进行的,它使用缓冲区来存储暂时的数据,待时机成熟后,从缓存一次性写入设备或从设备中一次性读出放入缓冲区,如磁盘和文件系统等。   

[xcbeyond@bogon dev]$ pwd
/dev                                              ※ /dev目录
[xcbeyond@bogon dev]$ ls -al
total 4
drwxr-xr-x. 18 root root        3920 Nov  3 06:28 .
dr-xr-xr-x. 22 root root        4096 Nov  3 06:28 ..
crw-rw----.  1 root video    10, 175 Nov  3 06:28 agpgart
drwxr-xr-x.  2 root root         640 Nov  3 06:28 block                ※目录
drwxr-xr-x.  2 root root         100 Nov  3 06:28 bsg
drwxr-xr-x.  3 root root          60 Nov  3 06:28 bus
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 cdrom -> sr0         ※link文件
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 cdrom1 -> sr1
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 cdrw -> sr0
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 cdrw1 -> sr1
drwxr-xr-x.  2 root root        3020 Nov  3 06:28 char
crw-------.  1 root root      5,   1 Nov  3 06:28 console              ※字符设备文件
lrwxrwxrwx.  1 root root          11 Nov  3 06:28 core -> /proc/kcore
drwxr-xr-x.  3 root root          80 Nov  3 06:28 cpu
crw-rw----.  1 root root     10,  61 Nov  3 06:28 cpu_dma_latency
crw-rw----.  1 root root     10,  62 Nov  3 06:28 crash
drwxr-xr-x.  5 root root         100 Nov  3 06:28 disk
crw-rw----+  1 root audio    14,   9 Nov  3 06:28 dmmidi
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 dvd -> sr0
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 dvd1 -> sr1
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 dvdrw -> sr0
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 dvdrw1 -> sr1
lrwxrwxrwx.  1 root root           3 Nov  3 06:28 fb -> fb0
crw-rw----.  1 root root     29,   0 Nov  3 06:28 fb0
lrwxrwxrwx.  1 root root          13 Nov  3 06:28 fd -> /proc/self/fd
crw-rw-rw-.  1 root root      1,   7 Nov  3 06:28 full
crw-rw-rw-.  1 root root     10, 229 Nov  3 06:28 fuse
crw-rw----.  1 root root    250,   0 Nov  3 06:28 hidraw0
crw-rw----.  1 root root     10, 228 Nov  3 06:28 hpet
drwxr-xr-x.  2 root root          40 Nov  3 06:28 hugepages
crw-------.  1 root root    229,   0 Nov  3 06:28 hvc0
drwxr-xr-x.  4 root root         260 Nov  3 06:28 input
crw-rw----.  1 root root      1,  11 Nov  3 06:28 kmsg
srw-rw-rw-.  1 root root           0 Nov  3 06:28 log
brw-rw----.  1 root disk      7,   0 Nov  3 06:28 loop0             ※块设备文件
brw-rw----.  1 root disk      7,   1 Nov  3 06:28 loop1
brw-rw----.  1 root disk      7,   2 Nov  3 06:28 loop2
brw-rw----.  1 root disk      7,   3 Nov  3 06:28 loop3

     4、链接文件

       链接文件又称为符号链接文件,类似于window下的快捷方式文件,它提供了共享文件的一种方法,在链接文件中不是通过文件名实现文件共享,而是通过链接文件所包含的指向文件的指针来实现对文件的访问。普通用户可以建立链接文件,并通过其指针方式访问其所指向的那个文件。根据链接对象不同,链接文件可以分为硬链接文件和符号链接文件。

    5、管道文件

     管道文件主要用于进程间传递数据,它是Linux进程间的一种通信机制。管道是将某一个进程数据写入管道的一端,另一个进程从管道另一端读取数据。管道文件也可以分为匿名管道和命名管道两种。

     6、套接字文件

     套接字(Socket)文件主要用于在不同计算机的进程间的通信。套接字是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的通道。套接字有3种类型:流式套接字、数据报套接字和原始套接字。流式套接字也是TCP套接字(面向连接的套接字),数据报套接字也就是UDP套接字(无连接的套接字),原始套接字通常用“SOCK_RAW”表示。

三、文件访问权限

     文件访问权限是指文件系统为了进行安全管理需要在对文件操作时进行的用户身份认证。合法权限的用户进行操作,而没有权限的用户就不能对其文件进行操作。由于Linux系统是一个典型的多用户操作系统,不同的用户处于不同的地位。为了保护系统的安全性,Linux系统对不同用户访问相同文件做了不同访问权限的设定,即不同用户对于相同文件具有不同的读、写、执行的权限差异。

     用户在登录Linux系统时,系统会自动分配一个UID,来区分不同用户的权限级别,root用户具有最高的用户权限,其UID=0。