Linux小白进化之路2

文件系统:

      这次来讲讲Linux的文件系统和常见windows的区别

      当我们拿到一块硬盘之后,无论是windows还是Linux上,我们都会将磁盘分区,然后才能使用,对于windows来说,分区之后每个分区都是独立的,也就是说所有的分区直接是没有关联的,各自都是相互对立的,而对于我们Linux来讲,却是不一样的之前说过,Linux有个核心思想:一切皆文件,在Linux的系统分区中,所有的分区要想能被访问到,我们都是从一个叫做根的目录开始,一级一级的向下访问,任何文件或者目录都不能被独立访问,都必须连着根一块访问,具体结构直接上图:

Linux小白进化之路2

    上面的图就是Linux的文件系统结构图,如图所示,这是一个倒置树结构,最上面一级就是我们说的根,和windows一样,Linux也是有系统分区,对Linux来讲,操作系统安装在哪,一般都是系统分区,系统分区通常是内核启动以后第一个加载的分区,对Linux来说也有一些固定的目录用来存放一些用户容易识别的固定文件,这些与根直接关联的文件系统,我们称为根文件系统。             根文件系统,也就rootfs,结构是这样子的:/etc  /usr  /var  /root  /home  /dev  大部分的Linux版本结构基本如此,这是因为Linux有一个组织叫LSB定义的这种命名法则,这种标准叫做FHS (Filesystem Hierarchy Standard) 文件系统层级标准,接下来就来看看这些目录大致都是有何作用。

 /boot  启动相关的内核和grub文件
/bin  可执行的二进制文件
/sbin 只有root才能执行的二进行文件
/lib  库文件
/lib64 64位库文件
/etc  配置文件存放目录 
/dev  设置文件存放目录 
/tmp 临时目录 
/usr 存放软件的执行程序,库文件及文档

/var 存放软件可变的数据

     说完目录,来看看文件的类型:

-普通文件
d目录文件
b块设备文件
c字符设备文件
l软链接文件
p管道文件

s套接字文件

        Linux文件大致就这些,每个Shell和系统进程都有一个当前的工作目录,顺便介绍个命令pwd,

        pwd主要是显示当前所在的绝对路径 

       -P 这个选项是说如果当前所在位置是软链接目录,则显示源路径                              

             什么是绝对路径,绝对路径通俗的说就是:从根开始的路径                                                                                  相对路径就是:相对于当前的路径   

           接下来一个很常用的命令 CD  用于切换当前的工作目录,单单输入cd:进入家目录

cd ~ 也是进入家目录 

cd - 进入上一次的工作目录,反复执行会在两个目录间来回切换 

        cd 后面跟上路径,遍可以切换至指定的目录,

        ls  [options][fils or directories]    用于显示目标列表
        -a 显示所有文件,包含隐藏文件
-A 显示所有文件,包含隐藏文件,除了. and ..
-l 长列出,显示属性信息
-rw-------. 1 root root  1495 May 15 11:23 anaconda-ks.cfg
    -/d/l/s/b/c/p 表示文件的类型
    rw-  ---  --- 表示owner,group,other的权限
    . 表示该文件有selinux的context标签,可用-Z 详细查看
    1 表示硬链接数
    root 表示该文件的owner
    root 表示该文件的group
    1495 表示该文件的大小,默认bytes -h以人类可读性显示,则显示具体的单位
    May 15 11:23 默认显示为mtime,可使用u或--time=atime来显示atime
                                  可使用--time=ctime来显示ctime
    anaconda-ks.cfg  文件名


-dl 详细指定目录自己的属性信息,而不是显示子文件,子目录信息
-R 递归
-1 以一列显示
-S 按文件大小从大到小排序
-tl 默认以修改时间从新到旧排序,而如果使用--time=a[c]time,则按所指定的时间从新到旧排序
-utl 以atime从新到旧排序 也可以用--time=atime -tl
不加t只有ul存在时,表示以atime来显示详细信息
-rS 按文件大小从小到大 -rt 按时间从旧到新
-U 按文件的存放顺序显示
-X 按文件后缀排序
-i 显 示文件的inode号
-Z 显示context

      上面说到时间,也是Linux里非常重要的东西,Linux文件有三个时间状态,也就是时间戳:

        时间戳
access time(atime): 访问时间,当文件被读取时才更新
modify time(mtime): 数据修改时间,当文件的数据被修改时才更新
change time(ctime): 元数据修改时间,当文件的元数据(权限,大小,owner,group,mtime等)更新时则更新

        stat ,ls --time=atime[ctime] -l

        touch filename         ps :touch (是一个用于创建空文件的命令)

若文件不存在,则创建一个空文件
若文件存在,则更新三个时间戳
-a 更新atime和ctime
-m 更新mtime和ctime
-c 若文件存在,则更新三个时间戳,若不在,不会创建新文件,无作为。

       接下来就要介绍一个很常用的东西,也就是通配符,在输入命令难免会遇到一些不是固定能匹配到的文件或者目录这个时候就用到通配符了,具体如下:

       文件名通配符
*:匹配零或多个任意字符
?:匹配任意一个单一字符
0-9:表示任何数字
a-Z:表示所有字母,包括大小写
[linux]:表示包含l或i或n或u或x
[^linux]:表示不包含l和i和n和u和x
[:digit:]:表示任意数字
[:lower:]:表示小写字母
[:upper:]:表示大写字母
[:alpha:]:表示大小写字母
[:alnum:]:表示任意字母或数字
[:blank:]:表示空格(水平制表符)及TAB
[:space:]:表示空格(水平制表符)、回车(垂直制表符)及TAB
[:punct:]:表示符号

[:print:]:表示可打印字符 

        还有一个平常很常用的命令cp 用于复制文件或者目录,不过用cp会有以下常碰到的情况:当源是一个文件时
当目标文件不存时,则新建文件,并填充内容
当目标文件存在,且为一个文件时,则覆盖该文件
当目标文件存在,且为一个目录时,则将该文件放置入该目录
当源是多个文件时
当目标文件不存时,报错
当目标文件存在,且为一个文件时,报错
当目标文件存在  ,且为一个目录时,则将所有源目文件放置入该目录
当源是一个目录时, 要配合-r
当目标不存在时,则创建指定名称的目录,并将源目录当中的文件复制到新目录当中
当目标文件存在,且为一个文件时,报错

当目标文件存在  ,且为一个目录时,则两个目录内容合并,如有同名文件,则源目录下的文件覆盖目标目录的文件。

             接下来就是选项:

               -i 覆盖时交互式提示
       -r 递归,可以复制目录
       -d 默认不加-d时,cp复制软链接会将源复制过去,加上-d保留链接属性,把软链接复制过去
--preserv=
mode 权限不变
owner[ship] 权限及owner,group 不变
time 三个时间戳不变
xattr acl权限不变
links 链接不变
context 文件的selinux上下文关系不变
all 
-p  等于 --preserv=mode,owner,time
-a 等于rdp
-v 显示复制过程 
-f 强制覆盖: 当普通用户对目标文件不可更改时,但对该目标文件所在的目录有创建及删除文件的权限,则使用-f可以强制覆盖,实际上是先删除文件,再创建
-u 只覆盖源比目标文件新的文件

--backup-numbered 覆盖前,先将旧文件改名为 文件名.~数字~ 

        有复制就有剪切,在Linux里叫mv,也就是移动或者可以用作重命名:

         mv [OPTION]... [-T] SOURCE DEST
         mv [OPTION]... SOURCE... DIRECTORY
         mv [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-i: 交互式  

-f: 强制   直接覆盖,不交互式,抵消i的作用

         mkdir  用于创建目录
-p 可以同时创建多级目录 
-v 在创建目录时显示详细信息

-m xxx  创建同时指定权限

        rmdir    用于删除目录 (只能是空目录)

-p 递归删除 

       rm 用于删除目录或文件

       -r 递归删除

       -f  强制删除  (通常用-rf删除大量文件)

        接下来要理解一个概念硬链接和软连接:

       

    硬链接与软链接的联系与区别

          我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块.展示了程序通过文件名获取文件内容的过程

      由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性: 

    文件有相同的 inode 及 data block;

     只能对已存在的文件进行创建

    不能交叉文件系统进行硬链接的创建;

   不能对目录进行创建,只可对文件创建; 

     删除一个硬链接文件并不影响其他有相同 inode 号的文件。

       

      软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块   。因此软链接的创建与使用没有类似硬链接的诸多限制:

   软链接有自己的文件属性及权限等;

   可对不存在的文件或目录创建软链接;

  软链接可交叉文件系统;

  软链接可对文件或目录创建;

     创建软链接时,链接计数 i_nlink 不会增加;

删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接) 

    重定向和管道,

     输入、输出重定向

    > 若文件不存在,则创建,并将正确的输出填充,若文件已存在,则覆盖原内容 
   >> 若文件不存在,则创建,并将正确的输出内容填充,若文件已存在,则追加内容
   1> 同 >
   1>>  同 >>

    2> 若文件不存在,则创建,并将错误的输出填充,若文件已存在,则覆盖原内容      2>> 若文件不存在,则创建,并将错误的输出内容填充,若文件已存在,则追加内容

   &> 若文件不存在,则创建,并将所有的输出填充,若文件已存在,则覆盖原内容

   &>> 若文件不存在,则创建,并将所有的输出内容填充,若文件已存在,则追加内容

    | 这个就是管道符,只将正确结果传递给右边的命令用

       2>&1 将错误结果转为正确结果 

       |& 将正确及错误都传递给右边命令用

       1>&2 将正确结果转为错误结果

     用户,组,权限:


         系统识别用户的权限不是取决于用户的名字,而是UID(组同样取决于GID)。 
UID=0的用户为系统超级管理员。 
1-999为系统程序用户(centos6中1-499)。 
1000+之后都是普通用户(6中为500+)。 
通过UID和GID的不同,每个用户和组的权限也不一样。每个用户必须有一个主组,还可以拥有多个辅助组,接下来介绍下创建修改用户的命令:
       

    useradd:创建用户

    语法:useradd [选项] 用户名
       -u: 指定UID在 /etc/login.defs文件中,加 -o 不检查重复id
       -g :设定主组(指定的主组必须存在),默认创建并加入一个与用户名相同的组,同时指明GID
       -c :描述用户的注释信息
       -d :以指定的路径(不存在的目录)为家目录
       -s :制定用户默认shell类型
       -G :指明用户的附加组,组必须事先存在
       -N :不创建默认主组,以users作为该用户主组
       -r : 创建系统用户
       -D :显示或更改默认设置, 也就是这个文件下的信息/etc/default/useradd 创建新用户时的默认项目文件
       -D -s :更改默认shell类型
       -D -b:BASE_DIR
       -D -g:GROUP

         userdel   删除用户

         语法:userdel [OPTION] login
             -r:删除用户家目录

 usermod  修改用户属性

            语法:usermod [OPTION] login
              -u : 新的UID
              -g:新基本组
              -G:新的附加组,原来的附加组将会被覆盖;若保留原有附加组,则要同时使用-a选项,表示append添加。
              -s:新的默认SHELL类型
              -c:新的注释信息
              -d:新的家目录不会自动创建,原家目录中的文件不会同时移动至新的家目录;若要创建新的家目录并移动原家数据同时使用-m选项
              -l:新的名字
              -L:锁定指定用户,在/etc/shadow密码栏加!
              -U:解锁指定用户,将/etc/shadow密码栏的!拿掉
              -e yyyy-MM-DD:指明用户帐号过期时间
              -f:INACTICE设定非活动期限

         groupadd (用于创建一个组)
-g GID GNAME
-r GNAME       
        gpasswd   (修改组信息)
Options:
        -a, --add USER                增加单个用户到指定组当中(组管理员可执行)
        -d, --delete USER             从指定组中删除单个用户(组管理员可执行)
        -r, --delete-password         将指定组的组密码删除(组管理员可执行)
        -R, --restrict                限制组成员访问该组
        -M, --members USER,...        一次性设置组成员(仅root执行)
         -A, --administrators ADMIN,... 设置组管理列表(root执行)   
                     

   权限:

     

      在学习Linux的权限之前,我们先来理解几个概念: 可读,可写 、可执行

        Linux的文件和目录有以下三种方式

                         r  、w 、x:可读,可写 、可执行

                                       r-可读(read)

                                       w-可写(write)

                                       x-可执行(execute)

                            所有者 、所属组 、其他人

         Linux的文件和目录又可以有三个所有者概念:

                           u、g 、o: 所有者 、所属组 、其他人

                                      u:所有者

                                      g:所属组

                                      o:其他人

               chown   仅root才能执行  (用于修改文件或目录的权限)
               USERNAME-FILENAME/DIRNAME
            所属人修改文件的权限

                           r:4
                                           w:2

                            x:1

    7:rwx      6:rw    5:rx    4:r     3:wx   2:w    1:x     

              -R 递归修改

     .|: GNAME FILENAME/DIRNAME 修改所属组
              USERNAME.|:GNAME FILENAME/DIRNAME 同时修改文件的所属人及所属组

              --reference=USERNAME FILENAME/DIRNAME 将指定文件的从属关系设置为与指定文件相同

  chgrp  仅root和文件的所属人可以更改文件的所属组(但所属人一定要属于目标组)、
GNAME FILENAME/DIRNAME

-R 递归修改

接下来我们仔细研究下这些权限作用于文件或者目录各有什么效果:

FILE (文件)
当仅r权限作用在文件上的时候,表示用户可以读取该文件的内容
当仅w权限作用在文件上的时候,表示用户可以修改该文件的内容
当仅x权限作用在文件上的时候,没有意义。
当rw同时作用在文件上的时候,表示用户可以读写文件
当rx同时作用在文件上的时候,表示用户可以读且可以执行该文件
当wx同时作用在文件上的时候,权限与仅w相同
当rwx同时作用在文件上的时候,用户可以读写执行。

DIRECTORY (目录)
当仅r权限作用在目录上的时候,表示用户可以短列出查看目录下的文件名
当仅w权限作用在目录上的时候,没有意义
当仅x权限作用在目录上的时候,表示用户可以进入且可以访问目录下的文件,但不能列出文件名
当仅rw权限同时作用在目录上的时候,权限等同于仅r权限作用在目录
当仅rx权限同时作用在目录上的时候,表示用户可以进入,可以访问子文件,同时可以长列出文件
当仅wx权限同时作用在目录上的时候,表示用户可以进入,可以访问子文件,可以创建及删除,但不能列出
当rwx权限同时作用在目录上的时候,表示用户有完整权限

X 对于批量增加x权限时,可以跳过文件而只对目录加x

umask :
表示用户创建文件的默认权限,目录最高777,文件最高666
umask xxx 设置umask
umask 查看umask
~/.bashrc 将umask设定保存以让下次登录时仍然有效

umask -S 显示创建目录的默认权限

特殊权限位:

suid: 对于可执行的二进制文件作用了suid权限之后,任何人在执行该文件时,可临时拥有其所属人的权限
sgid: 对于可执行的二进制文件作用了sgid权限之后,任何人在执行该文件时,可临时拥有其所属组的权限
  对于目录作用了sgid权限之后,任何人在该目录下创建的文件的所属继承目录的所属组

sticky:对于目录作用了sticky之后,该目录下的文件及子目录,仅其所属人和目录的所属人及root才能删除。

chmod u+s 
chmod g+s
chmod o+t
chmod 4777 suid
chmod 2777 sgid
chmod 1777 sticky

chattr +a 不可修改,可以追加,不能删除

chattr +i 什么也不做,只能读

接下来就是ACL(Access Control List)也就是访问控制列表,用于在Linux文件系统传统的权限控制机制之外,

提供更加精细化的文件权限控制,不过要先提一下Cenots7之前的版本默认没有acl支持,开启的方法.
fdisk /dev/sda同  分区 
n回车
回车
+500M 回车
w回车
partx -a /dev/sda 通知内核更新分区表
mkfs.ext4 /dev/sda6 
tune2fs -l /dev/sda |grep acl
none
tune2fs -o acl /dev/sda6
tune2fs -l /dev/sda |grep acl

centos7 默认创建的XFS和ext4文件系统具有ACL功能,ACL生效顺序:所有者,自定义用户,自定义组,其他人

setfacl -m u|g:username|groupname:rwx filename|dirname (设置ACL权限)

 setfacl -x u|g:username|groupname  filename|dirname  (选项删除acl规则)

以上就是ACL基础了 下次见 !