1 linux目录结构
bin: 存放二进制可执行文件(ls,cat,mkdir等)
boot: 存放用于系统引导时使用的各种文件
dev: 用于存放设备文件
etc:存放系统配置文件 /etc/profile, /etc/passwd ,/etc/shadow
home: 存放所有用户(除了root)文件的根目录
lib:存放跟文件系统中的程序运行所需要的共享库及内核模块
mnt:系统管理员安装临时文件系统的安装点
opt:额外安装的可选应用程序包所放置的位置
proc:虚拟文件系统,存放当前内存的映射
root:超级用户目录
sbin:存放系统管理命令
tmp:用于存放各种临时文件 ,可以存放一些不重要的文件
usr:用于存放系统应用程序,比较重要的目录/usr/local 本地管理员软件安装目录
/usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;
= windows Program Files
var:用于存放运行时需要改变数据的文件
2 linux 文件基本属性
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
在Linux中我们可以使用ll或者ls –l命令来显示一个文件的属性以及文件所属的用户和组,如:
[root@localhost ~]# ls / -l
总用量 16
#文档的权限信息 文档的硬连接数量 #文档的归属用户 #文档的用户组 #文件大小 #问的的最后修改时间 #文档名称( ---> 某个目录 说明这是一个连接文档)
lrwxrwxrwx. 1 root root 7 11月 19 17:41 bin -> usr/bin
#文档的权限信息 文档的硬连接数量 #文档的归属用户 #文档的用户组 #文件大小 #问的的最后修改时间 #文档名称(如果文件名称带.说明是隐藏文件)
dr-xr-xr-x. 5 root root 4096 11月 19 17:45 boot
drwxr-xr-x. 20 root root 3220 11月 19 17:47 dev
drwxr-xr-x. 74 root root 8192 11月 20 06:15 etc
drwxr-xr-x. 3 root root 25 11月 20 04:40 home
lrwxrwxrwx. 1 root root 7 11月 19 17:41 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 11月 19 17:41 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 6 4月 11 2018 mnt
drwxr-xr-x. 2 root root 6 4月 11 2018 opt
dr-xr-xr-x. 114 root root 0 11月 19 17:47 proc
dr-xr-x---. 2 root root 135 11月 19 17:48 root
drwxr-xr-x. 23 root root 720 11月 19 17:47 run
lrwxrwxrwx. 1 root root 8 11月 19 17:41 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 11月 19 17:47 sys
drwxrwxrwt. 8 root root 211 11月 20 03:47 tmp
drwxr-xr-x. 14 root root 166 11月 20 04:48 usr
drwxr-xr-x. 19 root root 267 11月 19 17:47 var
2.1 文件及详细信息
2.2 文件类型及权限
实例中,bin文件的第一个属性用"d"表示。"d"在Linux中代表该文件是一个目录文件,换句话说bin是一个文件夹。
在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为[ d ]则是目录(文件夹)
- 当为[ - ]则是文件;
- 若是[ l ]则表示为链接文档(link file);
- 若是[ 储存b ]则表示为装置文件里面的可供的接口设备(可随机存取装置);
- 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
每个文件的属性由左边第一部分的10个字符来确定(如下图)。
从左至右用0-9这些数字来表示。
第0位确定文件类型,
第1-3位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,
第7-9位确定其他用户拥有该文件的权限。
其中,
第1、4、7位表示读权限,如果用"r"字符表示,则有读权限,如果用"-"字符表示,则没有读权限;
第2、5、8位表示写权限,如果用"w"字符表示,则有写权限,如果用"-"字符表示没有写权限;
第3、6、9位表示可执行权限,如果用"x"字符表示,则有执行权限,如果用"-"字符表示,则没有执行权限。
2.3 inode详解
在权限后面的数字代表这个文档的inode节点硬链接的数量
2.3.1 inode 是什么
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。
"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。
这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
2.3.2 inode 的内容
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
一般情况下
创建一个文件默认的inode数量为 1
创建一个目录的默认inode数量为 2
为啥呢 ? 因为一个目录有两个隐藏的目录
一个叫 . 是当前目录的相对名称
一个叫 .. 是当前目录的上一级目录的相对名称
linux中有几个相对目录的名称 需要大家注意
~ 指 家目录
. 指当前目录
.. 指当前目录的上一级目录
并且在 UNIX 中创建一个文件系统时,将为 inode 表分配大约百分之一的总磁盘空间。每次在文件系统中创建一个文件时,都会为该文件分配一个 inode 。通常,与一个文件系统相关联的 inode 的数目足够多,但耗尽 inode 的可能性始终存在。要监视是否发生了这种情况,您可以观察 df 的输出。
使用 df 命令,您可以查看所有已挂载的文件系统或者特定的文件系统。在该命令的输出中,您可以查看各个文件系统中已使用的 inode 的数目,以及文件系统中总体使用情况百分比
[root@localhost /]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 8910848 26101 8884747 1% /
devtmpfs 121686 386 121300 1% /dev
tmpfs 124744 1 124743 1% /dev/shm
tmpfs 124744 728 124016 1% /run
tmpfs 124744 16 124728 1% /sys/fs/cgroup
/dev/sda1 524288 326 523962 1% /boot
tmpfs 124744 1 124743 1% /run/user/0
可以用stat命令,查看某个文件的inode信息:stat 文件名
[root@localhost /]# stat /bin
文件:"/bin" -> "usr/bin"
大小:7 块:0 IO 块:4096 符号链接
设备:fd00h/64768d Inode:18933 硬链接:1
权限:(0777/lrwxrwxrwx) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:bin_t:s0
最近访问:2019-05-30 12:25:05.325890519 +0800
最近更改:2019-05-30 12:25:01.735194422 +0800
最近改动:2019-05-30 12:25:01.735194422 +0800
2.3.3 linux 内部是如何读取数据的?
Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。
实际上,系统内部这个过程分成三步:
1)首先,系统找到这个文件名对应的inode号码;
2)其次,通过inode号码,获取inode信息;
3)最后,根据inode信息,找到文件数据所在的block,读出数据。
其实说白了 inode是干啥的呢?
打个比方,在windows系统中,对于一个文件(或者文件夹)你可以有两种操作方式,第一种就是复制粘贴,第二种就是创建快捷方式来操作这些文件;
第一种操作 对文件的粘贴复制可以产生很多文件,但是内容相同,浪费了空间,所以linux采用inode读取文件的形式,可以让两个不同的文件名指向同一个物理文件
这个就好比我们使用maven仓库是一个道理的,每个项目引用这些共有资源,不会造成资源浪费;
那么我们怎么利用这个inode呢?
3 linux的链接
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。
Linux 链接解决的就是一个数据块的共享问题
3.1 硬连接
硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。
在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
3.2 软连接
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
3.3 ln命令
Linux ln命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
语法
ln [参数][源文件或目录][目标文件或目录]
参数
必要参数:
- -b 删除,覆盖以前建立的链接
- -d 允许超级用户制作目录的硬链接
- -f 强制执行
- -i 交互模式,文件存在则提示用户是否覆盖
- -n 把符号链接视为一般目录
- -s 软链接(符号链接)
- -v 显示详细的处理过程
选择参数:
- -S "-S<字尾备份字符串> "或 "--suffix=<字尾备份字符串>"
- -V "-V<备份方式>"或"--version-control=<备份方式>"
- --help 显示帮助信息
- --version 显示版本信息
实例操作
[root@localhost ~]# touch file1 # 创建 一个file1的文件
[root@localhost ~]# ln file1 lf1 # 给file1创建一个硬连接 lf1
[root@localhost ~]# ln -s file1 lf2 # 给file1创建一个软连接 lf2
[root@localhost ~]# ls -li # -li参数 查看文档的inode信息
总用量 8
33574978 -rw-------. 1 root root 1241 11月 19 17:45 anaconda-ks.cfg
33575015 -rw-r--r--. 2 root root 0 11月 20 09:54 file1
33575014 drwxr-xr-x. 2 root root 6 11月 20 08:23 hnxy
33575013 -rw-r--r--. 1 root root 363 11月 21 2018 isayme.xcs
33575015 -rw-r--r--. 2 root root 0 11月 20 09:54 lf1
33575016 lrwxrwxrwx. 1 root root 5 11月 20 09:55 lf2 -> file1
从上面的结果中可以看出,硬连接文件 lf1 与原文件 file1 的 inode 节点相同,均为33575015,然而符号连接文件的 inode 节点不同。
继续测试
[root@localhost ~]# echo "Hello,Linux">>file1 # 向file1添加一句话
[root@localhost ~]# cat file1 # 查看file1的内容
Hello,Linux
[root@localhost ~]# cat lf1 # 查看硬链接
Hello,Linux
[root@localhost ~]# cat lf2 # 查看软连接
Hello,Linux
[root@localhost ~]# rm -f file1 # 删除file1
[root@localhost ~]# cat lf1 # 再次查看硬链接
Hello,Linux
[root@localhost ~]# cat lf2 # 再次查看软连接
cat: lf2: 没有那个文件或目录
3.4 总结
- 1).删除软连接对原始文件没有影响,因为它只是一个快捷方式;
- 2).删除硬连接对原始文件和软连接没有影响,因为他是一个独立的文件;
- 3).删除原文件,对硬连接没有影响,导致软连接失效;
- 4) 同时删除原始文件和所有的硬链接,整个文件会真正的被删除。
以后我们会经常给某些文件或目录创建各种连接,所以ln命令大家要熟记;