Linux 的文件系统
========================================================================================
概述:
========================================================================================
文件系统结构及元素
1.文件系统目录及结构
★ 文件是什么?众多的文件如何有效组织起来?
☉ 目录:
☉ 文件:
存储空间存储的一段流式数据,对数据可以做到按名存储;
首先文件得必须有名字(文件系统的目的就是案名存储)文件名与文件内容没有关系,文件名是文件的外围属性,就比如人的名字一样;所以文件就是文件名、大小、属性这些外围属性所组成的;
文件有两类数据:
元数据(metadata) :文件名、大小、属性等
数据:data
文件的索引信息就是元数据,而元数据所指向的内容就相当于数据。目录也是一种文件,是一种特殊的文件
★ 文件系统:层级结构,有索引
画图:倒状树;
查找文件就是从根开始一级一级找
/:原初起点 ,倒置树状结构
示例: /dev/pts/2
最左侧/:表示根目录;
其他的/:表示路径分隔符(Linux的路径分隔符是/,Windows的是 \)
★ 文件的路径表示:
绝对路径:从根开始表示出的路径;
相对路径:从当前位置开始表示出的路径
当前位置:当前所处的位置,也成为工作目录,登录系统之后,无时无刻都处在某个位置,可通过命令pwd来显示当前位置。
★ 如何表示当前目录:
./:./sysconfig/network-scripts
或者省略上述 sysconfig/network-scripts
.. :表示当前目录的上一级目录
2.Linux文件系统
★ 文件系统的特性
Linux文件和目录被组织成一个单根倒置树结构;
文件系统从根目录下开始,用“/”表示;
根文件系统(rootfs):root filesystem;
文件名称严格区分大小写(是针对文件系统而言的);
以 "." 开头的文件为隐藏文件;
路径分隔符 “/” ;
★ 文件名使用法则:
包括路径在内文件名称最长4095个字节,文件名长度最长不能超过255个字节。
蓝色-->目录;绿色-->可执行文件;红色-->压缩文件;浅蓝色-->链接文件;灰色-->其他文件;黄色-->硬件设备
文件名可使用除了斜杠“/”和NUL,的所有字符,但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们。
标准Linux文件系统(如ext4),文件名称大小写敏感。 例如:MAIL,Mail,mail, mAiL
★ 用户有家目录:
★ 工作目录:
basename :基名,最右侧的文件或目录名;
dirname :basename左侧的路径
命令:
~]# banename /PATH/TO/SOMEFILE ---> SOMEFILE
~]# dirname /PATH/TO/SOMEFILE ---> /PATH/TO
演示:
# 取基名
[root@centos7 ~]# basename /etc/sysconfig/network-scripts/ifcfg-eno16777736
ifcfg-eno16777736
# 取dirname
[root@centos7 ~]# dirname /etc/sysconfig/network-scripts/ifcfg-eno16777736
/etc/sysconfig/network-scripts
Linux 文件系统详解
1.文件系统分层结构
★ FHS
Linux 有一个组织叫LSB 定义的Linux发行版基础目录名称命名法则及功用规定,这种标准叫FHS 文件系统层级标准。
★Linux根下的目录结构
☉ /bin :
bin是Binary(二进制)的缩写,系统自身启动和运行时可能会用到的核心二进制程序,不能关联至独立分区。
☉ /sbin:
管理类基本命令,不能关联至独立分区,系统启动变会用到的程序。
☉ /lib :
为系统启动或者根文件系统上的应用程序(/bin,/sbin)提供共享库文件,以及微内核提供内核模块文件
libc.so.* 动态链接的C库
ld*: 运行时连接器/加载器
modules: 用于存储内核模块的目录
☉ / lib64:
专用于x86_64(64位系统)系统上存放64位共享库的路径;
☉ /boot :
系统自身启动时要加载的静态文件、内核和initramfs(initrd)ramdisk及grup等
☉ /dev :
dev是devices设备的缩写。所有设备文件及特殊文件存储位置。在Linux中访问设备的方式和访问文件的方式是相同的。
设备两种类型:c:character ddevice 字符设备 ---> 线性访问 (如:键盘)
b:block device 块设备 ---> 随机访问
☉ /etc :
☉ /usr :
是一个非常重要的目录,类似于Windows下的Programe Files(程序文件)目录,操作系统软件资源存放位置。用户的很多应用程序和文件都存放在该目录下。
包含的目录如下:
bin: 该目录存放的是系统用户使用的应用程序。
sbin: s就是Super User的意思,该目录存放的事系统管理员使用的系统管理程序。
lib
lib64
include:C程序的头文件;
share:机构化独立的数据,例如:doc,man等
local:第三方应用程序的安装位置:bin,sbin,lib,lib64,etc,share,src
src:程序源码文件存放位置
☉ /root :
☉ /home :
普通用户的家目录一般存放的位置,每个用户的主目录通常默认为: /home/USERNAME
☉ /tmp :
☉ /var:经常发生变化的文件的存放位置,包括各种日志文件。
cache: 应用数据缓存数据目录;
lib: 应用程序状态信息数据;
local: 专用于为/usr/local下的应用程序存储可变数据;
lock: 锁文件;
log: 日志目录及文件;
opt: 专用为/opt下的应用程序存储可变数据;
run: 运行中的进程相关的数据,通常用于存储进程的pid文件;
spool: 应用程序的数据池;
tmp: 保存系统两次重启之间产生的临时数据
☉ /srv :
☉ /opt :
☉ /mnt :
☉ /media :
☉ /mnt :
☉ /sys :
用于输出当前系统上硬件设备相关信息的虚拟文件系统,内核中与硬件设备相关的信息映射。
☉ /proc :
用于输出当前系统上硬件设备相关信息的虚拟文件系统,也称伪文件系统,由内核参数映射而来。
虚拟文件系统,用于为内核及进程存储的相关信息:它们多为内核参数,例如:net.ipv4.ip_forward,虚拟为net/ipv4/ip_forward,存储于/proc/sys下,因此其完整路径为/proc/sys/net/ipv4/ip_forward;
☉ /selinux:
★ RHEL7 的目录变化
/bin 和/usr/bin
/sbin 和/usr/sbin
/lib 和/usr/lib
/lib64 和/usr/lib64
演示:
# CentOS 6 系统目录
[root@CentOS6 ~]# ll /
total 106
dr-xr-xr-x. 2 root root 4096 Dec 1 12:35 bin
dr-xr-xr-x. 5 root root 1024 Nov 6 12:10 boot
drwxr-xr-x 20 root root 3840 Feb 8 07:38 dev
drwxr-xr-x. 104 root root 12288 Feb 8 12:58 etc
drwxr-xr-x. 6 root root 4096 Nov 10 21:19 home
dr-xr-xr-x. 11 root root 4096 Nov 6 12:02 lib
dr-xr-xr-x. 9 root root 12288 Dec 1 12:35 lib64
drwx------. 2 root root 16384 Nov 6 11:53 lost+found
drwxr-xr-x. 3 root root 4096 Feb 6 16:53 media
drwxr-xr-x 2 root root 0 Feb 8 12:53 misc
drwxr-xr-x. 2 root root 4096 Sep 23 2011 mnt
drwxr-xr-x 2 root root 0 Feb 8 07:38 net
drwxr-xr-x 3 root root 4096 Nov 23 10:20 nfs
drwxr-xr-x. 3 root root 4096 Nov 6 12:08 opt
dr-xr-xr-x 113 root root 0 Feb 8 2017 proc
dr-xr-x---. 27 root root 4096 Feb 8 12:42 root
dr-xr-xr-x. 2 root root 12288 Dec 1 12:35 sbin
drwxr-xr-x. 2 root root 4096 Nov 6 11:54 selinux
drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv
drwxr-xr-x 13 root root 0 Feb 8 2017 sys
drwxrwxrwt. 6 root root 4096 Feb 8 08:17 tmp
drwxr-xr-x. 14 root root 4096 Nov 6 11:54 usr
drwxr-xr-x. 23 root root 4096 Nov 6 12:08 var
# CentOS 7 系统目录
[root@centos7 ~]# ll /
总用量 32
lrwxrwxrwx. 1 root root 7 11月 6 18:30 bin -> usr/bin
dr-xr-xr-x. 4 root root 4096 11月 6 20:01 boot
drwxr-xr-x 3 root root 21 12月 9 15:46 data
drwxr-xr-x 19 root root 3240 2月 8 07:49 dev
drwxr-xr-x. 134 root root 8192 2月 8 07:49 etc
drwxr-xr-x. 7 root root 72 11月 10 22:24 home
lrwxrwxrwx. 1 root root 7 11月 6 18:30 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 11月 6 18:30 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 8月 12 2015 media
drwxr-xr-x 3 root root 0 2月 8 13:44 misc
drwxr-xr-x. 2 root root 6 8月 12 2015 mnt
drwxr-xr-x 2 root root 0 2月 8 07:49 net
drwxr-xr-x 3 root root 17 11月 23 11:44 nfs
drwxr-xr-x. 3 root root 15 11月 6 19:42 opt
dr-xr-xr-x 368 root root 0 2月 8 2017 proc
dr-xr-x---. 24 root root 4096 7月 7 2018 root
drwxr-xr-x 36 root root 1140 2月 8 09:37 run
lrwxrwxrwx. 1 root root 8 11月 6 18:30 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 8月 12 2015 srv
dr-xr-xr-x 13 root root 0 2月 8 2017 sys
drwxrwxrwt. 11 root root 4096 2月 8 09:59 tmp
drwxr-xr-x. 13 root root 4096 11月 6 18:30 usr
drwxr-xr-x. 23 root root 4096 2月 8 2017 var
附图:
Linux上应用程序的组成部分
★ 二进制程序:
/bin,/sbin, /usr/bin,/usr/sbin,/usr/local/bin, /usr/local/sbin
★ 库文件:
/lib,/lib64, /usr/lib, /usr/lib64,/usr/local/lib, /usr/local/lib64
★ 配置文件:
/etc,/etc/DIRECTORY,/usr/local/etc
★ 帮助文件:
/usr/share/man,/usr/share/doc, /usr/local/share/man, /usr/local/share/doc
Linux下的文件类型
★ 文件类型:
-:普通文件即 f;
d:directory ,目录文件
b:block device 块设备文件,支持以“block”为单位进行随机访问
c:charactor device 字符设备,支持以“charactor ”为单位进行随机访问
major number:主设备号,用于标识设备类型,进而确定要加载的驱动程序;
minor number:次设备号,用于标识同一类型中的不同的设备;
l: 符号链接文件
p:命名管道设备
s:socket,套接字文件,
演示:
[root@centos7 ~]# ll /dev
总用量 0
crw-rw---- 1 root video 10, 175 2月 8 07:48 agpgart
crw------- 1 root root 10, 235 2月 8 07:48 autofs
drwxr-xr-x 2 root root 180 2月 8 2017 block
drwxr-xr-x 2 root root 80 2月 8 2017 bsg
crw------- 1 root root 10, 234 2月 8 07:48 btrfs-control
drwxr-xr-x 3 root root 60 2月 8 2017 bus
lrwxrwxrwx 1 root root 3 2月 8 07:48 cdrom -> sr0
drwxr-xr-x 2 root root 2940 2月 8 07:49 char
crw------- 1 root root 5, 1 2月 8 07:48 console
lrwxrwxrwx 1 root root 11 2月 8 2017 core -> /proc/kcore
drwxr-xr-x 3 root root 80 2月 8 2017 cpu
crw------- 1 root root 10, 61 2月 8 07:48 cpu_dma_latency
crw------- 1 root root 10, 62 2月 8 07:48 crash目录管理类的命令
1.mkdir,rmdir,tree
★ mkdir:创建目录
☉ 格式:
mkdir [OPTION]... DIRECTORY...
☉ 选项:
-p:自动按需创建父目录;
-v:verbose 显示详细过程;
-m MODE: 在创建目录时设定其权限,
注意:
路径基名为命令的作用对象,基名之前的路径必须得存在;
★ rmdir :删除空目录
☉ 格式: mkdir [OPTION]... DIRECTORY...
★ tree:目录结构查看
☉ 格式:tree [OPTION]... DIRECTORY...
-d: 只显示目录;
-L level: 指定显示的层级数目;
-P partern:只显示指定partern匹配到的路径
bash的基础特性:命令行展开
★命令行展开
☉ ~:
☉ ~USERNAME:
☉ { }:
可承载一个以逗号分割的列表,并将其展开为多个路径;
例如:/tmp/{a,b} 相当于 /tmp/a,/tmp/b
/tmp/{tom,jerry]/h1 = /tmp/tom/h1,/tmp/jerry/h1
演示:
1.创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b
[root@CentOS6 ~]# mkdir -pv /testdir/dir1/{x,y}/{a,b}
mkdir: created directory `/testdir'
mkdir: created directory `/testdir/dir1'
mkdir: created directory `/testdir/dir1/x'
mkdir: created directory `/testdir/dir1/x/a'
mkdir: created directory `/testdir/dir1/x/b'
mkdir: created directory `/testdir/dir1/y'
mkdir: created directory `/testdir/dir1/y/a'
mkdir: created directory `/testdir/dir1/y/b'
[root@CentOS6 ~]# tree /testdir/
/testdir/
└── dir1
├── x
│ ├── a
│ └── b
└── y
├── a
└── b 2.创建/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b
[root@CentOS6 ~]# mkdir -pv /testdir/dir2/{x/{a,b},y}
mkdir: created directory `/testdir/dir2'
mkdir: created directory `/testdir/dir2/x'
mkdir: created directory `/testdir/dir2/x/a'
mkdir: created directory `/testdir/dir2/x/b'
mkdir: created directory `/testdir/dir2/y'
[root@CentOS6 ~]# tree /testdir/
/testdir/
├── dir1
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
│ ├── a
│ └── b
└── dir2
├── x
│ ├── a
│ └── b
└── y
12 directories, 0 files 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
[root@CentOS6 ~]# mkdir -pv /testdir/dir{3,4,5/dir{3,4}}
mkdir: created directory `/testdir/dir3'
mkdir: created directory `/testdir/dir4'
mkdir: created directory `/testdir/dir5'
mkdir: created directory `/testdir/dir5/dir6'
mkdir: created directory `/testdir/dir5/dir7'
[root@CentOS6 ~]# tree /testdir/
/testdir/
├── dir1
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
│ ├── a
│ └── b
├── dir2
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
├── dir3
├── dir4
└── dir5
├── dir6
└── dir7
17 directories, 0 filesbash的基础特性:命令执行状态结果
★命令的执行结果状态:
☉ bash 使用特殊变量$?保存最近一条命令的执行状态结果: echo $?
演示:
[root@CentOS6 ~]# ls
anaconda-ks.cfg Desktop discuz Documents Downloads install.log install.log.syslog Music Pictures Public splash.jpg Templates Videos
[root@CentOS6 ~]# echo $?
0
[root@CentOS6 ~]# ls /testdir
ls: cannot access /testdir: No such file or directory
[root@CentOS6 ~]# echo $?
2
[root@CentOS6 ~]# lss
-bash: lss: command not found
[root@CentOS6 ~]# echo $?
127
★ 引用命令的执行结果:
总结:
强引用:''
弱引用:""
命令引用:``或者$()
演示:
[root@CentOS6 ~]# mkdir $(date "+%Y-%m-%d")
[root@CentOS6 ~]# ls
2017-02-08 anaconda-ks.cfg Desktop discuz Documents Downloads install.log install.log.syslog Music Pictures Public splash.jpg Templates Videos
文本查看类命令:cat、tac、more、less、head、tail
★分屏查看命令:more和less
☉ more命令
格式: more FILE
特点: 翻屏至文件尾部自动退出;
☉ less命令
格式:less FILE
man中调用的就是less命令,详见man帮助
★head 显示文件前n行内容
☉ 格式:head [OPTION]...[FILE]
-n #:指定获取前#行,也可以使用 -#;默认为前10行
-c #:指定获取前#字节的内容
★ tail 显示文件后n行内容
☉ 格式:tail [OPTION]...[FILE]
-n #:指定获取后#行,也可以使用 -#;默认为后10行
-c #: 指定获取后#字节的内容;
-f:动态显示文件新内容,如果要退出可使用Ctrl+c
演示:
[root@CentOS6 ~]# head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@CentOS6 ~]# head -c 4 /etc/passwd
root[root@CentOS6 ~]#
[root@CentOS6 ~]# tail -5 /etc/passwd
centos:x:500:500::/home/centos:/bin/bash
userx1:x:501:501::/home/userx1:/bin/bash
userx2:x:502:502::/home/userx2:/bin/bash
userx3:x:503:503::/home/userx3:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
查看文件状态属性及时间戳管理工具
★状态信息的三个时间戳
atime: 访问时间(acess time)即:通过cat,more等读取其内容;
mtime: 修改时间(modify time)即:改变文件内容(数据)
ctime: 改变时间(change time)即:元数据发生改变
★stat: 查看文件状态(属性信息或者元数据)
★touch命令:创建空文件和刷新时间
格式:touch [OPTION]... FILE...
-a: 仅改变 atime;
-m: 仅改变 mtime;
-t [[CC]YY]MMDDhhmm[.ss]: 修改指定时间戳为某时间;
-c: 如果文件不存在,则不予创建;
注意:
数据发生改变,元数据一定会发生改变,即:mtime发生改变,则ctime一定会发生改变;
演示:
# 查看文件f1的状态
[root@centos7 ~]# stat f1
文件:"f1"
大小:19 块:8 IO 块:4096 普通文件
设备:802h/2050dInode:201576206 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2017-02-08 23:20:44.346026475 +0800
最近更改:2017-02-08 23:20:41.457877103 +0800
最近改动:2017-02-08 23:20:41.457877103 +0800
创建时间:-
# 刷新f1的时间戳为当下时间
[root@centos7 ~]# touch f1
[root@centos7 ~]# stat f1
文件:"f1"
大小:19 块:8 IO 块:4096 普通文件
设备:802h/2050dInode:201576206 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2017-02-08 23:21:10.138360433 +0800
最近更改:2017-02-08 23:21:10.138360433 +0800
最近改动:2017-02-08 23:21:10.138360433 +0800
创建时间:-
# 修改mtime时间为2012-12-01 03:03:03
[root@centos7 ~]# touch -m -t 201212010303.03 f1
[root@centos7 ~]# stat f1
文件:"f1"
大小:19 块:8 IO 块:4096 普通文件
设备:802h/2050dInode:201576206 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2017-02-08 23:21:10.138360433 +0800
最近更改:2012-12-01 03:03:03.000000000 +0800
最近改动:2017-02-08 23:23:00.676077350 +0800
创建时间:-文件管理命令:cp,mv,rm
★cp命令:copy复制(源文件到目标文件)
☉ 格式:
单源文件复制: cp [OPTION]... [-T] SOURCE DEST
多源文件复制: cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE...
☉ 用法:
※单源文件复制:cp [OPTION]... [-T] SOURCE DEST
如果DEST不存在:则事先创建此文件,并复制源文件的数据流至DEST中;
如果DEST存在:
· 如果DEST是非目录文件,则覆盖目标文件;
· 如果DEST是目录文件,则现在DEST目录先创建一个和源文件同名的文件,并复制其数据流;
※多源文件复制: cp [OPTION]... SOURCE... DIRECTORY
如果DEST不存在:错误
如果DEST存在:
· 如果DEST是非目录文件:错误
· 如果DEST是目录文件:分别复制每个文件至目标目录中,并保持原名
附图:
☉ 常用选项
-i:交互式复制,即覆盖之前提醒用户确认;
-f: --force 强制覆盖目标文件
-r,-R:递归复制目录及内部的所有内容;
-a:实现归档,相当于-dR--preserv=all
-d:--no-dereference --preserv=links 不跟踪符号链接所指向的源文件
--preserve[=ATTR_LIST]
mode:权限
ownership:属主属组
timestamp:时间戳
links:符号链接
xattr:扩展属性
context:安全标签
all:上述所有属性
-p: 等同--preserv=mode,ownership,timestamp
-v: --verbose 显示过程
演示:
1.使用别名命令,每日将/etc/目录下所有文件,备份到/testdir/下独立的新目录下,并要求新目录格式为backupYYYY-mm-dd,备份过程可见。
[root@centos7 ~]# alias backup='cp -avr /etc/ /testdir/backup$(date +%F)'
[root@centos7 ~]# mkdir /testdir
[root@centos7 ~]# backup
[root@centos7 ~]# ls /testdir/
backup2017-02-09 2. 先创建/testdir/rootdir目录,再复制/root所有下文件到该目录内,并要求保留原有权限;
[root@centos7 ~]# mkdir -pv /testdir/rootdir
mkdir: 已创建目录 "/testdir/rootdir"
[root@centos7 ~]# cp -r --preserve=mode /root /testdir/rootdir
[root@centos7 ~]# ls /testdir/
backup2017-02-09 rootdir★mv:移动命令
☉ 格式:
单源文件移动: mv [OPTION]... [-T] SOURCE DEST
多源文件移动: mv [OPTION]... SOURCE... DIRECTORY mv [OPTION]... -t DIRECTORY SOURCE...
☉ 用法:
※单源文件移动:
如果DEST不存在:剪切功能;
如果DEST存在:
· 如果DEST是非目录文件,则把源文件内容移动过去,DEST名不变
· 如果DEST是目录文件,则现在DEST目录先创建一个和源文件同名的文件,并移动其数据流;
※多源文件移动: cp [OPTION]... SOURCE... DIRECTORY
· 如果DEST是非目录文件:错误
· 如果DEST是目录文件:分别移动每个文件至目标目录中,并保持原名
☉ 常用选项:
★rm 删除命令
☉ 格式:
☉ 常用选项:
删除目录:
rm -fr /PATH/TO/DIR
危险操作:rm -fr /*
注意:
所有不用的文件建议不要直接删除,而是移动至某个专用目录(模拟回收站)
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com