鸟哥Linux私房菜

MBR和GPT

磁区:磁盘的最小单元,大小有512字节和4K字节两种规格。

磁轨:磁盘上的一圈轨道。由多个磁区组成。

磁柱:一个磁碟由多个磁盘组成,这些磁盘的同一个磁轨就构成了磁柱

MBR分割:

磁盘的第一个扇区记录了:

MBR:Master Boot Record, 主引导记录,446字节

分割表:进行磁盘分割,总共64字节,每个分割记录占用16字节,故只能分割出四个主分区。

扩展分区:

因为MBR分割表只能分出四个主分区,所以如果需要多个分区,可以使用扩展分区(分割表只有64字节,如果使用额外的磁盘空间存储分割信息,那不就突破4个分区的限制了吗)。MBR只能有一个扩展分区,扩展分区可以分割成多个逻辑分区。

GPT磁碟分割表

GPT使用了34个LBA(Logical Block Address)区块来纪录分割资讯,除了前面34个LBA之外,整个磁碟的最后33个LBA也拿来作为另一个备份。LBA默认大小512字节

LBA0 (MBR 相容区块):主引导记录;GPT特殊标志,代表是GPT分割。

LBA1 (GPT 表头纪录):分割表本身大小和位置;分割表备份的位置;分割表校验码,有错误就使用备份;

LBA2-33 (实际纪录分割资讯处):从LBA2区块开始,每个LBA都可以纪录4笔分割纪录,所以在预设的情况下,有4*32 = 128笔分割纪录!每笔纪录用到128 bytes的空间,有64bits来记载开始/结束的磁区号码,对于单一分割槽来说,他的最大容量限制就会在『 2 64 * 512bytes = 2 63 * 1Kbytes = 2 33 *TB = 8 ZB 』,要注意1ZB = 2 30 TB啦!

开机检测程序:BIOS,UEFI

BIOS开机流程:

  1. BIOS:开机主动执行的程序,用于找到可以开机的设备(含有主引导记录的设备)
  2. MBR:设备中第一个磁区内的主引导记录,内含引导加载程序
  3. 引导加载程序(boot loader):Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过它,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
  4. 操作系统:。。。

引导加载程序(boot loader):

  • 载入核心档案:直接指向可开机的程式区段来开始操作系统;

  • boot loader 除了可以在MBR中,也可以在每个分区的开机磁区中。

  • loader只会认识自己的分区内的操作系统,以及其他boot loader而已;

  • loader可直接指向或者是间接将管理权转交给另一个boot loader。

UEFI:Unified Extensible Firmware Interface

GPT 可以提供到64bit 的定址,然后也能够使用较大的区块来处理引导加载程序。但是BIOS 不支持GPT,还得要透过GPT 提供相容模式才能够读写这个磁碟装置,所以UEFI就出现了。

文件系统

硬盘使用之前,需要格式化,格式化时会选择某种格式(如FAT格式)来进行格式化,这种格式化后的系统就是一个文件系统。

一个文件系统可能含有:

  • superblock:记录此 文件系统 的整体资讯,包括inode/block的总量、使用量、剩余量,每个block的大小,inode的大小,挂载时间, 以及文件系统的格式与相关资讯等;
  • inode:记录文件的属性(如创建时间,修改时间,文件拥有者和群组,文件大小,文件的读写执行权限),一个文件占用一个inode,inode 会记录此文件的资料所在的 block 号;用户读取文件时,先找到它的 inode,然后对比权限,才会判断是否去打开读取 block 里文件的内容。
  • block:实际记录文件的内容,若文件太大时,会占用多个block 。一个block最多存放一个文件的内容(哪怕仍有空余,依然只能存一个文件);所以如果存小文件比较多,block 设的比较大,会造成空间浪费;而如果block设的比较小,又会导致 inode 数量变多,同样浪费一点空间。

FAT文件系统没有 inode 存在,每个 block 中会存放下一个 block 的地址。所以如果一个文件存放在多个 block 中,而这些 block 又太过分散,就会导致磁盘读取性能差。

单文件的大小限制

一个inode是有大小限制的,128字节(不同文件系统可能不同),inode需要存放文件所在的 block 记录。一个 block 占用4个字节。就算不存放文件的属性,把 inode 的空间全部占用完毕,也才32个block,假设一个block的大小为1K,这样一个文件才32K?为了解决文件大小的问题,inode 划分了一些间接区域:

inode 中有12个记录区域,直接指向12个block,还有一个间接区域指向一个block,此block里面存了其他 block的位置;还有一个双间接,一个三间接区域。

假设一个 block 大小为1K。则 12个直接区域容量:12*1K=12K。

1个间接区域指向1个block:1K,1K/4bytes = 256个block记录,256*1k = 256 k

双间接区域指向一个block,指向了256个block,256个block又指向了 256*256 个 block:256*256*1K = 65536K

三间接区域指向了:256*256*256*1K = 16777216 K

三者相加:12 + 256 + 65536 + 1677216 = 16843020 K, 约 16 GB。

所以这样一个文件的最大限制就是:16GB

根据不同的文件系统,限制不同。但是大概算法是相同的。

block bitmap (区块对照表)

记录了哪些 block 是空的,哪些是有内容的,这样创建文件时,就能找到存放位置。删除文件时,也能释放磁盘容量。

inode bitmap (inode对照表)

同上,记录了使用的和未使用的inode

终端切换,系统语言,bc,date,cal

  1. 终端切换,退出

    • [Ctrl] + [Alt] + [F2] ~ [F6] :文字界面登入tty2 ~ tty6 终端机;
    • [Ctrl] + [Alt] + [F1] :图形介面桌面。
    • 从终端启动图形界面:[dmtsai@study ~]$ startx
    • 退出终端:exit
  2. 查看、修改语言

    1.显示目前所支援的语系 
    [dmtsai@study ~]$ locale 
    LANG=zh_TW.utf8               #语言语系的输出 
    LC_CTYPE="zh_TW.utf8"         #底下为许多资讯的输出使用的特别语系
    LC_NUMERIC=zh_TW.UTF-8
    LC_TIME=zh_TW.UTF-8           #时间方面的语系资料
    LC_COLLATE="zh_TW.utf8"
    LC_ALL=                       #全部的资料同步更新的设定值
    #上面的意思是说,目前的语系(LANG)为zh_TW.UTF-8,亦即台湾繁体中文的万国码 
    
    
    2.修改语系成为英文语系 
    [dmtsai@study ~]$ LANG=en_US.utf8 
    [dmtsai@study ~]$ export LC_ALL=en_US.utf8 
    # LANG只与输出讯息有关,若需要更改其他不同的资讯,要同步更新LC_ALL才行!
    
    
  3. date

    语法:

    $ date +%Y/%m/%d
    $ date +%H:%M
    
    [dmtsai@study ~]$ date +%Y/%m/%d
    2015/05/29
    [dmtsai@study ~]$ date +%H:%M
    14:33
    
  4. cal

    语法:

    cal   # 当前月的日历
    cal [month] [year]   # 某年某月日历
    
  5. bc

    语法:

    • + 加法
    • - 减法
    • * 乘法
    • / 除法
    • ^ 指数
    • % 余数
    • scale=3 # 设置三位小数
    [root@bogon temp]# bc
    bc 1.06.95
    Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'. 
    1+2
    3
    ^C
    (interrupt) Exiting bc.
    
  6. 按键

    [Ctrl]-c : 程序终止

    [Ctrl]-d:键盘输入结束(End Of File, EOF或End Of Input)』;相当于exit;

    [Tab] : 命令自动补全

  7. man命令

    man命令用于查找指令的手册。

    [dmtsai@study ~]$ man date 
    DATE (1)                           User Commands DATE(1)
     #请注意上面这个括号内的数字,记住下面的1,5,8
     
    代号 代表内容
    1	使用者在shell环境中可以操作的指令或可执行档
    2	系统核心可呼叫的函数与工具等
    3	一些常用的函数(function)与函式库(library),大部分为C的函式库(libc)
    4	装置档案的说明,通常在/dev下的档案
    5	设定档或者是某些档案的格式
    6	游戏(games)
    7	惯例与协定等,例如Linux档案系统、网路协定、ASCII code等等的说明
    8	系统管理员可用的管理指令
    9	跟kernel有关的文件
    

    man中可以进行的操作:

    按键 进行工作
    空白键 向下翻一页
    [Page Down] 向下翻一页
    [Page Up] 向上翻一页
    [Home] 去到第一页
    [End] 去到最后一页
    /string 向『下』搜寻string 这个字串,如果要搜寻vbird 的话,就输入/vbird
    ?string 向『上』搜寻string 这个字串
    n, N 利用/ 或? 来搜寻字串时,可以用n 来继续下一个搜寻(不论是/ 或?) ,可以利用N 来进行『反向』搜寻。举例来说,我以/vbird 搜寻vbird 字串, 那么可以n 继续往下查询,用N 往上查询。若以?vbird 向上查询vbird 字串, 那我可以用n 继续『向上』查询,用N 反向查询。
    q 退出man页面

    man搜索命令:

    mandb   # 更新资料库
    whatis  [指令]      <==相当于man -f [指令]  (查找一个命令的简介说明)
    apropos [关键字]    <==相当于man -k [指令]  (根据关键字查找指令)
    
  8. sync

    同步资料,将缓存写入硬盘

    用法:

    sync
    
  9. shutdown

    语法:

     shutdown [-krhc] [时间] [警告讯息] 
    

    选项与参数:

    • -k : 不要真的关机,只是发送警告讯息出去!

    • -r : 在将系统的服务停掉之后就重新开机(常用)

    • -h : 将系统的服务停掉后,立即关机。(常用)

    • -c : 取消已经在进行的shutdown 指令内容。

    • 时间: 指定系统关机的时间!默认1 分钟。

      • 20:15 (指定时间关机)
      • now (立刻关机)
      • +10 (10分钟后关机)
  10. reboot

    reboot
    systemctl reboot
    
  11. poweroff

    poweroff
    systemctl poweroff
    

环境变量 PATH

echo $PATH             # 查看
PATH="${PATH}:/root"   # 添加路径

档案系统

  • superblock:记录此 文件系统 的整体资讯,包括inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关资讯等;
  • inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的资料所在的 block 号码;
  • block:实际记录档案的内容,若档案太大时,会占用多个block 。一个block最多存放一个档案的内容。

开机挂载

/etc/fstab 文件里记录了开机挂载的信息。格式如下:

[装置/UUID等] [挂载点] [档案系统] [档案系统参数] [dump] [fsck]
  • 第一栏:磁碟装置档名/UUID/LABEL name:

    这个栏位可以填写的资料主要有三个项目,任意一种都行:

    • 档案系统或磁碟的装置档名,如/dev/vda2 等
    • 档案系统的UUID 名称,如UUID=xxx
    • 档案系统的LABEL 名称,例如LABEL=xxx
  • 第二栏:挂载点(mount point):挂载点一定是目录啊

  • 第三栏:磁碟分割槽的档案系统:

    在手动挂载时可以让系统自动测试挂载,但在这个档案当中我们必须要手动写入档案系统才行!包括xfs, ext4, vfat, reiserfs, nfs 等等。

  • 第四栏:档案系统参数:

参数 内容意义
async/sync 非同步/同步 设定磁碟是否以非同步方式运作!预设为async(效能较佳)
auto/noauto 自动/非自动 当下达mount -a 时,此档案系统是否会被主动测试挂载。预设为auto。
rw/ro 可读写/唯读 让该分割槽以可读写或者是唯读的型态挂载上来,如果你想要分享的资料是不给使用者随意变更的, 这里也能够设定为唯读。则不论在此档案系统的档案是否设定w 权限,都无法写入
exec/noexec 可执行/不可执行 限制在此档案系统内是否可以进行『执行』的工作?如果是纯粹用来储存资料的目录,那么可以设定为noexec会比较安全。不过,这个参数也不能随便使用,因为你不知道该目录下是否预设会有执行档。 举例来说,如果你将noexec设定在/var ,当某些软件将一些执行档放置于/var下时,那就会产生很大的问题喔!因此,建议这个noexec最多仅设定于你自订或分享的一般资料目录。
user/nouser 允许/不允许使用者挂载 是否允许使用者使用mount 指令来挂载呢?一般而言,我们当然不希望一般身份的user 能使用mount 啰,因为太不安全了,因此这里应该要设定为nouser 啰!
suid/nosuid 具有/不具有suid权限 该档案系统是否允许SUID 的存在?如果不是执行档放置目录,也可以设定为nosuid 来取消这个功能!
defaults 同时具有rw, suid, dev, exec, auto, nouser, async等参数。基本上,预设情况使用defaults设定即可!
  • 第五栏:能否被dump 备份指令作用:

    dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入0 就好了!

  • 第六栏:是否以fsck 检验磁区:

    早期开机的流程中,会有一段时间去检验本机的档案系统,看看档案系统是否完整(clean)。不过这个方式使用的主要是透过fsck 去做的,我们现在用的xfs 档案系统就没有办法适用,因为xfs 会自己进行检验,不需要额外进行这个动作!所以直接填0 就好了。

压缩、打包指令

gzip,bzip2,xz

它们都只能压缩文件,对于目录,它们最多只能分别压缩目录下的文件(每个文件一个压缩包),不能进行打包。gzip速度快;bzip2旨在替换gzip,压缩比更高一些;xz压缩比最高,但是速度慢。

tar是打包命令,可以将目录打包在一起,同时也可以应用 gzip,bzip2等压缩指令,进行压缩打包

账号管理

用户登录系统步骤:

  1. 先找寻/etc/passwd 里面是否有你输入的帐号,如果没有则报错,如果有的话则将该帐号对应的 UID 与GID,家目录,shell设定 (在/etc/group 中) 读出来
  2. 核对密码表,进入/etc/shadow 里面找出对应的帐号与 UID,核对一下你刚刚输入的密码与里头的密码是否相符
  3. 上述无误后,就进入shell了

/etc/passwd 档案结构

[root@study ~]# head -n 4 /etc/passwd 
root : x : 0:0 : root:/root :/bin/bash   <==底下说明
账户名:密码:UID:GID:说明备注:家目录:shell

账户名:密码(x占位,其实放在/etc/shadow里了):UID(0为管理员,1-999为系统账号,1000-6000为可登录账号):GID:说明:家目录:shell

/etc/shadow 档案结构

$ head -n 4 /etc/shadow 
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7Rcai6oa/T7KFhO...:16559:0:99999:7:::  <==底下说明
账号:加密后的密码:密码变动日期:需要过几天才能再次更改密码的日期:密码更改周期:密码变动前警告天数:过期后几天失效:失效日期:保留栏位
  1. 帐号名称
    第一栏就是帐号,必须要与/etc/passwd相同

  2. 密码
    经过编码的密码(加密),这个档案的预设权限是『-rw-------』或者是『----------』,亦即只有root才可以读写,由于各种密码编码的技术不一样,因此不同的编码系统会造成这个栏位的长度不相同。由于固定的编码系统产生的密码长度必须一致,因此『当你让这个栏位的长度改变后,该密码就会失效(算不出来)』,在此栏位前加上!或*改变密码栏位长度,就会让密码『暂时失效』了。

  3. 最近更动密码的日期:

    这个栏位记录了『更动密码那一天』的日期,是以1970年1月1日作为1而累加的日期

  4. 密码不可被更动的天数:(与第3栏位相比)
    这个帐号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是0的话,表示密码随时可以更动的意思。

  5. 密码需要重新变更的天数:(与第3栏位相比)
    为了强制要求使用者变更密码,这个栏位可以指定在最近一次更改密码后,在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设定你的密码,否则这个帐号的密码将会『变为过期特性』

  6. 密码需要变更期限前的警告天数:(与第5栏位相比)
    当帐号的密码有效期限快要到的时候(第5栏位),系统会依据这个栏位的设定,发出『警告』言论给这个帐号,提醒他。

  7. 密码过期后的帐号宽限时间(密码失效日):(与第5栏位相比)
    密码有效日期为『更新日期(第3栏位)』+『重新变更日期(第5栏位)』,过了该期限后使用者依旧没有更新密码,那该密码就算过期了。

  8. 帐号失效日期
    这个日期跟第三个栏位一样,都是使用1970年以来的总日数设定。这个栏位表示: 这个帐号在此栏位规定的日期之后,将无法再使用。

  9. 保留栏
    最后一个栏位是保留的,看以后有没有新功能加入。

/etc/group 档案结构

[root@study ~]# head -n 4 /etc/group 
root:x:0:
bin:x:1:
群组名:群组密码:GID:支援的账号(多个账号用,隔开)

/etc/gshadow

[root@study ~]# head -n 4 /etc/gshadow 
root:::
bin:::
daemon:::
sys:::
  1. 群组名称
  2. 密码栏,同样的,开头为! 表示无合法密码,所以无群组管理员
  3. 群组管理员的帐号(相关资讯在gpasswd中介绍)
  4. 加入该群组支援的所属帐号(与/etc/group 内容相同!)

Priority,Nice 优先级

一个进程的重要程度和被CPU处理的优先级,是通过Priority和Nice值来确定的。PRI值越低代表越优先。不过这个PRI值是由核心动态调整的,使用者无法直接调整PRI值的,如果想要调整优先级,只能调整Nice的值。

PRI 与NI 的相关性如下:

PRI(new) = PRI(old) + nice

  • nice 值可调整的范围为-20 ~ 19 ;
  • root 可随意调整自己或他人程序的Nice 值,且范围为-20 ~ 19 ;
  • 一般使用者仅可调整自己程序的Nice 值,且范围仅为0 ~ 19 (避免一般用户抢占系统资源);
  • 一般使用者仅可将nice 值越调越高,例如本来nice 为5 ,则未来仅能调整到大于5;

两种调整Nice的方法:

  1. 运行程序时:nice命令
  2. 已经存在pid的程序:renice命令

A

ACL 权限控制

ACL 是Access Control List 的缩写,提供权限设定。ACL 可以针对单一用户,单一档案或目录来进行r,w,x 的权限规范。传统的权限只有(自己,群组,other)

  • 使用者(user):可以针对使用者来设定权限;
  • 群组(group):针对群组为对象来设定其权限;
  • 预设属性(mask):还可以针对在该目录下在建立新档案/目录时,规范新资料的预设权限;

setfacl : 设置权限

setfacl -bkRd -[mx][ugm]:[uname|gname]:[rwx] fileName
选项与参数:
-b :移除『所有的』 ACL 设定参数;
-k :移除『预设的』 ACL 参数,关于所谓的『预设』参数于后续范例中介绍;
-R :递回设定acl ,亦即包括次目录都会被设定起来;
-d :设定『预设acl 参数』的意思!只对目录有效,在该目录新建的资料会引用此预设值
-m :设定后续的acl 参数给档案使用,不可与-x 合用;
-x :删除后续的acl 参数,不可与-m 合用;
[ugm]: 三个参数选一;u代表用户,g代表群组,m代表权限
[uname|gname]:二选一;当前面的参数是u和g时,后面跟随 用户名 或者 群组名,如果前面参数是 m,则空着
[rwx]:想要设置的权限,读写执行

示例:设置用户权限

[root@bogon t]# ll
总用量 0
-rw-r--r--. 1 root root 0 9月   5 17:49 test
[root@bogon t]# setfacl -mu:wztshine:rw test        # 设置用户 wztshine 的权限 rw
[root@bogon t]# ll
总用量 0
-rw-rw-r--+ 1 root root 0 9月   5 17:49 test         # 权限部分多了个 +

示例:设置群组权限

[root@bogon t]# setfacl -mg:wztshine:rwx test
[root@bogon t]# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:wztshine:rw-
group::r--
group:wztshine:rwx
mask::rwx
other::r--

示例:设置有效权限 m

[root@bogon t]# setfacl -mm:r test            # 设置有效权限:r
[root@bogon t]# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:wztshine:rw-		#effective:r--           # 虽然 wztshine 有 rw 权限,但是有效的权限是 r !
group::r--
group:wztshine:rwx		#effective:r--           # 群组也一样,有效权限变成了 r,也就是不能 wx 了
mask::r--
other::r--

示例:设置权限继承:-d

[root@bogon /]# setfacl -md:u:wztshine:rw ./test    # 设置 wztshine 对 test 目录的权限为 rw

[root@bogon /]# getfacl ./test
# file: test
# owner: root
# group: root
user::rwx
group::rwx
other::rwx
default:user::rwx
default:user:wztshine:rw-              # 确实变成 rw 了
default:group::rwx
default:mask::rwx
default:other::rwx


[root@bogon test]# touch a                # 进入目录 test ,并创建一个文件 a
[root@bogon test]# chmod 777 a            # 给 a 赋予权限 777
[root@bogon test]# getfacl a
# file: a
# owner: root
# group: root
user::rwx
user:wztshine:rw-                     # 可以看到,目录的权限继承给了目录下的文件a,a的权限也是 rw
group::rwx
mask::rwx
other::rwx

getfacl : 查看权限

getfacl FileName

示例:

[root@bogon t]# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:wztshine:rw-                # 看,wztshine 的权限是 rw
group::r--
mask::rw-
other::r--

alias 别名

查看现有的别名:

alias -p

给命令起个别名

[wztshine@bogon ~]$ alias lm='ls -al|more'
[wztshine@bogon ~]$ lm
总用量 72
drwx------. 16 wztshine wztshine 4096 9月   3 21:06 .
drwxr-xr-x.  3 root     root       22 7月  22 21:43 ..
-rw-------.  1 wztshine wztshine 2666 9月   1 22:49 .bash_history
-rw-r--r--.  1 wztshine wztshine   18 4月   1 10:17 .bash_logout
-rw-r--r--.  1 wztshine wztshine  193 4月   1 10:17 .bash_profile
-rw-r--r--.  1 wztshine wztshine  231 4月   1 10:17 .bashrc
drwx------. 24 wztshine wztshine 4096 7月  23 21:19 .cache
drwxr-xr-x. 19 wztshine wztshine 4096 8月   1 13:14 .config

$ unalias lm

anacron 定时任务

anacron不会设置定时任务,而是去查询 crontab 的定时任务有没有执行(譬如关机了,错过执行),anacron会自动查询上次执行任务的时间,如果任务过期了但是还没有执行,anacron就会根据设置文档执行这个任务,对于at命令和cron命令而言,如果它们的任务过期了,也不会重新执行任务。(譬如关机了,crontab没有执行成功,那么开机后不会执行,而anacron如果关机了,开机后会去查一下上次执行时间,如果过期了,会重新执行任务)

anacron是一个程序,每小时执行一次,位于/etc/cron.hourly/0anacron,设置文档位于 /etc/anacrontab:

格式天数 延迟时间 工作名称 指令

  • 天数:anacron 执行当下时间与相关任务执行的时间戳(/var/spool/anacron/ 内的时间纪录档) 相差的天数,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令。
  • 延迟时间:若确定超过天数导致要执行排程工作了,那么请延迟执行的时间,因为担心立即启动会有其他资源冲突的问题吧!单位是分钟。
  • 工作名称定义:这个没啥意义,就只是会在/var/log/cron 里头记载该项任务的名称这样!通常与后续的目录资源名称相同即可。
  • 指令:run-parts 就是遍历目标文件夹,执行文件夹下的脚本
[root@study ~]# cat /etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45            #随机给予最大延迟时间,单位是分钟 
START_HOURS_RANGE=3-22     #执行任务的时间范围

1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
# 第8行解析:当你执行anacron命令,脚本会去查询/var/spool/anacron/cron.daily 文件里面的时间戳(如第13行的命令),与当前系统时间对比,根据第八行的设置:如果时间大于1,就随机延迟1-5分钟,然后执行 /etc/cron.daily/目录下的所有任务脚本。

[root@study ~]# more /var/spool/anacron/*
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
20150731
::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
20150703
::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::
20150727
# 上面则是三个工作名称的时间记录档以及记录的时间戳记

语法:

[root@study ~]# anacron [-sfn] [job].. 
[root@study ~]# anacron -u [job].. 
选项与参数:
-s :开始一连续的执行各项工作(job),会依据时间记录档的资料判断是否进行;
-f :强制进行,而不去判断时间记录档的时间戳记;
-n :立刻进行未进行的任务,而不延迟(delay) 等待时间;
-u :仅更新时间记录档的时间戳记,不进行任何工作。
job :由/etc/anacrontab 定义的各项工作名称。

apropos 查找命令

通过关键字查找命令。

mandb   # 更新库
apropos [你想查找的字段]

示例:

[wztshine@bogon ~]$ apropos grep
egrep (1)            - 打印匹配给定模式的行
fgrep (1)            - 打印匹配给定模式的行
grep (1)             - 打印匹配给定模式的行
Object (3tcl)        - 操纵 Tcl 对象
bzgrep (1)           - search possibly bzip2 compressed files for a regular expression
git-grep (1)         - Print lines matching a pattern

at 定时任务

启动定时服务,at定时的任务只执行一次。at的所有 stdout, stderr 都会传送到执行者的mailbox去,所以在终端机当然看不到任何资讯。假如你在tty1登入,则可以使用『 echo "Hello" > /dev/tty1 』来取代。

at命令会根据 /etc/at.allow 和 /etc/at.deny 两个设定档判断用户是否有权限设置任务,每个文件里写的是用户名,如果没有这两个文件,则只有root有权限设定。

语法:

[root@study ~]# at [-mldv] TIME 
[root@study ~]# at -c 工作号码
选项与参数:
-m :当at 的工作完成后,即使没有输出讯息,亦以email 通知使用者该工作已完成。
-l :at -l 相当于atq,列出目前系统上面的所有该使用者的at 进程;
-d :at -d 相当于atrm ,可以取消一个在at 排程中的工作;
-v :可以使用较明显的时间格式列出at 排程中的工作列表;
-c :可以列出后面接的该项工作的实际指令内容。

TIME:时间格式,这里可以定义出『什么时候要进行at 这项工作』的时间,格式有:
  HH:MM --> 04:00
	在今日的HH:MM 时刻进行,若该时刻已超过,则明天的HH:MM 进行此工作。
  HH:MM YYYY-MM-DD --> 04:00 2015-07-30
	强制规定在某年某月的某一天的特殊时刻进行该工作!
  HH:MM[am|pm] [Month] [Date] --> 04pm July 30
	也是一样,强制在某年某月某日的某时刻进行!
  HH:MM[am|pm] + number [minutes|hours|days|weeks]
	ex> now + 5 minutes --> 04pm + 3 days
	就是说,在某个时间点『再加几个时间后』才进行。

示例:

范例一:再过五分钟后,将/root/.bashrc寄给root自己 
[root@study ~]# at now + 5 minutes   <==记得单位要加s喔!
at> /bin/mail -s "testing at job" root < /root/.bashrc 
at> <EOT>    <==这里输入[ctrl] + d就会出现<EOF>的字样!代表结束!
job 2 at Thu Jul 30 19:35:00 2015
# 上面这行资讯在说明,第2 个at 工作将在2015/07/30 的19:35 进行!

范例二:查询上述的 job 2
[root@study ~]# at -c 2 
#!/bin/sh                <==就是透过bash shell的啦!
# atrun uid=0 gid=0
# mail root 0
umask 22
....(中间省略许多的环境变数项目)....
cd /etc/cron\.d || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER410efc26'
/bin/mail -s "testing at job" root < /root/.bashrc     #这一行最重要!
marcinDELIMITER410efc26 
#你可以看到指令执行的目录(/root),还有多个环境变数与实际的指令内容啦!

范例三:由于机房预计于2015/08/05停电,我想要在2015/08/04 23:00关机?
[root@study ~]# at 23:00 2015-08-04 
at> /bin/sync 
at> /bin/sync 
at> /sbin/shutdown -h now
at> <EOT>
job 3 at Tue Aug 4 23:00:00 2015
# 您瞧瞧!at 还可以在一个工作内输入多个指令呢!不错吧!

atq/atrm 取消任务

atq/atrm可以取消at设置的定时任务

[root@study ~]# atq 
[root@study ~]# atrm (jobnumber)

范例一:查询目前主机上面有多少的at工作排程?
[root@study ~]# atq
3 Tue Aug 4 23:00:00 2015 a root
# 上面说的是:『在2015/08/04 的23:00 有一项工作,该项工作指令下达者为 
# root』而且,该项工作的工作号码(jobnumber) 为3 号喔!

范例二:将上述的 job 3 移除!
[root@study ~]# atrm 3 
[root@study ~]# atq 
#没有任何资讯,表示该工作被移除了!

awk文件处理

awk会对文本的每一行执行脚本,输出内容

语法:

awk '{pattern + action}' {filenames}

几个参数:

  • -F: 指定分隔符号,可以使用正则

可以直接使用的变量:

  • $0: 当前整行
  • $1: 按照FS分隔符分割后的第一个字段;$2,$3....对应第2,3个字段
  • FS: 字段分隔符
  • NF: 此行按照分隔符分割后的字段数量
  • NR: 当前行数
  • RS: 每行的分隔符,比如\n

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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

指定分隔符(正则表达式),打印字段1和字段2(两个字段用空格间隔开):

[wztshine@localhost ~]$ awk -F '[/:]+' '{print $1 " " $2}' /etc/passwd
root x
bin x
daemon x
adm x
lp x
sync x
...

在上面示例的基础上,显示行号,并加上行的分割符:

[wztshine@localhost ~]$ awk -F '[/:]+' '{print $1" " $2 " " NR " " RS}' /etc/passwd
root x 1 

bin x 2 

daemon x 3 

adm x 4 

lp x 5 
...

显示10-20行:

[wztshine@localhost ~]$ awk '{if(NR>10 && NR<20) print $0 "  " NR}' /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin  11
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin  12
nobody:x:99:99:Nobody:/:/sbin/nologin  13
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin  14
dbus:x:81:81:System message bus:/:/sbin/nologin  15
polkitd:x:999:998:User for polkitd:/:/sbin/nologin  16
libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin  17
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin  18
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin  19

BEGIN,END

正常的awk都是从第一行开始执行,到最后一行停止。但是如果你想在执行第一行之前,初始化一些东西,在执行完最后一行之后,再额外扫尾一些东西,就需要BEGIN,END,它们可以在执行之前,还有之后,完成一些操作。

示例:初始化时打印:start to process,结束时打印:finished.

[wztshine@localhost ~]$ awk 'BEGIN{print "start to process"} {print $0} END{print "finished."}' /etc/passwd
start to process                     # 这里
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
....
finished.                           # 这里

B

batch 定时任务

batch也是制定定时任务,但是它的任务,只有当系统资源占用小于0.8时,才自动执行

$ batch 
at> /usr/bin/updatedb
at> <EOT>
job 4 at Thu Jul 30 19:57:00 2015

badblocks 硬盘监测

badblocks命令用于检查磁盘装置中损坏的区块。

语法:

badblocks [-svw][-b <区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块]

参数说明:

  • -b<区块大小> 指定磁盘的区块大小,单位为字节。
  • -o<输出文件> 将检查的结果写入指定的输出文件。
  • -s 在检查时显示进度。
  • -v 执行时显示详细的信息。
  • -w 在检查时,执行写入测试。
  • [磁盘装置] 指定要检查的磁盘装置。
  • [磁盘区块数] 指定磁盘装置的区块总数。
  • [启始区块] 指定要从哪个区块开始检查。

示例:

[root@bogon ~]# badblocks -sv /dev/sda
正在检查从 0 到 31457279的块
Checking for bad blocks (read-only test): ^C4.24% done, 0:11 elapsed. (0/0/0 errors)

basename 最后一层目录/文件名

示例:

$ basename /a/b/c/d
d

bg 任务放进后台执行

ctrl +z 的后台任务默认是 暂停状态。bg可以让后台任务run起来。

$ bg %jobNumber

示例:

[root@bogon ~]# ./t.sh                # 运行脚本
Hello world
^Z                                   # 放到后台
[1]+  已停止               ./t.sh     # 任务放到后台,并暂停了
[root@bogon ~]# bg %1                # 执行命令
[1]+ ./t.sh &
[root@bogon ~]# jobs                 # 查看任务
[1]+  运行中               ./t.sh &    # 运行起来了

blkid 设备id

列出设备的UUID(universally unique identifier)

[root@study ~]# blkid 
/dev/vda2: UUID="94ac5f77-cb8a-495e-a65b-2ef7442b837c" TYPE="xfs" 
/dev/vda3: UUID="WStYq1-P93d-oShM-JNe3-KeDl-bBf6 -RSmfae" TYPE="LVM2_member" 
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat" 

bzip2 压缩文件

用法与 gzip 类似,但是比gzip好用(压缩比更高),默认会删除源文件,仅保留压缩后的压缩包。只能压缩文件,不能打包。

bzip2 [-cdkzvf#] 档名 

选项与参数:

  • -c :将压缩后的文件输出到屏幕,使用重定向‘>'输出到文件
  • -d :解压缩的参数
  • -k :保留原始档案,而不会删除原始的档案喔!
  • -z :压缩的参数(预设值,可以不加)
  • -v :可以显示出原档案/压缩档案的压缩比等资讯;
  • -f :压缩或解压缩时,强制覆盖原有文件 (默认是不覆盖)
  • -# :与gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

示例:-c

[root@bogon ~]# bzip2 -cv t.sh > t.bz
  t.sh:     0.582:1, 13.739 bits/byte, -71.74% saved, 46 in, 79 out.

示例:-v

[root@bogon ~]# bzip2 -v t.sh
  t.sh:     0.582:1, 13.739 bits/byte, -71.74% saved, 46 in, 79 out.

示例:-d 解压

[root@bogon ~]# bzip2 -d t.sh.bz2
[root@bogon ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  temp  t.sh

bzcat 查看bzip2压缩的文件

bzcat 可以直接查看压缩包内部的文件,并将文件内容显示到stdout

[root@bogon ~]# bzcat t.sh.bz2
echo 'Hello world'        # 文件的内容
sleep 3m
echo 'I love you'

C

cat 查看文档

cat [-AbEnTv] file

选项与参数:

  • -A :相当于-vET 的整合选项,可列出一些特殊字符而不是空白而已;
  • -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
  • -E :将结尾的断行字符$ 显示出来;
  • -n :列印出行号,连同空白行也会有行号,与-b 的选项不同;
  • -T :将[tab] 按键以^I 显示出来;
  • -v :列出一些看不出来的特殊字符

示例:-A,注意每句后面的$符号

[root@bogon temp]# cat -A t.sh
echo 'Hello world'$
sleep 3m$
echo 'I love you'$

-n,显示行号

[root@bogon temp]# cat -n t.sh
     1	echo 'Hello world'
     2	sleep 3m
     3	echo 'I love you'

chattr 修改隐藏属性

查看设置的属性,可以用 lsattr

chattr [-RV] [+-=] [ASacdistu] 档案或目录名称

选项与参数:

R:递归执行

V:显示执行过程

+:增加某一个特殊参数,其他原本存在参数则不动。

-:移除某一个特殊参数,其他原本存在参数则不动。

=:设定一定,且仅有后面接的参数

A :当设定了A 这个属性时,若你有存取此档案(或目录)时,他的存取时间atime 将不会被修改,可避免I/O 较慢的机器过度的存取磁碟。(目前建议使用档案系统挂载参数处理这个项目)

S :一般档案是非同步写入磁碟的(原理请参考前一章sync的说明),如果加上S这个属性时,当你进行任何档案的修改,该更动会『同步』写入磁碟中。

a :只能增加资料,而不能删除也不能修改资料,只有root 才能设定这属性

c :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)

d :当dump 程序被执行的时候,设定d 属性将可使该档案(或目录)不会被dump 备份

i :让一个档案不能被删除、改名、设定连结也无法写入或新增资料!对于系统安全性有相当大的助益!只有root 能设定此属性

s :当档案设定了s 属性时,如果这个档案被删除,他将会被完全的移除出这个硬碟空间, 所以如果误删了,完全无法救回来了喔!

u :与s 相反的,当使用u 来设定档案时,如果该档案被删除了,则资料内容其实还存在磁碟中,可以使用来救援该档案喔!

注意1:属性设定常见的是a 与i 的设定值,而且很多设定值必须要身为root 才能设定

注意2:xfs 档案系统仅支援AadiS 而已

示例:

[root@bogon temp]# chattr +i t.sh       # 添加 i 属性
[root@bogon temp]# lsattr               # 查看属性
----i----------- ./t.sh

[root@bogon temp]# rm t.sh             # 尝试删除
rm:是否删除普通文件 "t.sh"?y
rm: 无法删除"t.sh": 不允许的操作           # 提示无法删除

chage 修改密码参数

修改账号的密码参数

chage [-ldEImMW] 帐号名

选项与参数:

  • -l :列出该帐号的详细密码参数;
  • -d :后面接日期,修改shadow 第三栏位(最近一次更改密码的日期),格式YYYY-MM-DD
  • -E :后面接日期,修改shadow 第八栏位(帐号失效日),格式YYYY-MM-DD
  • -I :后面接天数,修改shadow 第七栏位(密码失效日期)
  • -m :后面接天数,修改shadow 第四栏位(密码最短保留天数)
  • -M :后面接天数,修改shadow 第五栏位(密码多久需要进行变更)
  • -W :后面接天数,修改shadow 第六栏位(密码过期前警告日期)

示例:-l ,查询账号信息

[root@bogon temp]# chage -l wztshine
最近一次密码修改时间					:从不
密码过期时间					:从不
密码失效时间					:从不
帐户过期时间						:从不
两次改变密码之间相距的最小天数		:0
两次改变密码之间相距的最大天数		:99999
在密码过期之前警告的天数	:7

chsh 改变shell

改变当前用户的shell

chsh [-ls] 
选项与参数:
-l :列出目前系统上面可用的shell ,其实就是/etc/shells 的内容!
-s :设定修改自己的Shell

示例:

[root@bogon temp]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh


[root@bogon temp]# chsh -s /usr/bin/sh
Changing shell for root.
Shell changed.

chgrp :改变档案所属群组

chgrp [群组名] [-R] dirname/filename

-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有档案、目录
     都更新成为这个群组之意。常常用在变更某一目录内所有的档案之情况。

示例:

可以通过 cat /etc/group 查看系统有哪些群组

[root@bogon temp]# chgrp wztshine test
[root@bogon temp]# ls -l
总用量 4
-rw-r--r--. 1 root wztshine  0 9月   3 21:46 test

chown :改变档案拥有者

chown [用户名] [-R] file
chown [用户名].[群组名] file  # 同时更改用户和群组,.可以用:代替。

-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有档案都变更

示例:

[root@bogon temp]# chown wztshine test
[root@bogon temp]# ls -l
总用量 4
-rw-r--r--. 1 wztshine wztshine  0 9月   3 21:46 test

chmod :改变档案的权限

r:4 w:2 x:1

owner-group-others

  • 对档案来讲:
    • r:可读取此一档案的实际内容,如读取文字档的文字内容等;
    • w:可以编辑、新增或者是修改该档案的内容(但不含删除该档案);
    • x:该档案具有可以被系统执行的权限。
  • 对目录来说:
    • r (read contents in directory) 读取文件夹的内容
    • w (modify contents of directory) 修改文件夹的内容(增,删,重命名)
    • x (access directory) 进入此文件夹
  • 要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给;

语法:

chmod [-R] 770 档案或目录
选项与参数:
777 : 就是刚刚提到的数字类型的权限属性,为rwx 属性数值的相加。
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有档案都会变更
  • user (u):具有可读、可写、可执行的权限;
  • group 与others (g/o):具有可读与执行的权限。
命令 user,group,others,all +(加入) -(除去) =(设定) r w x 档案或目录
chmod u,g,o,a +,-,= r,w,x file/folder
[root@bogon temp]# ll
总用量 4
-rw-r--r--. 1 wztshine wztshine  0 9月   3 21:46 test         # 当前用户没有 x 权限

[root@bogon temp]# chmod u+x test                            # 添加 x 权限
[root@bogon temp]# ll
总用量 4
-rwxr--r--. 1 wztshine wztshine  0 9月   3 21:46 test        # 有权限了

clear 清屏

清空 Linux 屏幕上所有的信息。

chpasswd 修改密码

读入未加密前的密码,并且经过加密后, 将加密后的密码写入/etc/shadow 当中

假设系统当中有个使用者帐号为vbird3 ,我想要更新他的密码(update) , 假如他的密码是abcdefg 的话,那么:

# echo "vbird3:abcdefg" | chpasswd

cmp 二进制对比

cmp对比两个文件,按照 位 对比,可以比对binary file ,另一个文本对比命令是 diff

cmp [-l] file1 file2 

选项与参数:

  • -l :将所有的不同点的位元组处都列出来。因为cmp 预设仅会输出第一个发现的不同点。

col 字符过滤

col 接受从 stdin 的数据,可以过滤掉控制字符,并将结果显示到 stdout 上。

col [-bfx][-l<缓冲区列数>] 

参数

  • -b 过滤掉所有的控制字符,包括RLF和HRLF。
  • -f 滤除RLF字符,但允许将HRLF字符呈现出来。
  • -x 以多个空格字符来替换 tab 键
  • -l<缓冲区列数> 预设的内存缓冲区有128列,您可以自行指定缓冲区的大小。

示例:将说明文档转存到文件

[root@bogon temp]# man col | col -b > col.txt

cp 复制

cp 可以复制一个文件到另一个文件,也可以复制多个文件到文件夹。

cp [-adfilprsu] 来源档 目标档
cp [options] source1 source2 source3 .... directory 
  • 选项与参数:

    • -a :相当于-dr --preserve=all,同时复制文档的所有属性 (常用)
    • -d :若来源档为连结档(link file),则复制连结档属性而非档案本身(不加此参数,则复制文档本身)
    • -f :为强制(force)的意思,覆盖已存在文件
    • -i :若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
    • -l :进行硬式连结(hard link)的连结档建立,而非复制档案本身;
    • -p :连同档案的属性(权限、用户、时间)一起复制过去(备份常用);(通常来说,不加-p选项,复制后的目标档的权限、用户,都是当前用户)
    • -r :递回持续复制,用于目录的复制行为;(常用)
    • -s :复制成为符号连结档(symbolic link),亦即『链接』档案;
    • -u :destination 比source 旧才更新destination,或destination 不存在的情况下才复制。
    • --preserve=all :除了-p 的权限相关参数外,还加入SELinux 的属性, links, xattr 等也复制了。
    • 最后需要注意的,如果来源档有两个以上,则最后一个目的档一定要是『目录』才行!

示例:复制连结档

[root@bogon temp]# cp -d test.ln test.ln2                          # 复制连结档
[root@bogon temp]# ll
总用量 8
-rwxr--r--. 1 wztshine wztshine 18 9月   3 21:55 test
lrwxrwxrwx. 1 root     root      4 9月   3 22:05 test.ln -> test
lrwxrwxrwx. 1 root     root      4 9月   3 22:05 test.ln2 -> test   # 确实是连结档

cpio 存取归档包的文件

cpio可以备份任何东西,包括装置设备档案,不过cpio有个大问题,那就是cpio不会主动的去找档案来备份,要配合类似 find 等可以找到档名的指令来告知cpio该被备份的资料在哪里。

注意!备份时 cpio 不会理会你给的是绝对路径还是相对路径的档名,所以如果你加上绝对路径的/开头,那么未来解开的时候,它就一定会覆盖掉原本的路径!

cpio -ovcB > [file|device]   <==备份 
cpio -ivcdu < [file|device]  <==还原 
cpio -ivct < [file|device]   <==察看

备份会使用到的选项与参数:

  • -o :将资料copy 输出到档案或装置上
  • -B :让预设的Blocks 可以增加至5120 bytes ,预设是512 bytes ! 这样的好处是可以让大档案的储存速度加快

还原会使用到的选项与参数:

  • -i :将资料自档案或装置copy 出来系统当中
  • -d :自动建立目录!使用cpio 所备份的资料内容不见得会在同一层目录中,因此我们必须要让cpio 在还原时可以建立新目录,此时就得要-d 选项的帮助!
  • -u :自动的将较新的档案覆盖较旧的档案!
  • -t :需配合-i 选项,可用在"察看"以cpio 建立的档案或装置的内容

一些可共用的选项与参数:

  • -v :让储存的过程中档案名称可以在屏幕上显示
  • -c :一种较新的portable format 方式储存

备份:

find boot | cpio -ocvB > /tmp/boot.cpio       
# 注意,find boot,不是 find /boot,这样就不是绝对路径了,解压时也就不会覆盖 /boot 了

解压:

cpio -idvc < /tmp/boot.cpio 

crontab 循环定时任务

crontab 可以设置定时任务,让任务每隔多久执行一次,注意,它的 stdout,stderr 都是发送到邮箱的,而不是输出到屏幕,如想输出到屏幕,请使用: echo ‘text’ > /dev/tty1

crontab 会根据 /etc/cron.allow 和 /etc/cron.deny 判断用户是否有权限设置任务。

/var/spool/cron/[username] :记录了每个用户设置的任务。

/var/log/cron :执行任务的记录

crontab 有三个设定档可以配置任务:

  • /etc/crontab : 系统例行事务,不针对某个用户

  • /etc/cron.d/* :周期任务,里面有几个设置如:0hourly,可以将可执行脚本放到相应的目录下,就会每小时执行一次

    • [root@study ~]# cat /etc/cron.d/0hourly
      # Run the hourly jobs
      SHELL=/bin/bash
      PATH=/sbin:/bin:/usr/sbin:/usr/bin
      MAILTO=root
      01 * * * * root run-parts /etc/cron.hourly  # 意思是每小时执行一次/etc/cron.hourly目录下的任务脚本
      
  • /var/spool/cron/* : 各个用户的例行事务

语法:

crontab [-u username] [-l|-e|-r] 

选项与参数:
-u :只有root 才能进行这个任务,亦即帮其他使用者建立/移除crontab 工作排程;
-e :编辑crontab 的工作内容,也就是编辑、添加任务
-l :查阅crontab 的工作内容
-r :移除所有的crontab 的工作内容,若仅要移除一项,请用-e 去编辑。

示例:

范例一:用dmtsai的身份在每天的12:00发信给自己 
[dmtsai@study ~]$ crontab -e 
#此时会进入vi的编辑画面让您编辑工作!注意到,每项工作都是一行。
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc 
#分时日月周 |<==============指令串=== =====================>|,周与日月不可同时存在!


查询和删除:
[dmtsai@study ~]$ crontab -l
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc
59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
*/5 * * * * /home/dmtsai/test.sh
30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt

# 注意,若仅想要移除一项工作而已的话,必须要用crontab -e 去编辑~
#如果想要全部的工作都移除,才使用crontab -r喔!
[dmtsai@study ~]$ crontab -r 
[dmtsai@study ~]$ crontab -l
no crontab for dmtsai
代表意义 分钟 小时 日期 月份 指令
数字范围 0-59 0-23 1-31 1-12 0-7 就是指令啊
特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是* , 就代表着『不论何月、何日的礼拜几的12:00 都执行后续指令』的意思!
,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是3:00 与6:00 时,就会是:0 3,6 * * * command时间参数还是有五栏,不过第二栏是3,6 ,代表3 与6 都适用!
-(减号) 代表一段时间范围内,举例来说, 8 点到12 点之间的每小时的20 分都进行一项工作:20 8-12 * * * command仔细看到第二栏变成8-12 喔!代表8,9,10,11,12 都适用的意思!
/n(斜线) 那个n 代表数字,亦即是『每隔n 单位间隔』的意思,例如每五分钟进行一次,则: */5 * * * * command很简单吧!用 * 与/5 来搭配,也可以写成 0-59/5 ,相同意思!

cd 切换目录

cd [相对路径或绝对路径]

选项:

  • -: 返回上次路径(类似于后退,从哪儿来回哪儿去)
  • ~:当前用户的家目录
  • .. : 上层目录
  • / : 根目录

示例:

[root@study dmtsai]# cd ~ 
#表示回到自己的家目录,亦即是/ root这个目录 

[root@study ~]# cd 
#没有加上任何路径,也还是代表回到自己家目录的意思喔!

[root@study ~]# cd .. 
#表示去到目前的上层目录,亦即是/root的上层目录的意思; 

[root@study /]# cd - 
#表示回到刚刚的那个目录,也就是/root啰~ 

[root@study ~]# cd /var/spool/mail 
#这个就是绝对路径的写法!直接指定要去的完整路径名称!

[root@study mail]# cd ../postfix
# 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写!

cut 截取信息

cut 可以后接文件,选取文件的某个区域的信息。如果没有文件,cut 接受从 stdin 输入的数据,显示到 stdout 上。

cut -d '分隔字符' -f fields [file]    <==指定分隔字符: echo '12 34' | cut -d ' ' -f2  ; 结果:34
cut -c 字符区间                       # 截取哪几个字符:echo '12345' | cut -c 2-4  ; 结果:234

选项与参数:

  • -d :自定义分隔字符。与-f 一起使用,默认分隔符是 tab
  • -f :依据-d 的分隔字符将一段讯息分割成为数段,用-f 取出第几段,数字的格式有
    • num:第几段
    • num1,num2,num3:哪几个
    • num1-num2 :从第num1个到第num2个
  • -c :以字符(characters) 的单位取出固定字符区间;格式和 -f 一样。(和 -f 只能同时使用一个!!!)

示例:后面指定文件

[root@bogon temp]# cat t.sh                 # 查看原始文件
echo 'Hello world'
sleep 3m
echo 'I love you'

[root@bogon temp]# cut -d ' ' -f2 t.sh      # 截取文件第 2 区域的信息
'Hello
3m
'I

D

dd 转换和拷贝文件

dd命令用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

dd if="input_file" of="output_file" bs="block_size" count="number" 

选项与参数:

  • if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >

  • of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >

  • ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。

    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

    bs=bytes:同时设置读入/输出的块大小为bytes个字节。

  • cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。

  • skip=blocks:从输入文件开头跳过blocks个块后再开始复制。

  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。

    • 注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
  • count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

  • conv=conversion:用指定的参数转换文件。

    • ascii:转换ebcdic为ascii
    • ebcdic:转换ascii为ebcdic
    • ibm:转换ascii为alternate ebcdic
    • block:把每一行转换为长度为cbs,不足部分用空格填充
    • unblock:使每一行的长度都为cbs,不足部分用空格填充
    • lcase:把大写字符转换为小写字符
    • ucase:把小写字符转换为大写字符
    • swab:交换输入的每对字节
    • noerror:出错时不停止
    • notrunc:不截短输出文件
    • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

示例:

[root@bogon temp]# dd of=ucase.txt conv=ucase      # 从标准输入录入信息,转换成大写
hello world
记录了0+1 的读入
记录了0+1 的写出
12字节(12 B)已复制,10.4715 秒,0.0 kB/秒
[root@bogon temp]# cat ucase.txt                  # 查看文件,是大写的
HELLO WORLD
$ dd if=/tmp/system.iso of=/dev/sda 

diff 对比工具

diff命令用于比较文件的差异。diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录,除非使用 -r 参数。

  • -b :忽略空格数量(多个空格和一个空格)
  • -B:忽略空行变化
  • -c :显示全文,并标出不同之处。(上下文模式)
  • -u:合并模式查看
  • -C <行数>或--context <行数> :上下文模式,并在不同处的前后各多显示几行上下文,默认3行。
  • -l <字符或字符串>或--ignore-matching-lines <字符或字符串> :若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
  • -i或--ignore-case  不检查大小写的不同。
  • -l或--paginate  将结果交由pr程序来分页。
  • -r或--recursive  比较子目录中的文件。
  • -s或--report-identical-files  若没有发现任何差异,仍然显示信息。
  • -U<列数>或--unified=<列数> :合并模式,并在不同处的前后多显示几行上下文,默认3行。
  • -w或--ignore-all-space  忽略全部的空格字符。
  • -W<宽度>或--width<宽度>  在使用-y参数时,指定栏宽。
  • -x<文件名或目录>或--exclude<文件名或目录>  不比较选项中所指定的文件或目录。
  • -y或--side-by-side  以并列的方式显示文件的异同之处。
  • --left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
  • --suppress-common-lines  在使用-y参数时,仅显示不同之处。

示例:

新建两个文件:f1,f2

f1:

a
a

f2:

a
b

正常模式查看:

缺点:看不出上下文的内容

[root@bogon temp]# diff f1 f2
2c2                # 2:f1的第2行,c:变化(a:增加,d:删除), 2:f2的第2行
< a                # <:删除该行, a:该行的内容
---                # 分隔符
> b                # >:增加该行, b:该行的内容

上下文模式查看:

缺点:能看到上下文,却又有点冗余

[root@bogon temp]# diff -c f1 f2
*** f1	2020-09-03 22:45:35.832845668 +0800    # "***"表示变动前的文件
--- f2	2020-09-03 22:45:47.148897521 +0800    # "---"表示变动后的文件
***************
*** 1,2 ****               # 从第 1 行开始,连续 2 行,记住是连续2行,不是到第二行哦
  a
! a                        # !:变化了; -:删除该行; +:新增该行
--- 1,2 ----
  a
! b

合并模式查看:

优缺点:只显示变动的部分,将两个文件合并显示。

[root@bogon temp]# diff -u f1 f2
--- f1	2020-09-03 22:45:35.832845668 +0800  # ---:变动前文件
+++ f2	2020-09-03 22:45:47.148897521 +0800  # +++:变动后文件
@@ -1,2 +1,2 @@          # -1,2: f1 文件的第 1 行开始,连续 2 行  ;  +1,2:f2的1开始连续2行
 a
-a                       # 第一个文件删除了该行,-:删除
+b                       # 第二个文件增加了该行,+:增加

其他示例:

范例一:以/tmp/testpw内的passwd.old与passwd.new制作补丁档案 
[dmtsai@study testpw]$ diff -Naur passwd.old passwd.new > passwd.patch 
[dmtsai@study testpw]$ cat passwd. patch 
--- passwd.old 2015-07-14 22:37:43.322535054 +0800   <==新旧档案的资讯
+++ passwd.new 2015-07-14 22:38:03.010535054 +0800
@@ -1,9 +1,8 @@   <==新旧档案要修改资料的范围,旧档在第1行开始的9行,新档在第1行开始的8行
 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
-sync:x:5:0:sync:/sbin:/bin/sync           <==左侧档案删除 
+no six line                               <==右侧新档加入
 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 halt:x:7:0:halt:/sbin:/sbin/halt
 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

diff显示的格式,可以参见:

http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

df 系统整体磁盘使用

df [-ahikHTm] [目录或档名] 

选项与参数:

  • -a :列出所有的档案系统,包括系统特有的/proc等档案系统;
  • -k :以KBytes的容量显示各档案系统;
  • -m :以MBytes的容量显示各档案系统;
  • -h :以人们较易阅读的GBytes, MBytes, KBytes等格式自行显示;
  • -H :以M=1000K取代M=1024K的进位方式;
  • -T :连同该partition的filesystem名称(例如xfs)也列出;
  • -i :不用磁碟容量,而以inode的数量来显示

示例:

[wztshine@bogon ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.4G     0  1.4G    0% /dev
tmpfs                    1.4G     0  1.4G    0% /dev/shm
tmpfs                    1.4G  9.5M  1.4G    1% /run
tmpfs                    1.4G     0  1.4G    0% /sys/fs/cgroup
/dev/mapper/centos-root   10G  6.5G  3.6G   65% /
/dev/sda4               1014M   33M  982M    4% /data/xfs
/dev/sda2               1014M  238M  777M   24% /boot
/dev/mapper/centos-home  5.0G  144M  4.9G    3% /home
tmpfs                    285M   20K  285M    1% /run/user/1000
/dev/sr0                  58M   58M     0  100% /run/media/wztshine/VBox_GAs_6.1.12

dirname 获取目录名

dirname 目录
dirname /a/b/c/d/e
/a/b/c/d

du 显示磁盘占用

du [-ahskm] 档案或目录名称

选项与参数:

  • -a :列出所有的档案与目录容量,因为预设仅统计目录底下的档案量而已。
  • -h :自动转换成人们易读的格式(G/M)来显示档案大小;
  • -s :显示目录的总和大小
  • -S :显示目录大小(不包含子目录),各级子文件夹大小
  • -k :以KBytes列出容量显示;
  • -m :以MBytes列出容量显示;

-s,-S,以及不加s的区别:

-s:只会列出文件夹的总大小

-S:会列出所有文件夹,每个文件夹的大小,都是文件夹下文档的大小(不包含子文件夹下的档案)

不加s:列出所有文件夹,但是每个文件夹的大小都包含了它内部的文件夹的大小。

结构为:sss/a sss/s/b

示例:sss文件夹下,有一个4M的文件;还有一个 s 文件夹,s里面有个100M的文件

$ du -sh sss
104M    sss # 总大小104M

$ du -Sh sss
100M    sss/s # 子文件夹大小100M
3.9M    sss 

$ du -h sss
100M    sss/s # 子文件夹的大小
104M    sss # 总文件夹的大小

dmesg 核心监测信息

系统在开机的时候,核心会去侦测系统的硬件。但是这些侦测的过程要不是没有显示在屏幕上,就是很飞快的在屏幕上一闪而逝!用 dmesg 可以读取这些信息。

示例:

[wztshine@bogon ~]$ dmesg
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.10.0-1127.13.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Jun 23 15:46:38 UTC 2020
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1127.13.1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bffeffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000bfff0000-0x00000000bfffffff] ACPI data

E

expand 将Tab转换成空格

将[tab] 按键转成空白键,可以接受 stdin,也可以后接文件。

expand [-t] file 

选项与参数:

-t :后面接数字。一般来说,一个tab 按键可以用8 个空白键取代。可以自行定义一个[tab] 按键代表多少个字符

示例:

[wztshine@bogon temp]$ cat t | expand -t 1
This is a key.
tab is is.

F

fg 将后台任务取出来

fg %jobnumber 
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个% 是可有可无的

示例:

[root@bogon temp]# nohup ./t.sh &                       # 创建一个后台任务
[1] 4380
[root@bogon temp]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@bogon temp]# jobs                               # 查看任务
[1]+  运行中               nohup ./t.sh &
[root@bogon temp]# fg %1                             # 取出 1 号任务
nohup ./t.sh                                         # 任务放到前台运行中

file 查看文档类型

file [fileName]

示例:

[root@study ~]# file ~/.bashrc 
/root/.bashrc: ASCII text   <==告诉我们是ASCII的纯文字档

find 查找

find [PATH] [option] [action] 
find   path   -option   [ -print ]   [ -exec -ok command ] {} \;
# -print是默认方法,可以不用写。-exec和-ok二选一,一个是直接执行后面的命令,一个是弹出确认后才执行后面的命令,{}代表前面 find 到的值,\;是固定格式,代表结束。
find . -type f -size +50M -exec rm -rf {} \;  # 代表删除50M以上大小的文件。

选项与参数:

  1. 与时间有关的选项:-atime, -ctime ,-mtime, -cmin, -amin, -mmin ;以-mtime 说明
    • -mtime n :n 为数字,意义为在n 天之前的『一天之内』更动过的档案;也就是n到n+1天内
    • -mtime +n :列出在n 天之前(不含n 天本身)被更动过内容的档案档名;
    • -mtime -n :列出在n 天之内(含n 天本身)被更动过内容的档案档名。
    • -newer file :file 为一个存在的档案,列出比file 还要新的档案档名
  2. 与使用者或群组名称相关:
    • -uid n :n 为数字,这个数字是使用者的帐号ID,亦即UID ,这个UID 是记录在/etc/passwd 里面与帐号名称对应的数字。
    • -gid n :n 为数字,这个数字是群组名称的ID,亦即GID,这个GID 记录在/etc/group
    • -user name :name 为使用者帐号名称喔!例如dmtsai
    • -group name:name 为群组名称喔,例如users ;
    • -nouser :寻找档案的拥有者不存在/etc/passwd 的人!
    • -nogroup :寻找档案的拥有群组不存在于/etc/group 的档案!当你自行安装软件时,很可能该软件的属性当中并没有档案拥有者!在这个时候,就可以使用-nouser 与-nogroup 搜寻。
  3. 与档案权限及名称有关的参数:
    • -depth: 深度优先(从最底层的文件夹开始搜索)

    • -regex pattern: 普通正则表达式,搜索的是全路径,并且需要转义 :? + { } ( )

      • 譬如:find . -regex ".*\(js\|json\)$" , 要对上面说的那些元字符进行转义才能正常使用
    • -regextype posix-extended -regex pattern : 指定正则表达式类型为扩展的正则表达式,不需要转义:

      • 譬如: find . -regextype posix-extended -regex ".*(js|json)$"
    • -maxdepth num: 限制搜索的最大深度(当前文件夹深度为1,多个参数时放在最前面)

    • -mindepth num: 搜索的最小深度(即从当前文件夹的深度为num的文件夹开始搜索)

    • -name pattern:搜寻档案名称符合 pattern 的文件

    • -iname pattern:忽略文件名的大小写

    • -path pattern, -ipath pattern : 查找路径,-ipath 忽略大小写

    • -size [+-]SIZE:搜寻比SIZE 还要大(+)或小(-)的档案。这个SIZE 的规格有:

      • c: 代表byte, k: 代表1024bytes,M,G;所以,要找比50KB还要大的档案,就是 -size +50k
    • -type TYPE :搜寻档案的类型为TYPE 的,类型主要有:一般正常文档(f), 装置档案(b, c), 目录(d), 连结档(l), socket (s), 及FIFO (p) 等属性。

    • -perm mode :权限 == mode 的档案,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的属性为4755 !

    • -perm -mode :搜寻档案权限『必须要全部囊括mode 的权限』的档案,举例来说,我们要搜寻-rwxr--r-- ,亦即0744 的档案,使用-perm -0744,当一个档案的权限为-rwsr-xr-x ,亦即4755 时,也会被列出来,因为-rwsr-xr-x 的属性已经囊括了-rwxr--r-- 的属性了。

    • -perm /mode :搜寻档案权限『包含任一mode 的权限』的档案,举例来说,我们搜寻 -rwxr-xr-x ,亦即 -perm /755 时,但一个档案属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在!

示例:

范例四:搜寻系统中不属于任何人的档案 
# find / -nouser 
# find /etc -name '*httpd*'

查找并删除:

[root@bogon temp]# find . -type f -iname 't.*' -ctime -3 -size -2M -ok rm {} \;
< rm ... ./t.sh > ? n         # 询问是否删除,回答n不删除

深度搜索:

$ find . -name 't*'
./t1
./t1/t2
./t1/t2/t3
./t1/t2/t3/t4
./t1/t2/t3/t4/t5
./t1/t2/t3/t4/t5/t6

$ find . -depth -name 't*'
./t1/t2/t3/t4/t5/t6
./t1/t2/t3/t4/t5
./t1/t2/t3/t4
./t1/t2/t3
./t1/t2
./t1

$ find . -maxdepth 2 -name 't*'
./t1
./t1/t2

$ find . -mindepth 4 -name 't*'
./t1/t2/t3/t4
./t1/t2/t3/t4/t5
./t1/t2/t3/t4/t5/t6

$ find . -mindepth 2 -maxdepth 4 -name 't*'
./t1/t2
./t1/t2/t3
./t1/t2/t3/t4

free 内存占用

free [-b|-k|-m|-g|-h] [-t] [-s Num -c Num] 
选项与参数:
-b :直接输入free 时,显示的单位是Kbytes,我们可以使用b(bytes), m(Mbytes)
      k(Kbytes), 及g(Gbytes) 来显示单位,也可以直接让系统自己指定单位(-h)
-t :显示内存与swap 的总量。
-s num:隔几秒刷新一次,实时状态。
-c num:刷新几次后退出。

示例:

[root@bogon temp]# free -m
              total        used        free      shared  buff/cache   available
Mem:           2845         685        1053          26        1107        1979
Swap:          1023           0        1023

fuser 查找档案的使用者

fuser [-umv] [-k [i] [-signal]] file/dir 
选项与参数:
-u :除了程序的PID 之外,同时列出该程序的拥有者;
-m :后面接的那个档名会主动的上提到该档案系统的最顶层,对umount 不成功很有效!
-v :可以列出每个档案与程序还有指令的完整相关性!
-k :找出使用该档案/目录的PID ,并试图以SIGKILL 这个讯号给予该PID;
-i :交互模式,用户手动确认后才执行后面的动作。
-signal:例如-1 -15 等等,若不加的话,预设是SIGKILL (-9) 啰!

示例:查看当前目录的使用

[root@bogon temp]# fuser -uv .
                     用户     进程号    权限   命令
/root/temp:          root       4277 ..c.. (root)bash

Access 那一栏,有个 c :

  • c :当前目录
  • e :可被触发为执行状态;
  • f :是一个被开启的档案;
  • r :根目录
  • F :该档案被开启了,不过在等待回应中;
  • m :可能为分享的动态函式库;

杀掉占用某个文件的进程:

[root@study ~]# fuser -mki /home 
/home: 31535c 31571c 31737c   #你会发现, PID跟上面查到的相同!
Kill process 31535 ? (y/N) #这里会问你要不要删除!当然不要乱删除啦!通通取消!

G

grep 查找字符串

grep [-abcEFGhHilLnqrsvVwxy][-A num][-B num][-C num][-d <进行动作>][-e <范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
  • -a 或 --text : 不要忽略二进制的数据。将binary 档案以text 档案的方式搜寻资料
  • -A num 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列,还显示该行之后num行的内容。
  • -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B num 或 --before-context=<显示行数> : 除了显示符合样式的那一行,并显示该行之前num行的内容。
  • -c 或 --count : 计算符合样式的列数。
  • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行,还显示该行前后 num 行的内容。
  • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -h 或 --no-filename : 不显示文件名称。
  • -H 或 --with-filename : 显示所属的文件名称。
  • -i 或 --ignore-case : 忽略字符大小写
  • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 --only-matching : 只显示匹配PATTERN 部分。
  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
  • -s 或 --no-messages : 不显示错误信息。
  • -v 或 --revert-match : 显示不包含匹配文本的所有行。
  • -V 或 --version : 显示版本信息。
  • -w 或 --word-regexp : 只显示全字符合的列。
  • -x --line-regexp : 只显示全列符合的列。
$ grep -v 'eig' a
one
two
three
four
five
six
seven
nine
ten

groups 查看群组

查看当前用户支持的群组,如果有多个群组,显示出来的第一个群组是当前用户的有效群组,也就是说当创建一个档案时,默认的群组就是这个。

groups [name]
[wztshine@bogon temp]$ groups wztshine
wztshine : wztshine wheel docker

切换群组,查看newgrp命令

groupadd 添加群组

groupadd [-g gid] [-r] 群组名称
选项与参数:
-g :后面接某个特定的GID ,用来直接给予某个GID ~
-r :建立系统群组,群组的 GID 与/etc/login.defs 内的GID_MIN 有关。
$ groupadd group1

login.defs文档:

MAIL_DIR /var/spool/mail   <==使用者预设邮件信箱放置目录

PASS_MAX_DAYS 99999     <==/etc/shadow内的第5栏,多久需变更密码日数 
PASS_MIN_DAYS 0         <==/etc/shadow内的第4栏,多久不可重新设定密码日数 
PASS_MIN_LEN 5         <==密码最短的字符长度,已被pam模组取代,失去效用!
PASS_WARN_AGE 7         <==/etc/shadow内的第6栏,过期前会警告的日数

UID_MIN 1000     <==使用者最小的UID,意即小于1000的UID为系统保留 
UID_MAX 60000     <==使用者能够用的最大UID 
SYS_UID_MIN 201     <==保留给使用者自行设定的系统帐号最小值UID 
SYS_UID_MAX 999     <==保留给使用者自行设定的系统帐号最大值UID 
GID_MIN 1000     <==使用者自订群组的最小GID,小于1000为系统保留 
GID_MAX 60000     <==使用者自订群组的最大GID 
SYS_GID_MIN 201     <==保留给使用者自行设定的系统帐号最小值GID 
SYS_GID_MAX 999     <==保留给使用者自行设定的系统帐号最大值GID

CREATE_HOME yes       <==在不加-M及-m时,是否主动建立使用者家目录?
UMASK 077       <==使用者家目录建立的umask ,因此权限会是700 
USERGROUPS_ENAB yes       <==使用userdel删除时,是否会删除初始群组 
ENCRYPT_METHOD SHA512     <==密码加密的机制使用的是sha512这一个机制!

groupmod 修改群组

groupmod [-g gid] [-n new_name] 群组名
选项与参数:
-g :修改既有的GID 数字;
-n :修改既有的群组名称

示例:

将刚刚上个指令建立的group1名称改为mygroup , GID为201 :

# groupmod -g 201 -n mygroup group1 

groupdel 删除群组

如果要删除vbird1这个群组,要确认/etc/passwd内的帐号没有任何人使用该群组

groupdel [groupname]

gzip 压缩

gzip压缩后,原始文档就不存在了!

gzip 命令只能用来压缩文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件,并且每一个文件会单独压缩一个包。

gzip [-cdtv#] 档名 

选项与参数:

  • -c :将压缩后的资料输出到屏幕上,可用'>'重定向到压缩档。这种方法可以保留原文件。
  • -d :解压缩,解压缩后,会将压缩包删除。
  • -t :可以用来检验一个压缩档的一致性~看看档案有无错误;
  • -v :显示执行过程。
  • -r :递归压缩文件夹里的文件(只压缩文件)
  • -# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是-6

压缩:

[root@bogon temp]# ll
总用量 8
-rwxr--r--. 1 wztshine wztshine 18 9月   3 21:55 test
-rwxr-xr-x. 1 root     root     46 9月   3 21:21 t.sh
[root@bogon temp]# gzip -c test > test.gz
[root@bogon temp]# ll
总用量 12
-rwxr--r--. 1 wztshine wztshine 18 9月   3 21:55 test
-rw-r--r--. 1 root     root     41 9月   4 20:36 test.gz
-rwxr-xr-x. 1 root     root     46 9月   3 21:21 t.sh
[dmtsai@study tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz

解压:

[dmtsai@study tmp]$ gzip -d services.gz 
#不使用gunzip这个指令,不好背!使用gzip -d来进行解压缩!

H

head 读取文档前几行

head [-n number] 档案

参数:

  • 当 number 为正数和无符号数,代表取出文档的前 number 行
  • 当 number 为负数, 代表取出 开头到倒数第 number 行
$ cat a.txt
1
2
3
4
5
6
7
8
9
10


$ head -n 2 a.txt
1
2


$ head -n -2 a.txt
1
2
3
4
5
6
7
8

I

id 显示UID,GID

查看用户的 uid,gid,group等

id [username]
[root@study ~]# id dmtsai 
uid=1000(dmtsai) gid=1000(dmtsai) groups=1000(dmtsai),10(wheel)

J

jobs 查看后台任务

jobs [-lrs] 
选项与参数:
-l :除了列出job number 与指令串之外,同时列出PID 的号码;
-r :仅列出正在背景run 的工作;
-s :仅列出正在背景当中暂停(stop) 的工作。

示例:

[root@bogon temp]# jobs
[1]-  运行中               ./t.sh &
[2]+  已停止               vim t.sh
[root@bogon temp]# jobs -r
[1]-  运行中               ./t.sh &

& 后台执行

后台执行。

如果想将一个任务放到后台执行,可以用 &:

[root@study ~]# tar -zpcf /tmp/etc.tar.gz /etc & 
[1] 14432   <== [job number] PID
[root@study ~]# tar: Removing leading `/' from member names 
# 在中括号内的号码为工作号码(job number),该号码与bash 的控制有关。

任务完成会显示:

[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc

不想显示,可以将输出重定向:

[root@study ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 & 
[1] 14547

ctrl+z 将当前工作放到后台执行

使用 ctrl + z 放到后台的工作是暂停状态的。如果想要激活,可以使用 bg 命令

+号代表当前默认的 job 是它,如果使用fg命令将后台工作放置到前台,则默认取出来的就是这个带+的job

[root@study ~]# vim ~/.bashrc 
#在vim的一般模式下,按下[ctrl]-z这两个按键
[1]+ Stopped vim ~/.bashrc
[root@study ~]#    <==顺利取得了前景的操控权!
[root@study ~]# find / -print 
....(输出省略)....
# 此时屏幕会非常的忙碌!因为屏幕上会显示所有的档名。请按下[ctrl]-z 暂停
[2]+ Stopped find / -print

join 文档拼接

join可以将两个文档根据相同的栏位,拼接成一行,两个文档需要事先排序。类似于 excel 的 vlookup

join [-ti] file1 file2 

选项与参数:

  • -t :自定义分隔符;预设以空白字符分隔资料,并且比对『第一个栏位』的资料,如果两个档案相同,则将两笔资料联成一行
  • -i :忽略大小写的差异;

示例:

[root@bogon temp]# cat a
a 1
b 2
c 3
d 4

[root@bogon temp]# cat b
a one
b two
c three
d four

[root@bogon temp]# join a b
a 1 one
b 2 two
c 3 three
d 4 four

K

kill 结束进程或工作

kill 命令用于删除执行中的程序或工作。

kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看。

kill -signal [%jobnumber or PID]
kill -l                               # 列出所有信号
选项与参数:
-l :这个是L 的小写,列出目前kill 能够使用的讯号(signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示啰!用man 7 signal 可知:
  -1 :Hugup
  -2 :代表与由键盘输入[ctrl]-c 同样的动作;
  -9 :立刻强制删除一个工作;
  -15:以正常的程序方式终止一项工作。与-9 是不一样的。

示例:杀掉job

[root@bogon temp]# jobs
[2]+  已停止               vim t.sh
[root@bogon temp]# kill -9 %2

[2]+  已停止               vim t.sh
[root@bogon temp]# jobs
[2]+  已杀死               vim t.sh

常见信号:

代号 名称 内容
1 SIGHUP 启动被终止的程序,可让该PID 重新读取自己的设定档,类似重新启动
2 SIGINT 相当于用键盘输入[ctrl]-c 来中断一个程序的进行
9 SIGKILL 代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似vim会有.filename.swp 保留下来。
15 SIGTERM 以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个signal 也是没有用的。
19 SIGSTOP 相当于用键盘输入[ctrl]-z 来暂停一个程序的进行

killall

killall可以让用户通过 进程名 来杀掉进程。不像kill仅能用 pid 来杀。

killall [-iIe] [command name] 
选项与参数:
-i :interactive 的意思,互动式的,若需要删除时,会出现提示字符给使用者;
-e :exact 的意思,表示『后面接的command name 要一致』,但整个完整的指令
      不能超过15 个字符。
-I :指令名称(可能含参数)忽略大小写。

示例:

[root@bogon temp]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  3904  3251  0  80   0 - 58097 do_wai pts/0    00:00:00 su
4 S     0  3913  3904  0  80   0 - 29220 do_wai pts/0    00:00:00 bash
0 T     0  3970  3913  0  80   0 - 37464 do_sig pts/0    00:00:00 vim
0 R     0  3982  3913  0  80   0 - 38337 -      pts/0    00:00:00 ps

[root@bogon temp]# killall -i su
杀死 su(3904) ? (y/N) y

L

less 翻页查询

less fileName

可以输入的指令:

  • 空白键 :向下翻动一页;
  • [pagedown]:向下翻动一页;
  • [pageup] :向上翻动一页;
  • /字串 :向下搜寻『字串』的功能;
  • ?字串 :向上搜寻『字串』的功能;
  • n :重复前一个搜寻(/就是向下搜索,?就是向上搜索)
  • N :反向的重复前一个搜寻(/是向上搜索,?就是向下搜索)
  • g :前进到这个资料的第一行去;
  • G :前进到这个资料的最后一行去(注意大小写);
  • q :离开less 界面

ln 链接

建立链接文档

链接文档都没有复制一个新文档,只是添加链接而已。

硬链接:添加硬链接,相当于给原始文档添加一个 inode 号,当删除了源文件后,只是相当于删除了原始的inode,但是还剩下一个 inode,所以源文件其实并没有真正删除。

符号链接:添加符号链接,会生成一个新文件:这个文件只是指向了源文件,类似于windows的超链接,删除了原始文件后,超链接就打不开了(失效了)

ln file file1        # 建立硬链接
ln -s file file1     # 建立符号链接

locate / updatedb 查找文档路径

updatedb    # 更新库
locate [-irlS] keyword 

选项与参数:

  • -i :忽略大小写的差异;
  • -c :不输出档名,仅计算找到的档案数量
  • -l :仅输出几行的意思,例如输出五行则是-l 5
  • -S :输出locate 所使用的资料库档案的相关资讯,包括该资料库纪录的档案/目录数量等
  • -r :后面可接正则表达式的显示方式

ls 显示文件信息

ls显示文件夹或文件的信息

 ls [选项] [文件/文件夹]
  • 选项与参数:
    • -a :全部的档案,连同隐藏档(开头为.的档案)一起列出来(常用)
    • -A :全部的档案,连同隐藏档,但不包括. 与.. 这两个目录
    • -d :仅列出目录本身,而不是列出目录内的档案资料(常用)
    • -f :直接列出结果,而不进行排序(ls 预设会以档名排序!)
    • -F :根据档案、目录等资讯,给予附加资料结构,例如:
      *:代表可执行档; /:代表目录; =:代表socket 档案; |:代表FIFO 档案;
    • -h :将档案容量以人类较易读的方式(例如GB, KB 等等)列出来;
    • -i :列出inode 号码;
    • -l :长资料串列出,包含档案的属性与权限等等资料;(常用)
    • -n :列出UID 与GID 而非使用者与群组的名称(UID与GID会在帐号管理提到!)
    • -r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
    • -R :连同子目录内容一起列出来,等于该目录下的所有档案都会显示出来;
    • -S :以档案容量大小排序,而不是用档名排序;
    • -t :依时间排序,新的在前面
    • --color=never :不要依据档案特性给予颜色显示;
    • --color=always :显示颜色
    • --color=auto :让系统自行依据设定来判断是否给予颜色
    • --full-time :以完整时间模式(包含年、月、日、时、分) 输出
    • --time={atime,ctime} :输出access 时间或改变权限属性时间(ctime) ,而非内容变更时间(modification time)

示例:

[root@bogon temp]# ls --full-time
总用量 16
-rw-r--r--. 1 root     root     16 2020-09-04 20:42:28.482524419 +0800 a
-rw-r--r--. 1 root     root     27 2020-09-04 20:42:48.511704665 +0800 b
drwxr-xr-x. 2 root     root      6 2020-09-04 21:00:08.603656195 +0800 fold
-rwxr--r--. 1 wztshine wztshine 18 2020-09-03 21:55:21.344564335 +0800 test
-rwxr-xr-x. 1 root     root     46 2020-09-03 21:21:06.000000000 +0800 t.sh

lsattr 显示隐藏属性

显示 chattr 设置的隐藏属性

lsattr [-adR]档案或目录

选项与参数:

  • -a :将隐藏档的属性也秀出来;
  • -d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;
  • -R :连同子目录的资料也一并列出来!

示例:

[root@bogon temp]# chattr +i t.sh
[root@bogon temp]# lsattr t.sh
----i----------- t.sh

lsblk 显示磁盘信息

lsblk [-dfimpt] [device] 

选项与参数:

  • -d :仅列出磁碟本身,并不会列出该磁碟的分割资料
  • -f :同时列出该磁碟内的档案系统名称
  • -i :使用ASCII的线段输出,不要使用复杂的编码(再某些环境下很有用)
  • -m :同时输出该装置在/dev底下的权限资料(rwx的资料)
  • -p :列出该装置的完整档名!而不是仅列出最后的名字而已。
  • -t :列出该磁碟装置的详细资料,包括磁碟伫列机制、预读写的资料量大小等
[root@ study ~]# lsblk 
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 
sr0 11:0 1 1024M 0 rom 
vda 252:0 0 40G 0 disk              #一整颗磁盘
|-vda1 252:1 0 2M 0 part            # 划分的分区
|-vda2 252 :2 0 1G 0 part /boot 
`-vda3 252:3 0 30G 0 part
  |-centos-root 253:0 0 10G 0 lvm /            #在vda3内的其他档案系统 
  |-centos-swap 253:1 0 1G 0 lvm [SWAP] 
  `-centos-home 253:2 0 5G 0 lvm /home

lsof 列出程序使用的文件

相对于fuser 是由档案或者装置去找出使用该档案或装置的程序,反过来说,如何查出某个程序开启或者使用的档案与装置呢?呼呼!那就是使用 lsof

lsof [-aUu] [+d] 
选项与参数:
-a :And,条件同时成立才可以。
-U :仅列出Unix like 系统的socket 档案类型;
-u :后面接username,列出该使用者相关程序所开启的档案;如果是 ^username,意味着屏蔽某个用户的进程: 
	lsof -u ^root
-g : 后接群组,列出群组打开的文件信息
+d :后面接目录,亦即找出某个目录底下已经被开启的档案!
+D :后接目录,递归显示目录下的档案
-c : 后接 name,列出以 name 开头的程序打开的文件;可以多次使用,譬如: lsof -c mysql -c apache
-p : 后接一个或多个pid,以逗号隔开,显示进程占用的文件。也可以使用 ^pid 排除某个进程。
	lsof -p 123,245,567
	lsof -p ^123
-i : 显示所有网络连接
-i tcp : 显示所有的tcp 网络连接
-i udp :显示所有udp网络连接
-i :3306 :显示谁在占用3306端口
-i tcp:22 : 显示谁在占用tcp类型的22端口

示例:root的bash开启的档案

[root@study ~]# lsof -u root | grep bash
ksmtuned 781 root txt REG 253,0 960384 33867220 /usr/bin/bash
bash 13888 root cwd DIR 253,0 4096 50331777 /root
bash 13888 root rtd DIR 253,0 4096 128 /
bash 13888 root txt REG 253,0 960384 33867220 /usr/bin/bash
bash 13888 root mem REG 253,0 106065056 17331169 /usr/lib/locale/locale-archive

M

mail 邮件

寄、收mailbox 内的信件,一般来说, mailbox 都会放置在/var/spool/mail 里面,一个帐号一个mailbox (档案)。

寄信:mail -s "邮件标题" username@localhost

[root@study ~]# mail -s "nice to meet you" vbird1 
Hello, DM Tsai
Nice to meet you in the network.
You are so nice. byebye!
.     <==这里很重要喔,结束时,最后一行输入小数点.即可!
EOT
[root@study ~]#   <==出现提示字符,表示输入完毕了!

也可以写好邮件内容,重定向:mail -s "bashrc file content" dmtsai < ~/.bashrc

mknod 设置装置的档案

在Linux底下所有的装置都以档案来代表!但是那个档案如何代表该装置呢?就是透过档案的major与minor数值来替代的~所以,那个major与minor数值是有特殊意义的

mknod 装置档名 [bcp] [Major] [Minor] 

装置种类:

  • b :设定装置名称成为一个周边储存设备档案,例如磁碟等;
  • c :设定装置名称成为一个周边输入设备档案,例如鼠标/键盘等;
  • p :设定装置名称成为一个FIFO档案;
  • Major :主要装置代码;
  • Minor :次要装置代码;
范例:由上述的介绍我们知道/dev/vda10装置代码252, 10,请建立并查阅此装置 
[root@study ~]# mknod /dev/vda10 b 252 10 
[root@study ~]# ll /dev/vda10 
b rw-r--r--. 1 root root 252, 10 Jun 24 23:40 /dev/vda10
 #上面那个252与10是有意义的,不要随意设定啊!

范例:建立一个FIFO档案,档名为/tmp/testpipe 
[root@study ~]# mknod /tmp/testpipe p 
[root@study ~]# ll /tmp/testpipe 
prw-r--r--. 1 root root 0 Jun 24 23:44 /tmp/testpipe
 #注意啊!这个档案可不是一般档案,不可以随便就放在这里!
#测试完毕之后请删除这个档案吧!看一下这个档案的类型!是p喔!^_^

mkfs.xfs 格式化磁盘

mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] [-r parms] 装置名称

选项与参数:

关于单位:底下只要谈到『数值』时,没有加单位则为bytes值,可以用k,m,g,t,p (小写)等来解释,比较特殊的是s这个单位,它指的是sector的个数

  • -b :后面接的是block容量,可由512到64k,最大容量限制为Linux的4k
  • -d :后面接的是重要的data section的相关参数值,主要的值有:
    •   agcount=数值:设定需要几个储存群组的意思(AG),通常与CPU有关
      
    •   agsize=数值:每个AG设定为多少容量的意思,通常agcount/agsize只选一个设定即可
      
    •   file :指的是『格式化的装置是个档案而不是个装置』的意思!(例如虚拟磁碟) 
      
    •   size=数值:data section的容量,亦即你可以不将全部的装置容量用完的意思
      
    •   su=数值:当有RAID时,那个stripe数值的意思,与底下的sw搭配使用
      
    •   sw=数值:当有RAID时,用于储存资料的磁碟数量(须扣除备份碟与备用碟)
      
    •   sunit=数值:与su相当,不过单位使用的是『几个sector(512bytes大小)』的意思
      
    •   swidth=数值:就是su*sw的数值,但是以『几个sector(512bytes大小)』来设定
      
  • -f :如果装置内已经有档案系统,则需要使用这个-f来强制格式化才行!
  • -i :与inode有较相关的设定,主要的设定值有:
    • size=数值:最小是256bytes最大是2k,一般保留256就足够使用了!
    • internal=[0|1]:log装置是否为内建?预设为1内建,如果要用外部装置,使用底下设定
    • logdev=device :log装置为后面接的那个装置上头的意思,需设定internal=0才可!
    • size=数值:指定这块登录区的容量,通常最小得要有512个block,大约2M以上才行!
  • -L :后面接这个档案系统的标头名称Label name的意思!
  • -r :指定realtime section的相关设定值,常见的有:
    • extsize=数值:就是那个重要的extent数值,一般不须设定,但有RAID时,最好设定与swidth的数值相同较佳!最小为4K最大为1G 。
[root@study ~]#mkfs.xfs /dev/vda4 
meta-data=/dev/vda4        isize=256     agcount=4, agsize=65536 blks 
         = sectsz=512 attr=2, projid32bit=1 
         = crc=0 finobt=0 
data =                 bsize=4096    blocks =262144, imaxpct=25 
         = sunit=0 swidth=0 blks 
naming =version 2 bsize=4096 ascii-ci=0 ftype=0 
log =internal log bsize=4096 blocks=2560, version=2 
         = sectsz=512 sunit=0 blks, lazy-count=1 
realtime =none extsz=4096 blocks=0, rtextents=0 #很快格是化完毕!都用预设值!较重要的是inode与block的数值

mkfs.ext4

mkfs.ext4 [-b size] [-L label] 装置名称

选项与参数:

-b :设定block的大小,有1K, 2K, 4K的容量

-L :后面接这个装置的名称。

mv 移动、重命名

mv [options] source1 source2 source3 .... directory 
  • 选项与参数:
    • -f :force 强制的意思,如果目标档案已经存在,不会询问而直接覆盖;
    • -i :若目标档案(destination) 已经存在时,就会询问是否覆盖!
    • -u :若目标档案已经存在,且source 比较新,才会更新(update)

示例:重命名:

[root@bogon temp]# mv a c
[root@bogon temp]# ll
总用量 16
-rw-r--r--. 1 root     root     27 9月   4 20:42 b
-rw-r--r--. 1 root     root     16 9月   4 20:42 c         # 名字a变成c了

more 翻页查看

more file

可以输入的指令:

  • 空白键(space):代表向下翻一页;
  • Enter :代表向下翻『一行』;
  • /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
  • :f :立刻显示出档名以及目前显示的行数;
  • q :退出more界面
  • b 或[ctrl]-b :代表往回翻页,不过这动作只对档案有用,对管线无用。

mount 挂载

mount [-t 档案系统] 装置档名 挂载点

选项与参数:

  • -a :依照设定档/etc/fstab的资料将所有未挂载的磁碟都挂载上来
  • -l :单纯的输入mount会显示目前挂载的资讯。加上-l可增列Label名称!
  • -t :可以加上档案系统种类来指定欲挂载的类型。常见的Linux支援类型有:xfs, ext3, ext4, reiserfs, vfat, iso9660(光碟格式), nfs, cifs, smbfs (后三种为网路档案系统类型)
  • -n :在预设的情况下,系统会将实际挂载的情况即时写入/etc/mtab中,以利其他程式的运作。但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用-n选项。
  • -o :后面可以接一些挂载时额外加上的参数!比方说帐号、密码、读写权限等:
    • async, sync:此档案系统是否使用同步写入(sync)或非同步(async)的内存机制,预设为async。
    • atime,noatime:是否修订档案的读取时间(atime)。为了效能,某些时刻可使用noatime
    • ro, rw:挂载档案系统成为唯读(ro)或可读写(rw)
    • auto, noauto:允许此filesystem被以mount -a自动挂载(auto)
    • dev, nodev:是否允许此filesystem上,可建立装置档案?dev为可允许
    • suid, nosuid:是否允许此filesystem含有suid/sgid的档案格式?
    • exec, noexec:是否允许此filesystem上拥有可执行binary档案?
    • user, nouser:是否允许此filesystem让任何使用者执行mount ?一般来说,mount仅有root可以进行,但下达user参数,则可让一般user也能够对此partition进行mount 。
    • defaults:预设值为:rw, suid, dev, exec, auto, nouser, and async
    • remount:重新挂载,这在系统出错,或重新更新参数时,很有用!
范例:将/重新挂载,并加入参数为rw与auto 
[root@study ~]# mount -o remount,rw,auto /

loop 挂载光碟、镜像文档

[root@study ~]# mkdir /data/centos_dvd 
[root@study ~]# mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd 
[root@study ~]# df / data/centos_dvd 
Filesystem 1K-blocks Used Available Use% Mounted on 
/dev/loop0 4050860 4050860 0 100% /data/centos_dvd #就是这个项目!.iso映象档内的所有资料可以在/data/centos_dvd看到!

创建映像并挂载:

[root@study ~]# dd if=/dev/zero of=/srv/loopdev bs=1M count=512
[root@study ~]# mkfs.xfs -f /srv/loopdev 
[root@study ~]# blkid /srv/loopdev 
/srv/loopdev: UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" TYPE="xfs "

[root@study ~]# mount -o loop UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" /mnt 

自动挂载上述映像:

[root@study ~]# nano /etc/fstab 
/srv/loopdev /data/file xfs defaults ,loop    0 0 

mkdir 创建目录

 mkdir [-mp] 目录名称
选项与参数:
-m :设置文档权限
-p :循环建立文件夹(创建多层文件夹)

实例:

$ mkdir -m 711 -p /a/b/c

mkisofs 创建光盘映像

mkisofs [-o 映像档] [-Jrv] [-V vol] [-m file] 待备份档案... -graft-point isodir=systemdir ... 

选项与参数:

  • -o :后面接你想要产生的那个映像档档名。
  • -J :产生较相容于windows 机器的档名结构,可增加档名长度到64 个unicode 字符
  • -r :透过Rock Ridge 产生支援Unix/Linux 的档案资料,可记录较多的资讯(如UID/GID等) ;
  • -v :显示建置ISO 档案的过程
  • -V vol :建立Volume,有点像Windows 在档案总管内看到的CD title 的东西
  • -m file :-m 为排除档案(exclude) 的意思,后面的档案不备份到映像档中,也能使用* 万用字符喔
  • -graft-point:可以设置目录。(不使用这个参数,会将所有文件放置到光盘映像的根目录,通过这个参数,可以设置光盘目录,格式:光盘路径=系统上的路径)

创建光盘映像:

$ mkisofs -r -V 'linux_file' -o /tmp/system.img -m /root/etc -graft-point /root=/root /home=/home /etc=/etc 

N

nl 行号打印

nl [-bnw] 档案

选项与参数:

  • -bt :如果有空行,空的那一行不要列出行号(预设值);
  • -ba :表示不论是否为空行,也同样列出行号(类似cat -n);
  • -n ln :行号在屏幕的最左方显示;
  • -n rn :行号在自己栏位的最右方显示,且不加0 ;
  • -n rz :行号在自己栏位的最右方显示,且加0 ;
  • -w 数字 :行号栏位的宽度
[root@study ~]# nl -ba -n rz -w 3 /etc/issue
001 \S
002 Kernel \r on an \m
003
# 变成仅有3 位数啰~

newgrp 登录一个新群组

切换群组,注意它是新开了一个shell环境(子进程),当你用完以后,exit 退出,就又可以回到原来的环境了。

newgrp [群组名]

示例:

[wztshine@bogon temp]$ groups                # 查看一下当前群组,默认是wztshine
wztshine wheel docker
[wztshine@bogon temp]$ newgrp wheel         # 切换到 wheel 群组
[wztshine@bogon temp]$ touch f1             # 创建文件
[wztshine@bogon temp]$ ll
总用量 0
-rw-r--r--. 1 wztshine wheel 0 9月   4 21:12 f1       # 文件的群组是 wheel 了哦
[wztshine@bogon temp]$ groups                       # 查看群组,第一个变成 wheel 了
wheel docker wztshine
[wztshine@bogon temp]$ exit                     # 退出这个shell
exit
[wztshine@bogon temp]$ groups                  # 又变回原来的群组了 wztshine
wztshine wheel docker

netstat 网络状态

netstat -[atunlp] 
选项与参数:
-a :将目前系统上所有的连线、监听、Socket 资料都列出来
-t :列出tcp 网路封包的资料
-u :列出udp 网路封包的资料
-n :用数字显示信息:进程id,主机id,用户id
-l :列出目前正在网路监听(listen) 的服务;
-p :显示PID 和 进程名
-c : 动态持续显示网络状态

示例:

[root@study ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1326/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2349/master
tcp6 0 0 :::22 :::* LISTEN       1326/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2349/master
udp 0 0 0.0.0.0:123 0.0.0.0:* 751/chronyd
udp 0 0 127.0.0.1:323 0.0.0.0:* 751/chronyd
udp 0 0 0.0.0.0:57808 0.0.0.0:* 743/avahi-daemon: r
udp 0 0 0.0.0.0:5353 0.0.0.0:* 743/avahi-daemon: r
udp6 0 0 :::123 :::* 751/chronyd
udp6 0 0 ::1:323 :::* 751/chronyd

nohup 离线任务

使用 & 执行的任务,如果系统离线后(ssh断开后),任务也会终止,不会继续进行。可以用 at 命令来处理,也可以用nohup处理。它会让你离线后也能继续执行任务。

nohup不支持bash内置的命令,只能是外部指令。

nohup [指令与参数]    <==在终端机前景中工作 
nohup [指令与参数] &  <==在终端机背景中工作

示例:

[root@bogon temp]# jobs
[root@bogon temp]# nohup ./t.sh &         # 创建后台任务
[1] 5108
[root@bogon temp]# nohup: 忽略输入并把输出追加到"nohup.out"  # nohup会有个输出文件 nohup.out,不指定就会放在当前文件夹

[root@bogon temp]# jobs
[1]+  运行中               nohup ./t.sh &

nice 调整程序优先级

nice [-n数字] [ command [args] ]
选项与参数:
-n :后面接一个数值,让原本的nice 加上这个新的数值之意。修改后的最终数值的范围则为-20 ~ 19。

示例:负数会减小PRI,也就是调高优先度

# nice -n -10 ./run.sh

O

P

patch 补丁

[dmtsai@study ~]$ patch -pN < patch_file     <==更新 
[dmtsai@study ~]$ patch -R -pN < patch_file  <==还原
选项与参数:
-p N:后面可以接『取消几层目录』的意思。(也就是将路径删除几个/符号)
-R N:代表还原,将新的档案还原成原来旧的版本。

示例:

[root@bogon temp]# cat a               # 旧文件 a
a 1
b 2
c 3
d 4

[root@bogon temp]# cat b              # 新文件 b
a one
b two
c three
d four

[root@bogon temp]# diff -Naur a b > ab.patch    # 制作 a -> b 的补丁

[root@bogon temp]# cat ab.patch                # 查看补丁
--- a	2020-09-04 20:42:28.482524419 +0800
+++ b	2020-09-04 20:42:48.511704665 +0800
@@ -1,4 +1,4 @@
-a 1
-b 2
-c 3
-d 4
+a one
+b two
+c three
+d four


[root@bogon temp]# patch -p0 < ab.patch    # 给旧文件打补丁
patching file a

[root@bogon temp]# cat a                   # 补丁打上了,文件和b一样了。
a one
b two
c three
d four


[root@bogon temp]# patch -R -p0 < ab.patch    # 还原回去,卸载补丁
patching file a

[root@bogon temp]# cat a
a 1
b 2
c 3
d 4

p Num的用法:

假设当前文件夹 ~ 下还有一个文件夹:temp,temp里面有两个文件:a,b,现在给a,b制作补丁,并放置在 /temp 目录下

[root@bogon ~]# diff -Naur ./temp/a ./temp/b > ./temp/ab.patch
[root@bogon ~]# ll temp/
总用量 20
-rw-r--r--. 1 root     root      16 9月   4 21:46 a
-rw-r--r--. 1 root     root     165 9月   4 21:49 ab.patch     # 补丁文件
-rw-r--r--. 1 root     root      27 9月   4 20:42 b


[root@bogon ~]# cat ./temp/ab.patch                          # 查看补丁文件内容
--- ./temp/a	2020-09-04 21:46:23.979633876 +0800     # 重点来了!注意./temp/a 这个路径
+++ ./temp/b	2020-09-04 20:42:48.511704665 +0800     # ./temp/b
@@ -1,4 +1,4 @@
-a 1
-b 2
-c 3
-d 4
+a one
+b two
+c three
+d four

[root@bogon ~]# cd temp                           # 注意,现在进入 temp 文件夹里面了!
[root@bogon temp]# patch -p0 < ab.patch           # 使用 p0, 有问题?
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- ./temp/a	2020-09-04 21:46:23.979633876 +0800
|+++ ./temp/b	2020-09-04 20:42:48.511704665 +0800

# 因为补丁文件里写的路径是 ./temp/a,而现在的工作路径是temp,也就是说当前工作路径下,已经没有一个叫temp 的文件夹了,所以如果使用 p0,它会从 ./temp/a 开始找,会有问题。而使用 p2,代表将路径删除掉 2 个 /,也就是变成了 a,现在的工作目录下刚好有 a这个文件,能找到,也就成功了。
[root@bogon temp]# patch -p2 < ab.patch                 # 使用 p2,成功了!
patching file a


parted 列出磁碟的分割表类型与分割资讯

parted device_name print 
范例一:列出/dev/vda磁碟的相关资料 
[root@study ~]# parted /dev/vda print 
Model: Virtio Block Device (virtblk)         #磁碟的模组名称(厂商) 
Disk /dev/vda: 42.9GB                        #磁碟的总容量 
Sector size (logical/physical): 512B/512B    #磁碟的每个逻辑/物理磁区容量
Partition Table: gpt                         #分割表的格式(MBR/GPT) 
Disk Flags: pmbr_boot 

Number Start End Size File system Name Flags       #底下才是分割资料 
 1 1049kB 3146kB 2097kB bios_grub 
 2 3146kB 1077MB 1074MB xfs 
 3 1077MB 33.3GB 32.2GB lvm

passwd 修改密码

设置账号的密码

passwd [--stdin] [帐号名称]
passwd [-l] [-u] [--stdin] [-S] [-n日数] [-x日数] [-w日数] [-i日数] 帐号  <==root功能

选项与参数:

  • --stdin :可以透过来自前一个管线的资料,作为密码输入,对shell script 有帮助!
  • -l :是Lock 的意思,会将/etc/shadow 第二栏最前面加上! 使密码失效;
  • -u :与-l 相对,是Unlock 的意思!
  • -S :显示账号的信息
  • -n :后面接天数,shadow 的第4 栏位,多久不可修改密码天数
  • -x :后面接天数,shadow 的第5 栏位,多久内必须要更动密码
  • -w :后面接天数,shadow 的第6 栏位,密码过期前的警告天数
  • -i :后面接天数,shadow 的第7 栏位,密码失效天数
passwd User1
echo "abc543CC" | passwd --stdin vbird2   # 从stdin修改密码
[root@study ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 99999 7 -1 (Password set, SHA512 crypt.)
# 上面说明密码建立时间(2015-07-20)、0 最小天数、99999 变更天数、7 警告日数与密码不会失效(-1)

# 60 天需要变更密码, 密码过期后10 天未使用就宣告帐号失效
[root@study ~]# passwd -x 60 -i 10 vbird2 
[root@study ~]# passwd -S vbird2 
vbird2 PS 2015-07-20 0 60 7 10 (Password set, SHA512 crypt.)

账号失效:

passwd -l vbird2 

paste 文本合并

相对于join必须要比对两个档案的资料相关性, paste就直接『将两行贴在一起,且中间以[tab]键隔开』而已!

paste [-d] file1 file2 

选项与参数:

  • -d :后面可以接分隔字符。预设是以[tab] 来分隔的!

  • -:如果file 部分写成- ,表示来自standard input 的资料的意思。

示例:

[root@bogon temp]# cat a b
a 1
b 2
c 3
d 4

a one
b two
c three
d four


[root@bogon temp]# paste a b
a 1	a one
b 2	b two
c 3	c three
d 4	d four

pwd 当前目录

pwd [-P] 

-P:显示链接文件的真实目录

pidof 查找进程的pid

根据进程名,找出程序的PID

pidof [-sx] program_name 
选项与参数:
-s :仅列出一个PID 而不列出所有的PID
-x :同时列出该program name 可能的PPID 那个程序的PID

示例:

[root@study ~]# pidof systemd rsyslogd
1 742
# 理论上,应该会有两个PID 才对。上面的显示也是出现了两个PID 喔。
# 分别是systemd 及rsyslogd 这两支程式的PID 啦。

pwck 检查密码

pwck 这个指令在检查/etc/passwd 这个帐号设定档内的资讯

[root@study ~]# pwck
user 'ftp': directory '/var/ftp' does not exist
user 'avahi-autoipd': directory '/var/lib/avahi-autoipd' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
pwck: no changes

ps 查看进程

[root@study ~]# ps aux  <==观察系统所有的程序
[root@study ~]# ps -l  <== 查看当前用户的进程


选项与参数:
-A :所有的process 均显示出来,与-e 具有同样的效用;
-a :不与terminal 有关的所有process ;
-u :有效使用者(effective user) 相关的process ;
x :通常与a 这个参数一起使用,可列出较完整资讯。
输出格式规划:
l :较长、较详细的将该PID 的的资讯列出;
j :工作的格式(jobs format)
-f :做一个更为完整的输出。

常用命令:

ps -ef
ps aux
ps -l
ps -u root
[root@bogon ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  4617  4385  0  80   0 - 58097 do_wai pts/0    00:00:00 su
4 S     0  4626  4617  0  80   0 - 29189 do_wai pts/0    00:00:00 bash
4 S     0  4900  4626  0  80   0 - 57997 do_wai pts/0    00:00:00 su
4 S     0  5058  4901  0  80   0 - 57997 do_wai pts/0    00:00:00 su
4 S     0  5065  5058  0  80   0 - 29273 do_wai pts/0    00:00:00 bash
0 R     0  5896  5065  0  80   0 - 38337 -      pts/0    00:00:00 ps
  • F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser;
  • S 代表这个程序的状态 (STAT);
  • UID 代表执行者身份
  • PID 进程的ID号!
  • PPID 父进程的ID;
  • C CPU使用的资源百分比
  • PRI指进程的执行优先权(Priority的简写),其值越小越早被执行;
  • NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值。
  • ADDR 这个是内核函数,指出该程序在内存的那个部分。如果是个执行 的程序,一般就是『 - 』
  • SZ 使用掉的内存大小;
  • WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;
  • TTY 登入者的终端机位置;
  • TIME 使用掉的 CPU 时间。
  • CMD 所下达的指令名称

示例:

[root@bogon ~]# ps aux | sed -n '1,10p'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 128416  7092 ?        Ss   10:51   0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    10:51   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   10:51   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    10:51   0:01 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S    10:51   0:00 [migration/0]
root         8  0.0  0.0      0     0 ?        S    10:51   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        R    10:51   0:03 [rcu_sched]
root        10  0.0  0.0      0     0 ?        S<   10:51   0:00 [lru-add-drain]
root        11  0.0  0.0      0     0 ?        S    10:51   0:00 [watchdog/0]

  • USER:该进程属于那个使用者账号。

  • PID :该进程的进程ID号。

  • %CPU:该进程使用掉的 CPU 资源百分比;

  • %MEM:该进程所占用的物理内存百分比;

  • VSZ :该进程使用掉的虚拟内存量 (Kbytes)(共享库+堆栈+交换区+程序大小)

  • RSS :该进程占用的固定的内存量 (Kbytes)(实际占用的共享库+堆栈+程序实际占用大小)

  • TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

  • STAT:该程序目前的状态,主要的状态有:

    • R :该程序目前正在运作
    • S :该程序目前正在睡眠当中,但可被某些讯号(signal) 唤醒。
    • T :该程序停止了;
    • Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
    • D : 不可被唤醒,通常在等待I/O
  • START:该进程被触发启动的时间;

  • TIME :该进程实际使用 CPU 运作的时间。

  • COMMAND:该程序的实际指令。

Top命令可以动态的监测程序的运行情况。

pstree 显示进程树

pstree [-A|U] [-up] 
选项与参数:
-A :各程序树之间的连接以ASCII 字符来连接;
-U :各程序树之间的连接以万国码的字符来连接。在某些终端介面下可能会有错误;
-p :并同时列出每个process 的PID;
-u :并同时列出每个process 的所属帐号名称。

实例:

范例一:列出目前系统上面所有的程序树的相关性: 
[root@study ~]# pstree -A 
systemd-+-ModemManager---2*[{ModemManager}]        #这行是ModenManager与其子程序 
        | -NetworkManager---3*[{NetworkManager}]    #前面有数字,代表子程序的数量!
....(中间省略).... 
        |-sshd---sshd---sshd---bash---bash---sudo---su---bash---pstree <==我们指令执行的相依性
范例二:承上题,同时秀出PID与users 
[root@study ~]# pstree -Aup
systemd(1)-+-ModemManager(745)-+-{ModemManager}(785)
           | `-{ModemManager}(790)
           |-NetworkManager(870)-+-{NetworkManager}(907)
           | |-{NetworkManager}(911)
           | `-{NetworkManager}(914)
....(中间省略).... 
           |-sshd(1326)---sshd(13923)---sshd(13927, dmtsai )---bash(13928)---bash(13970)-- -

Q

quota 磁盘分配

quota 在EXT档案系统家族仅能针对整个filesystem,针对XFS filesystem 的限制项目有:

  • 分别针对使用者、群组或个别目录(user, group & project) ( 注意,group 和 project 不可以同时设置!)
  • 容量限制或档案数量限制(block 或inode)
  • soft,hard以及宽限时间(grace time):soft,hard都是设定的大小,当项目的大小超过hard的上限,会直接锁定使用者的磁盘。当限制项目的大小超过 soft 小于 hard 时,会给出提醒,在宽限时间内如果不删减磁盘空间,soft限制值会即刻取代hard限值来作为quota的限制。

查看quota信息

xfs_quota -x -c "指令" [挂载点] 
选项与参数:
-x :专家模式,后续才能够加入-c 的指令参数
-c :后面加的就是指令
指令:
      print :单纯的列出目前主机内的档案系统参数等资料
      df :与原本的df 一样的功能,可以加上-b (block) -i (inode) -h (加上单位) 等
      report:列出目前的quota 项目,有-ugr (user/group/project) 及-bi 等资料
      state :说明目前支援quota 的档案系统的资讯,有没有起动相关项目等

首先启用quota:

要想启用quota,需要修改 /etc/fstab,把要启用 quota 的那个档案系统的 defaults 后面添加两个参数:

[root@bogon ~]# cat /etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=59135bee-e56c-4154-9620-e7b329fc574c /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults,usrquota,grpquota      0 0 # 注意,这里的defaults后面添加了两个参数:usrquota,grpquota
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sda4 /data/xfs xfs defaults 0 0     

[root@bogon ~]# umount /home             # 卸载这个文件系统,注意,因为普通用户的家目录在/home下,所以需要退出普通用户账号!否则无法卸载!

[root@bogon ~]# mount -a                          # 重新加载

[root@bogon /]# mount | grep /home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)  # 可以看出,后面有usrquota,grpquota 了


查看quota信息:

[root@bogon /]# xfs_quota -x -c 'print' /home           # 显示quota信息
Filesystem          Pathname
/home               /dev/mapper/centos-home (uquota, gquota)


[root@bogon /]# xfs_quota -x -c 'df -h' /home     # 显示磁盘大小
Filesystem     Size   Used  Avail Use% Pathname
/dev/mapper/centos-home
               5.0G 143.3M   4.9G   3% /home


[root@bogon /]# xfs_quota -x -c 'report -ubih' /home                # 列出各用户的限制信息
User quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes              
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [------]      3      0      0  00 [------]
wztshine   110.0M      0      0  00 [------]   2.1k      0      0  00 [------]


[root@bogon /]# xfs_quota -x -c 'state' /home                  # 查看quota开启的状态
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #3313 (2 blocks, 2 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #3318 (2 blocks, 2 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: #3318 (2 blocks, 2 extents)
Blocks grace time: [7 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]

设置quota配额:usrquota,grpquota

xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"    # 设置配额
xfs_quota -x -c "timer [-ug] [-bir] Ndays"                          # 设置宽限时间
选项与参数:
limit :实际限制的项目,可以针对user/group 来限制,限制的项目有
        bsoft/bhard : block 的soft/hard 限制值,可以加单位
        isoft/ihard : inode 的soft/hard 限制值
        name : 就是用户/群组的名称啊!
timer :用来设定grace time 的项目喔,也是可以针对user/group 以及block/inode 设定

示例:给 user1 这个用户设置配额,让它在 /home 这个文件系统里,最多只能使用 300M 的空间,并且100M的时候就提醒他:

[root@bogon ~]# xfs_quota -x -c 'limit -u bsoft=100M bhard=300M user1' /home    # 配额

[root@bogon ~]# su - user1                                                # 切换到user1

[user1@bogon ~]$ dd if=/dev/zero of=big.img bs=1M count=310               # 创建一个310M的文件测试一下
dd: 写入"big.img" 出错: 超出磁盘限额
记录了300+0 的读入
记录了299+0 的写出
313524224字节(314 MB)已复制,1.17363 秒,267 MB/秒

[user1@bogon ~]$ ll -h big.img                                         # 果然没有超过300M
-rw-rw-r--. 1 user1 user1 299M 9月   5 22:39 big.img

[root@bogon ~]# xfs_quota -x -c "timer -g -b 14days" /home            # 设置宽限时间

[root@bogon ~]# xfs_quota -x -c 'state' /home                         # 查询一下
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #3313 (2 blocks, 2 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #3318 (2 blocks, 2 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: #3318 (2 blocks, 2 extents)
Blocks grace time: [14 days]                                         # 时间是 14 天
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]

prjquota:目录配额

project 可以针对一个目录进行 quota 配额,而不像上边的只能针对一个文件系统, 但是project 不能和 group 一起使用,所以,需要把相应的 文件系统的 grpquota替换掉:

# vim /etc/fstab
/dev/mapper/centos-home /home                   xfs     defaults,usrquota,prjquota      0 0  # 有个prjquota,但是没有 grpquota了

[root@bogon ~]# umount /home                            # 卸载并重新加载文件系统
[root@bogon ~]# mount -a
[root@bogon ~]# mount | grep /home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,prjquota)

目录的设定比较奇怪,他必须要指定一个所谓的『专案名称、专案识别码』来规范才行!而且还需要用到两个设定档!现在,我们要规范的目录是/home/Folder目录,这个目录我们给个 folderprj 的专案名称, 这个专案名称给个11 的识别码,这些可以随便设定。

[root@bogon home]# mkdir Folder               # 创建目录,这个目录就是我们想要配额的目录
[root@bogon home]# ls
Folder  user1  wztshine


[root@bogon home]# echo '11:/home/Folder' >> /etc/projects      # 设置 id 和目录
[root@bogon home]# echo 'folderprj:11' >> /etc/projid           # 设置名字和 id 
[root@bogon home]# xfs_quota -x -c 'project -s folderprj'       # 初始化
Setting up project folderprj (path /home/Folder)...
Processed 1 (/etc/projects and cmdline) paths for project folderprj with recursion depth infinite (-1).
Setting up project folderprj (path /home/Folder)...
Processed 1 (/etc/projects and cmdline) paths for project folderprj with recursion depth infinite (-1).
Setting up project folderprj (path /home/Folder)...
Processed 1 (/etc/projects and cmdline) paths for project folderprj with recursion depth infinite (-1).
Setting up project folderprj (path /home/Folder)...
Processed 1 (/etc/projects and cmdline) paths for project folderprj with recursion depth infinite (-1).


[root@bogon home]# xfs_quota -x -c 'print' /home
Filesystem          Pathname
/home               /dev/mapper/centos-home (uquota, pquota)
/home/Folder        /dev/mapper/centos-home (project 11, folderprj)     # 可以看到有这个 project 了


[root@bogon home]# xfs_quota -x -c 'limit -p bsoft=100M bhard=150M folderprj' /home   # 设置配额


[root@bogon home]# xfs_quota -x -c "report -pbih " /home                             # 查看一下
Project quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes              
Project ID   Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
#0         409.0M      0      0  00 [------]   2.1k      0      0  00 [------]
folderprj       0   100M   150M  00 [------]      1      0      0  00 [------]


[root@bogon home]# dd if=/dev/zero of=/home/Folder/big.img bs=1M count=160       # 测试一下,果然没问题
dd: 写入"/home/Folder/big.img" 出错: 设备上没有空间
记录了151+0 的读入
记录了150+0 的写出
157286400字节(157 MB)已复制,1.22694 秒,128 MB/秒

清除/禁用/启用 quota

  • disable:暂时取消quota的限制,但其实系统还是在计算quota中
  • enable:重新启用,与disable可以互相取消、启用!
  • off:完全关闭quota的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次的启动quota喔!也就是说,用了off状态后,你无法使用enable再次复原quota的管制喔!注意不要乱用这个状态!一般建议用disable即可,除非你需要执行remove的动作!
  • remove:必须要在off的状态下才能够执行的指令~这个remove可以『移除』quota的限制设定,例如要取消project的设定,无须重新设定为0喔!只要remove -p就可以了!
# 1.暂时关闭XFS档案系统的quota限制功能 
[root@study ~]# xfs_quota -x -c "disable -up" /home              # 禁用试试


[root@study ~]# xfs_quota -x -c "enable -up" /home  			 #重新启动quota限制 


#完全关闭quota的限制行为吧!同时取消project的功能试看看!
[root@study ~]# xfs_quota -x -c "off -up" /home 
[root@study ~]# xfs_quota -x -c "enable -up" /home
XFS_QUOTAON: Function not implemented
# 您瞧瞧!没有办法重新启动!因为已经完全的关闭了quota 的功能!所以得要umount/mount 才行!


[root@study ~]# umount /home; mount -a 
#这个时候使用report以及state时,管制限制的内容又重新回来了!

[root@study ~]# xfs_quota -x -c "off -up" /home             # 先关闭,后删除,实测没有用,不知道为啥
[root@study ~]# xfs_quota -x -c "remove -p" /home 
[root@study ~]# umount /home; mount -a 
[root@study ~]# xfs_quota -x -c "report -phb" /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquotaproject 500M       0 0   00 [------]
 #嘿嘿!全部归零!就是『移除』所有限制值的意思!

无法删除quota:

上面的先 off ,后 remove,结果发现 quota 的配额还在,不知道为啥

$ rm -f /etc/projects               # 删掉 project 相关的设定档
$ rm -f /etc/projid

$ vim /etc/fstab                   # 修改fstab文件,删掉里面的 usrquota,prjquota
/dev/mapper/centos-home /home                   xfs     defaults      0 0
# umount /home                    # 重新装载文件系统
# mount -a

R

renice 调整已运行程序的优先级

renice [number] PID 

示例:

[root@study ~]# renice -5 14836
14836 (process ID) old priority 10, new priority -5

rmdir 删除空文件夹

语法:注意,只能删除空文件夹。

rmdir [-p] 目录名称
选项与参数:
-p :连同『上层』『空的』目录也一起删除(循环删除多层空文件夹)
rmdir -p /a/b/c/d

rm 删除文件或非空件夹

rm [-fir] 档案或目录
  • 选项与参数:
    • -f :就是force 的意思,忽略不存在的档案,不会出现警告讯息;
    • -i :互动模式,在删除前会询问使用者是否动作
    • -r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!
[root@bogon ~]# rm folder
rm: 无法删除"folder": 是一个目录
[root@bogon ~]# rm -rf folder
[root@bogon ~]# ll

rpm 安装软件

rpm是一个软件安装管理器。

查询安装的软件:

[root@study ~]# rpm -qa                             # 查询所有安装的软件
[root@study ~]# rpm -q[licdR] 已安装的软件名称        <==已安装软件的信息
[root@study ~]# rpm -qf 存在于系统上面的某个档名       <==已安装软件的路径
[root@study ~]# rpm -qp [licdR] 未安装的某个档案名称   <==查阅RPM档案
选项与参数:
查询已安装软件的资讯:
-q :仅查询,后面接的软件名称是否有安装;
-qa :列出所有的,已经安装在本机Linux 系统上面的所有软件名称;
-qi :列出该软件的详细资讯(information),包含开发商、版本与说明等;
-ql :列出该软件所有的档案与目录所在完整档名(list);
-qc :列出该软件的所有设定档(找出在/etc/ 底下的档名而已)
-qd :列出该软件的所有说明档(找出与man 有关的档案而已)
-qR :列出与该软件有关的相依软件所含的档案(Required 的意思)
-qf :由后面接的档案名称,找出该档案属于哪一个已安装的软件;
-q --scripts:列出是否含有安装后需要执行的脚本档,可用以debug 喔!
查询某个RPM 档案内含有的资讯:
-qp[icdlR]:注意-qp 后面接的所有参数以上面的说明一致。但用途仅在于找出
	    某个RPM 档案内的资讯,而非已安装的软件资讯!注意!

示例:

# 范例一:找出你的Linux是否有安装logrotate这个软件?
[root@study ~]# rpm -q logrotate
logrotate-3.8.6-4.el7.x86_64
[root@study ~]# rpm -q logrotating
package logrotating is not installed
# 注意到,系统会去找是否有安装后面接的软件名称。注意,不必要加上版本喔!

# 范例二:列出上题当中,属于该软件所提供的所有目录与档案: 
[root@study ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
....


# 范例三:列出logrotate这个软件的相关说明资料: 
[root@study ~]# rpm -qi logrotate 
Name : logrotate                           #软件名称 
Version : 3.8.6                               #软件的版本 
Release : 4.el7                               #释出的版本 
Architecture : x86_64                              #编译时所针对的硬体等级 
Install Date: Mon 04 May 2015 05:52:36 PM CST     #这个软件安装到本系统的时间 
Group : System Environment/Base             #软件是放再哪一个软件群组中 
Size : 102451                              #软件的大小 
License : GPL+                                #释出的授权方式
Signature : RSA/SHA256, Fri 04 Jul 2014 11:34:56 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : logrotate-3.8.6-4.el7.src.rpm       #这就是SRPM的档名 
Build Date : Tue 10 Jun 2014 05:58:02 AM CST     #软件编译打包的时间 
Build Host : worker1.bsys. centos.org             #在哪一部主机上面编译的
Relocations : (not relocatable)   
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : https://fedorahosted.org/logrotate/
Summary : Rotates, compresses, removes and mails system log files
Description :                                     #这个是详细的描述!
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files. Logrotate
allows for the automatic rotation compression, removal and mailing of
log files. Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size. Normally,
logrotate runs as a daily cron job.

Install the logrotate package if you need a utility to deal with the
log files on your system.


# 范例四:分别仅找出logrotate的设定档与说明档 
[root@study ~]# rpm -qc logrotate 
[root@study ~]# rpm -qd logrotate

# 范例五:若要成功安装logrotate ,他还需要什么档案的帮忙?
[root@study ~]# rpm -qR logrotate
/bin/sh
config(logrotate) = 3.8.6-4.el7
coreutils >= 5.92
....(以下省略)....


# 范例六:由上面的范例五,找出/bin/sh是那个软件提供的?
[root@study ~]# rpm -qf /bin/sh
bash-4.2.46-12.el7.x86_64
# 这个参数后面接的可是『档案』呐!不像前面都是接软件


# 范例七:假设我有下载一个RPM档案,想要知道该档案的需求档案,该如何?
[root@study ~]# rpm -qpR filename.i386.rpm 
#加上-qpR ,找出该档案需求的资料!

验证软件

[root@study ~]# rpm -Va 
[root@study ~]# rpm -V 已安装的软件名称 
[root@study ~]# rpm -Vp 某个RPM档案的档名 
[root@study ~]# rpm -Vf 在系统上面的某个档案
选项与参数:
-V : 后面加的是软件名称,若该软件所含的档案被更动过,才会列出来;
-Va :列出目前系统上面所有可能被更动过的档案;
-Vp :后面加的是档案名称,列出该软件内可能被更动过的档案;
-Vf :列出某个档案是否被更动过~

示例:

[root@study ~]# rpm -V logrotate 
#如果没有出现任何讯息,恭喜你,该软件所提供的档案没有被更动过。
# 如果有出现任何讯息,才是有出现状况啊!
范例二:查询一下,你的/etc/crontab是否有被更动过?
[root@study ~]# rpm -Vf /etc/crontab
.......T. c /etc/crontab
# 瞧!因为有被更动过,所以会列出被更动过的资讯类型!
  • S :(file Size differs) 档案的容量大小是否被改变
  • M :(Mode differs) 档案的类型或档案的属性(rwx) 是否被改变?如是否可执行等参数已被改变
  • 5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
  • D :(Device major/minor number mis-match) 装置的主/次代码已经改变
  • L :(readLink(2) path mis-match) Link 路径已被改变
  • U :(User ownership differs) 档案的所属人已被改变
  • G :(Group ownership differs) 档案的所属群组已被改变
  • T :(mTime differs) 档案的建立时间已被改变
  • P :(caPabilities differ) 功能已经被改变

卸载,更新资料库

rpm -e 软件名
rpm --rebuilddb    <==重建资料库

S

sed 数据流编辑

sed可以进行数据流的编辑和处理,可以从 stdin 获取资料,也可以直接后接文件。

sed [-nefr] [动作] 

选项与参数:

  • -n :使用安静(silent)模式。只有经过sed 特殊处理的那一行(或者动作)才会被显示出来(默认所有来自STDIN 的资料都会被列出到屏幕上)

  • -e :直接在指令列模式上进行 sed 的动作编辑;

  • -f : -f filename 则可以执行 filename 内的 sed 动作;(事先将命令写入文件)

  • -r :使用扩展正则表达式的语法。(预设是基础正则表达式语法)

  • -i :直接修改读取的档案内容,而不是由屏幕输出。

动作格式: [n1[,n2]]function

  • n1, n2 :代表执行的行数区间,举例来说,如果我的动作是需要在10 到20 行之间进行的,则:10,20[行为]

  • function:

    • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

    • c :取代, c 的后面可以接字串,这些字串可以取代n1,n2 之间的行!

    • d :删除,因为是删除啊,所以d 后面通常不接任何咚咚;

    • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

    • p :列印,亦即将某个选择的资料印出。通常p 会与参数sed -n 一起运作~

    • s :替换,可以直接进行取代的工作哩!通常这个s 的动作可以搭配正则表达式!格式:[起始行数,终止行数]s/旧字符串/新字符串/g; 例如:10,20s/love/hate/g,不写行数则默认全文替换

      • 2,$s/old/new/g : 从第二行到最后一行,替换

      • 2,$s/#.*$//g : 使用正则表达式,将注释替换掉

      • 2,$s/^$//g :

现有文件test:

[wztshine@bogon ~]$ cat test
1
2
3
4
5
6
7
8
9

分析:

在2-4行每行后面添加一行:I love you,然后将第5行取代成:You dont love me , 再在全文范围内将 love 替换成 hate .

[wztshine@bogon ~]$ cat test | sed -e '2,4aI love you' -e '5cYou dont love me'| sed 's/love/hate/g'
1
2
I hate you
3
I hate you
4
I hate you
You dont hate me
6
7
8
9

替换注释并删除空行:

[wztshine@bogon ~]$ cat test | sed -e 's/#.*//g' | sed '/^$/d'
1
2
3
4
5
6
7
8
9

直接修改文件:

sed可以不使用管道或重定向,直接修改文件,文件较大时比vim方便:

格式:

sed -i -e [command] file

示例:

[wztshine@bogon ~]$ sed -i -e '$aThis is a new line' test
[wztshine@bogon ~]$ cat test
1
2
3
4
5
6
7
8
9
This is a new line



[wztshine@bogon ~]$ sed -i -e '2aThis is a new line' test
[wztshine@bogon ~]$ cat test
1
2
This is a new line
3
4
5
6
7
8
9
This is a new line

sleep 延迟时间

延迟多久

sleep [number] [smhd]

s,m,h,d: 秒,分钟,小时,天

示例:

$ date;sleep 1m;date

sort 排序

sort [-fbMnrtuk] [file or stdin] 

选项与参数:

  • -f :忽略大小写的差异,例如A 与a 视为编码相同;
  • -b :忽略最前面的空白字符部分;
  • -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
  • -n :使用『纯数字』进行排序(预设是以文字型态来排序的);
  • -r :反向排序;
  • -u :就是uniq ,相同的资料中,仅出现一行代表;
  • -t :指定分隔符号,预设是用[tab] 键来分隔;
  • -k :以那个区间(field) 来进行排序的意思,和 -t 一起用。
[dmtsai@study ~]$ cat /etc/passwd | sort -t ':' -k 3 
root:x: 0:0:root:/root:/bin/bash 
dmtsai:x: 1000:1000:dmtsai:/ home/dmtsai:/bin/bash 
alex:x: 1001:1002::/home/alex:/bin/bash 
arod:x: 1002:1003::/home/arod:/bin/bash 

SUID/SGID/SBIT 权限

Sticky Bit:SBIT,对目录有效。当一个用户对此目录有 wx 权限时(能进入并修改),它在此目录下创建的文档,只有自己和root能删除!

Set GID:SGID,对目录和可执行程序有效。如果是程序具有SGID权限,则用户在执行此程序时,会自动获得此程序设定的群组的权限。如果是目录,则用户在进入此目录后或者在此目录下创建文件,均自动获得此目录设定的群组权限。

Set UID:SUID,对程序有效。用户执行某个程序时,会自动获得程序的拥有者权限。如passwd,虽然它是root用户的,但是每个用户都能使用它,修改自己的密码。

还记得 umask 显示的四个数字吗?第一位的特殊权限,就是针对的SUID,SGID,SBIT

  • 4 为SUID
  • 2 为SGID
  • 1 为SBIT

设置权限:

[root@study tmp]# chmod 4755 test; ls -l test  <==加入具有SUID的权限 
-rw s r-xr-x 1 root root 0 Jun 16 02:53 test  # s出现在user权限之后
[root@study tmp]# chmod 6755 test; ls -l test  <==加入具有SUID/SGID的权限 
-rw s r- s r-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 1755 test; ls -l test  <==加入SBIT的功能!
-rwxr-xr- t 1 root root 0 Jun 16 02:53 test  # t出现在other权限之后
[root@study tmp]# chmod 7666 test; ls -l test  <==具有空的SUID/SGID权限 
-rw S rw S rw T 1 root root 0 Jun 16 02:53 test # 大写的S,T代表没有权限。因为用户的权限是6,用户本身就没有x执行权限,所以其他用户自然也没有这样的权限,就S,T了。

split 文件分割

split [-bl] file PREFIX 

选项与参数:

-b :后面可接欲分割成的档案大小,可加单位,例如b, k, m 等;

-l :以行数来进行分割。

-C<字节> : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性

PREFIX :代表前缀,每个分割后的文件前缀名中都有。

split -b 300k /etc/services services 

su 切换用户

su 是最简单的身份切换指令,若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 。

su [-lm] [-c指令] [username] 
选项与参数:
- :单纯使用- 如『 su - 』代表使用login-shell 的变数档案读取方式来登入系统;若没有指定用户名,则代表切换为root 的身份。
-l :与- 类似,但后面需要加欲切换的使用者帐号!也是login-shell 的方式。
-m :-m 与-p 是一样的,表示『使用目前的环境设定,而不读取新使用者的设定档』
-c :仅进行一次指令,-c 后面可以加上指令,
[dmtsai@study ~]$ su - -c "head -n 3 /etc/shadow" 
Password: <==这里输入root的密码喔!
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7Rcai6oa/T7KFhOYO62vDnqfLw85...:16559:0:99999:7:::
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
[dmtsai@study ~]$ <==注意看,身份还是dmtsai喔!继续使用旧的身份进行系统操作!

sudo 切换用户并执行命令

su需要了解新切换的使用者密码(常常是需要root的密码), sudo的执行则仅需要自己的密码即可!甚至可以设定不需要密码即可执行sudo呢!由于sudo可以让你以其他用户的身份执行指令(通常是使用root的身份来执行指令),因此并非所有人都能够执行sudo ,而是仅有写入到/etc/sudoers内的用户才能够执行sudo这个指令

sudo [-b] [-u 新使用者帐号] 
选项与参数:
-b :将后续的指令放到背景中让系统自行执行,而不与目前的shell 产生影响
-u :后面可以接欲切换的使用者,若无此项则代表切换身份为root 。
[root@study ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; \ 
>   echo 'This is index.html file' > index.html" 
[root@study ~]# ll -a ~vbird1/www
drwxr-xr-x. 2 vbird1 vbird1 23 Jul 21 23:38 .
drwx------. 6 vbird1 vbird1 4096 Jul 21 23:38 ..
-rw-r--r--. 1 vbird1 vbird1 24 Jul 21 23:38 index.html
# 要注意,建立者的身份是vbird1 ,且我们使用sh -c "一串指令" 来执行的!

systemctl 系统服务管理

服务单元:unit(最小单位)

服务类型 (type):service, socket, target, path, mount, timer

服务群组:target(一组服务的集合)

1.启动,重启,注销服务

systemctl [command] [unit] 
systemctl [ mask | unmask ] unit
command主要有:
start :立刻启动后面接的unit
stop :立刻关闭后面接的unit
restart :立刻关闭后启动后面接的unit,亦即执行stop 再start 的意思
reload :不关闭后面接的unit 的情况下,重新载入设定档,让设定生效
enable :设定下次开机时,后面接的unit 会被启动
disable :设定下次开机时,后面接的unit 不会被启动
status :目前后面接的这个unit 的状态,会列出有没有正在执行、开机预设执行否、登录等资讯等!
is-active :目前有没有正在运作中
is-enabled:开机时有没有预设要启用这个unit

mask:强制注销
unmask:恢复

示例:

范例二:正常关闭这个atd服务 
[root@study ~]# systemctl stop atd.service 
[root@study ~]# systemctl status atd.service
atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled )
    Active: inactive (dead) since Tue 2015-08-11 01:04:55 CST; 4s ago
  Process: 1350 ExecStart=/usr/sbin/atd -f $OPTS (code=exited, status=0/SUCCESS)
 Main PID: 1350 (code=exited, status=0/SUCCESS)

mask、unmask:

[root@study ~]# systemctl mask cups.service
ln -s '/dev/null' '/etc/systemd/system/cups.service'
# 其实这个mask 注销的动作,只是让启动的脚本变成空的装置而已!

[root@study ~]# systemctl status cups.service
cups.service
   Loaded: masked (/dev/null)
   Active: inactive (dead) since Tue 2015-08-11 23:14:16 CST; 52s ago

[root@study ~]# systemctl start cups.service 
Failed to issue method call: Unit cups.service is masked.   #再也无法唤醒!


[root@study ~]# systemctl unmask cups.service
rm '/etc/systemd/system/cups.service'
[root@study ~]# systemctl status cups.service
cups.service - CUPS Printing Service
   Loaded: loaded (/usr/lib/systemd/system/cups.service; disabled)
   Active: inactive (dead) since Tue 2015-08-11 23:14:16 CST; 4min 35s ago
# 恢复正常!

2. 列出服务

systemctl [command] [--type=TYPE] [--all] 
command:
    list-units :依据unit 列出目前有启动的unit。若加上--all 才会列出没启动的。
    list-unit-files :列出所有服务
--type=TYPE:就是之前提到的unit type,主要有service, socket, target 等

示例:

# 列出所有服务
[root@study ~]# systemctl list-unit-files

# 列出所有的 service 类型的服务
[root@study ~]# systemctl list-units --type=service --all 

# 查询是否有某个服务
[root@study ~]# systemctl list-units --type=service --all | grep cpu
cpupower.service loaded inactive dead Configure CPU power related settings

T

tar 打包

tar命令不会自动建立文档名,需要自己指定。

[dmtsai@study ~]$ tar [-z|-j|-J] [cv] [-f 待建立的新档名] filenames...  <==打包与压缩 
[dmtsai@study ~]$ tar [ -z|-j|-J] [tv] [-f 既有的tar档名]              <==察看档名 
[dmtsai@study ~]$ tar [-z|-j|-J] [xv] [-f 既有的tar档名] [-C目录]    <==解压缩

选项与参数:

  • -c :创建档案,可搭配-v 来察看过程中被打包的档名(filename)

  • -t :察看打包档案的内容含有哪些文档

  • -x :解压缩,可以搭配-C (大写) 在特定目录解开,特别留意的是, -c, -t, -x 不可同时出现在一串指令列中。

  • -z :透过gzip 的支援进行压缩/解压缩:此时档名最好为*.tar.gz

  • -j :透过bzip2 的支援进行压缩/解压缩:此时档名最好为*.tar.bz2

  • -J :透过xz 的支援进行压缩/解压缩:此时档名最好为*.tar.xz, 特别留意, -z, -j, -J 不可以同时出现在一串指令列中

  • -v :在压缩/解压缩的过程中,将正在处理的档名显示出来!

  • -f filename:-f 后面要立刻接压缩包的名字

  • -C 目录:解压到特定目录

  • -p(小写) :保留备份资料的原本权限与属性,常用于备份(-c)重要的设定档

  • -P(大写) :保留绝对路径,允许备份资料中含有根目录存在(也就是说,解压后,文件会直接覆盖原有的路径!)

  • --exclude=FILE:在压缩的过程中,不要将FILE 打包!

打包:

$ tar -zcvf a.tar.gz a/b/b.txt

查看:

$ tar -tf a.tar.gz

解压:

$ tar -zxvf a.tar.gz

解压到指定目录:

$ tar -zxvf a.tar.gz -C temp

仅解压单一文件:

[root@study ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root 721 2015-06-17 00:20 etc/gshadow
---------- root/root 1183 2015-06-17 00:20 etc/shadow-
---------- root/root 1210 2015-06-17 00:20 etc/shadow   <==这是我们要的!
---------- root/root 707 2015-06-17 00:20 etc/gshadow-


# 2.将该档案解开!语法与实际作法如下: 
[root@study ~]# tar -jxv -f 打包档.tar.bz2 待解开档名 
[root@study ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow

排除特殊目录:打包/etc /root目录,排除压缩包本身和/root/ect*目录

$ tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 / etc /root

打包某个日期之后的文件:

[root@study ~] tar -jcv -f /root/passwd.tar.bz2 --newer-mtime="2015/06/ 17" /etc/*
# tar: Option --newer-mtime: 将 `2015/06/17' 作为 2015-06-17 00:00:00 对待

tail 读取文档最后几行

tail -n number file 
tail -f file   # 持续监控某文件,譬如持续增长的log文件,需要按ctrl+c退出。

参数:

  • 当number为无符号数或者负数,都代表取出文件的倒数 number 行
  • 当 number 为正数,代表从文件末尾取到文件的正数第 number 行
$ cat a.txt
1
2
3
4
5
6
7
8
9
10


$ tail -n 2 a.txt
9
10


$ tail -n -2 a.txt
9
10


$ tail -n +2 a.txt
2
3
4
5
6
7
8
9
10


tee 双向重定向

tee可以处理来自stadin的数据,将其写入文件和标准输出。

tee [-a] file 

选项与参数:

  • -a :以累加(append) 的方式,将资料加入file 当中!

将stdin保存到a,b两个文件中

$ echo 'alsdf' | tee -a a b
alsdf

top 动态进程查看

实时显示程序的运行状态。

top [-] [d delay] [c] [S] [s] [i] [n] [b]
选项与参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。预设是5 秒;
-b :以批次的方式执行top,不接受 input,通常和 -n 一起,重定向到文档。
-n number:刷新 number 次后退出top命令
-p :指定某些个PID 来进行观察监测而已。
-c :显示完整带路径的命令名
-s :安全模式,禁用交互指令

在top 执行过程当中可以使用的按键指令:
	? :显示在 top 当中可以输入的按键指令;
	P :以CPU 的使用资源排序显示;
	M :以Memory 的使用资源排序显示;
	N :以PID 来排序
	T :由该Process 使用的CPU 时间累积(TIME+) 排序。
	k :给予某个PID 一个讯号(signal)
	r :给予某个PID 重新制订一个nice 值。
	q :离开top 软件的按键。

示例:

$ top -b -n 2 > /tmp/top.txt 

$ top -n 3

$ top -d 2

touch 修改文件时间

  • modification time (mtime):文档更新时间(修改)
  • change time (ctime):创建时间,也可以是文件属性,用户等权限修改时的时间
  • access time (atime):访问时间,如读取后,会更新
touch [-acdmt] 档案
touch 档案     # 档案不存在时,会创建一个文档

选项与参数:

  • -a :仅修订access time;
  • -c :若该档案不存在则不建立新档案;
  • -d :后面可以接欲修订的日期而不用目前的日期,也可以使用--date="日期或时间"
  • -m :仅修改mtime ;
  • -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

示例:

[root@bogon temp]# touch -m a
[root@bogon temp]# ll
总用量 16
-rw-r--r--. 1 root     root     16 9月   5 13:18 a

tr 转换或删除字符

转换字符。

Linux tr 命令用于转换或删除文件中的字符。

tr [-ds] SET1 ... 

选项与参数:

  • -d :删除讯息当中的SET1 这个字串;
  • -s :取代掉重复的字符

字符集合的范围:

  • \NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
  • \ 反斜杠
  • \a Ctrl-G 铃声
  • \b Ctrl-H 退格符
  • \f Ctrl-L 走行换页
  • \n Ctrl-J 新行
  • \r Ctrl-M 回车
  • \t Ctrl-I tab键
  • \v Ctrl-X 水平制表符
  • CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
  • [CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
  • [CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
  • [:alnum:] :所有字母字符与数字
  • [:alpha:] :所有字母字符
  • [:blank:] :所有水平空格
  • [:cntrl:] :所有控制字符
  • [:digit:] :所有数字
  • [:graph:] :所有可打印的字符(不包含空格符)
  • [:lower:] :所有小写字母
  • [:print:] :所有可打印的字符(包含空格符)
  • [:punct:] :所有标点字符
  • [:space:] :所有水平与垂直空格符
  • [:upper:] :所有大写字母
  • [:xdigit:] :所有 16 进位制的数字
  • [=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)
$ echo 'a bdsfa' | tr -d a
 bdsf
 
 
$ echo 'aaaa bdsfa' | tr -s a c
c bdsfc
$ echo 'aaaa bdsfa' | tr a-z A-Z
AAAA BDSFA


$ echo 'aaa bbb ccc' | tr [:lower:] [:upper:]
AAA BBB CCC

tune2fs 修改ext4 的label name 与UUID

tune2fs [-l] [-L Label] [-U uuid] 装置档名

选项与参数:

-l :类似dumpe2fs -h的功能~将superblock内的资料读出来~

-L :修改LABEL name

-U :修改UUID啰!

范例:列出/dev/vda5的label name之后,将它改成vbird_ext4 
[root@study ~]# dumpe2fs -h /dev/vda5 | grep name 
dumpe2fs 1.42.9 (28-Dec-2013) 
Filesystem volume name: <none>    #果然是没有设定的!

[root@study ~]# tune2fs -L vbird_ext4 /dev/vda5 
[root@study ~]# dumpe2fs -h /dev/vda5 | grep name 
Filesystem volume name: vbird_ext4 
[root@study ~]# mount LABEL=vbird_ext4 /data /ext4

tac 反向读取文档

cat 的倒序,与cat 类似,只是从最后一行开始显示。

[root@bogon temp]# cat a
a 1
b 2
c 3
d 4
[root@bogon temp]# tac a
d 4
c 3
b 2
a 1

U

umask 权限预设

umask可以查看当前系统创建文档时预设的权限。

umask显示的是减去的权限值!

如果umask 是 0022,第一个数字是特殊权限,后三位是022,意味着:u=7-0=7, g=7-2=5, o=7-2=5, 也就是说预设的权限是:755

语法:

umask      # 查看权限预设值,以数字形式显示
umask -S   # 正常形式查看
umask 002  # 设置权限002
[root@study ~]# umask 
0022              <== 与一般权限有关的是后面三个数字!
[root@study ~]$ umask -S
u=rwx,g=rx,o=rx

umount 卸载装置

umount [-fn]装置档名或挂载点

选项与参数:

  • -f :强制卸载!可用在类似网路档案系统(NFS)无法读取到的情况下;
  • -l :立刻卸载档案系统,比-f还强!
  • -n :不更新/etc/mtab情况下卸载。
[root@study ~]# umount /dev/vda4       <==用装置档名来卸载 
[root@study ~]# umount /data/ext4      <==用挂载点来卸载 

uname 显示系统信息

uname [-amnrsv][--help][--version]

参数说明

  • -a或--all  显示全部的信息。
  • -m或--machine  显示电脑架构:64/32
  • -n或-nodename  显示在网络上的主机名称。
  • -r或--release  显示操作系统的发行编号,内核版本
  • -s或--sysname  显示操作系统名称。
  • -v  显示操作系统的版本。
  • --help  显示帮助。
  • --version  显示版本信息。
[root@bogon temp]# uname -s
Linux
[root@bogon temp]# uname -r
3.10.0-1127.13.1.el7.x86_64

uniq 删除重复内容

不显示重复资料

uniq [-ic] 

选项与参数:

  • -i :忽略大小写字符的不同;
  • -c :进行计数
[dmtsai@study ~]$ last | cut -d ' ' -f1 | sort | uniq -c
      1
      6 (unknown
     47 dmtsai
      4 reboot
      7 root
      1 wtmp
# 从上面的结果可以发现reboot 有4 次, root 登入则有7 次!大部分是以dmtsai 来操作!

uptime

查看系统时间和负载,和 top 命令的第一行信息一样。

当前时间:开机多久了:用户数:1,5,15 分钟的平均负载

[root@study ~]# uptime
 02:35:27 up 7:48, 3 users, load average: 0.00, 0.01, 0.05

useradd 添加用户

useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c说明栏] [-d家目录绝对路径] [- s shell]帐号名

选项与参数:

  • -u :后面接的是UID ,是一组数字。直接指定一个特定的UID 给这个帐号;
  • -g :后面接的那个群组名称就是我们上面提到的initial group , 该群组的GID 会被放置到/etc/passwd 的第四个栏位内。
    -G :后面接的群组名称则是这个帐号还可以加入的群组。这个选项与参数会修改/etc/group 内的相关资料
  • -M :强制!不要建立使用者家目录!(系统帐号预设值)
  • -m :强制!要建立使用者家目录!(一般帐号预设值)
  • -c :这个就是/etc/passwd 的第五栏的说明内容
  • -d :指定某个目录成为家目录,而不要使用预设值。务必使用绝对路径!
  • -r :建立一个系统的帐号,这个帐号的UID 会有限制(参考/etc/login.defs)
  • -s :后面接一个shell ,若没有指定则预设是/bin/bash
  • -e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入shadow 第八栏位,即帐号失效日的设定项目
  • -f :后面接shadow 的第七栏位项目,指定密码是否会失效。0为立刻失效,-1 为永远不失效(密码只会过期而强制于登入时重新设定而已。)
$ useradd -u 1500 -g users vbird2 

使用useradd后,需要passwd命令设置密码才能使用账号。

useradd 的参考文档

[root@study ~]# useradd -D 
GROUP=100		 <==预设的群组 
HOME=/home		 <==预设的家目录所在目录 
INACTIVE=-1		 <==密码失效日,在shadow内的第7栏 
EXPIRE=			 <==帐号失效日,在shadow内的第8栏 
SHELL=/bin/bash		 <==预设的shell 
SKEL=/etc/skel		 <==使用者家目录的内容资料参考目录 
CREATE_MAIL_SPOOL=yes    <==是否主动帮使用者建立邮件信箱(mailbox)

usermod 修改用户

修改用户的信息。

usermod [-cdegGlsuLU] username 
选项与参数:
-c :后面接帐号的说明,即/etc/passwd 第五栏的说明栏,可以加入一些帐号的说明。
-d :后面接帐号的家目录,即修改/etc/passwd 的第六栏;
-e :后面接日期,格式是YYYY-MM-DD 也就是在/etc/shadow 内的第八个栏位资料
-f :后面接天数,为shadow 的第七栏位。
-g :将群组设置为该用户的默认群组
-G :将群组添加到用户的群组列表中
-a :与-G 合用,可『增加次要群组的支援』而非『设定』
-l :后面接帐号名称。亦即是修改帐号名称, /etc/passwd 的第一栏!
-s :后面接Shell 的实际档案,例如/bin/bash 或/bin/csh 等等。
-u :后面接UID 数字啦!即/etc/passwd 第三栏的资料;
-L :暂时将使用者的密码冻结,让他无法登入。其实仅改/etc/shadow 的密码栏。
-U :将/etc/shadow 密码栏的! 拿掉,解冻

userdel 删除用户

删除用户,如果想要完整的将某个帐号移除,最好可以在下达userdel -r username之前,先以『 find / -user username 』查出整个系统内属于username的档案,然后再加以删除

userdel [-r] username 
选项与参数:
-r :连同使用者的家目录也一起删除

V

vmstat 虚拟内存统计

vmstat可以对系统的虚拟内存、cpu、进程等监控。

所谓虚拟内存,就是交换空间的内存(swap space),它是磁盘虚拟化出来的一个逻辑内存,用作内存的扩展。

vmstat [options] [ delay ] [ times]
选项与参数:
-a :使用inactive/active(活跃与否) 取代buffer/cache 的内存输出资讯;
-f :开机到目前为止,系统复制(fork) 的程序数;
-s :将一些事件(开机至目前为止) 导致的内存变化情况列表说明;
-S :后面可以接单位,让显示的资料有单位。例如K/M 取代bytes 的容量;
-d :列出磁碟的读写总量统计表
-p :后面列出分割槽,可显示该分割槽的读写总量统计表

delay:延迟时间(秒),每隔几秒刷新一次
times:刷新几次,刷新完成后退出命令。

示例:

[root@study ~]# vmstat 1 3
procs ------------memory---------- ---swap-- -----io---- -system-- ------ cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 1 0 0 1838092 1504 722216 0 0 4 1 6 9 0 0 100 0 0
 0 0 0 1838092 1504 722200 0 0 0 0 13 23 0 0 100 0 0
 0 0 0 1838092 1504 722200 0 0 0 0 25 46 0 0 100 0 0
  • 程序栏位(procs)的项目分别为:
    r :等待运作中的程序数量;b:不可被唤醒的程序数量。这两个项目越多,代表系统越忙碌(因为系统太忙,所以很多程序就无法被执行或一直在等待而无法被唤醒之故)。
  • 内存栏位(memory)项目分别为:
    swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff:用于缓冲内存; cache:用于快取内存。
  • 内存置换空间(swap)的项目分别为:
    si:由磁碟中将程序取出的量; so:由于内存不足而将没用到的程序写入到磁碟的swap的容量。如果si/so的数值太大,表示内存内的资料常常得在磁碟与主内存之间传来传去,系统效能会很差!
  • 磁碟读写(io)的项目分别为:
    bi:由磁碟读入的区块数量; bo:写入到磁碟去的区块数量。如果这部份的值越高,代表系统的I/O非常忙碌!
  • 系统(system)的项目分别为:
    in:每秒被中断的程序次数; cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与周边设备的沟通非常频繁!这些周边设备当然包括磁碟、网路卡、时间钟等。
  • CPU的项目分别为:
    us:非核心层的CPU使用状态; sy:核心层所使用的CPU状态; id:闲置的状态; wa:等待I/O所耗费的CPU状态; st:被虚拟机器( virtual machine)所盗用的CPU使用状态(2.6.11以后才支援)。

查看磁盘:

范例二:系统上面所有的磁碟的读写状态 
[root@study ~]# vmstat -d
disk- ------------reads------------ ------------writes---------- - -----IO------
   total merged sectors ms total merged sectors ms cur sec
vda 21928 0 992587 47490 7239 2225 258449 13331 0 26
sda 395 1 3168 213 0 0 0 0 0 0
sr0 0 0 0 0 0 0 0 0 0 0
dm-0 19139 0 949575 44608 7672 0 202251 16264 0 25
dm-1 336 0 2688 327 0 0 0 0 0 0
md0 212 0 1221 0 14 0 4306 0 0 0
dm-2 218 0 9922 565 54 0 4672 128 0 0
dm-3 179 0 957 182 11 0 4306 68 0 0

W

wc 统计行,单词,字节

wc [-lwm] 

选项与参数:

  • -l :仅列出行;
  • -w :仅列出多少字(英文单字);
  • -m :多少字符;
[dmtsai@study ~]$ cat /etc/man_db.conf | wc
    131 723 5171
# 输出的三个数字中,分别代表: 『行、字数、字符数』

which 查询命令的路径

which [-a] command 

选项或参数:

  • -a :将所有由PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

whereis 定位二进制文件,man手册位置

whereis [-bmsu] 档案或目录名

选项与参数:

  • -l :可以列出whereis 会去查询的几个主要目录而已
  • -b :只找binary 格式的档案
  • -m :只找在说明档manual 路径下的档案
  • -s :只找source 来源档案
  • -u :搜寻不在上述三个项目当中的其他特殊档案
[root@bogon temp]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

X

xargs 从stdin重建并执行命令

xargs可以读入stdin的资料,并且以空白字符或断行字符作为分辨,将stdin的资料分隔成为arguments,很多命令不支持管道命令,xargs可以将stdin给相应的命令使用。

参数:

  • -t:显示执行的命令
  • -d 分隔符:分隔符
  • -p:用户确认
  • -n 数量:指定将几个参数传递给命令
  • -i str:给参数的值起个变量名 str,默认是{},官方建议使用-I
  • -I str:类似-i
  • -0:以null作为分隔符
  • -L 数量:用几行作为命令参数
  • -P 数量:一次用几个进程执行

xargs默认接echo,直接输入xargs后,会等待用户输入,直到用户输入 ctrl+d,才会结束

$ xargs
abc
def
hik       <--- 此处输入完成后回车,ctrl+d
abc def hik    <-----显示的结果,将你输入的内容按照空白字符分割(空格,回车换行等),打印出来

-t:显示执行的命令

$ xargs -t     # -t 参数:显示执行的命令
abc
123            # 输入了abc和123,ctrl+d结束输入
echo abc 123   # 实际执行的命令是 echo
abc 123

-d 分隔符:分隔符

xargs默认用空格、换行符、制表符等作为分割,把标准输入分割成一个个命令参数

$ echo 'a b      c' | xargs
a b c          <-- 把上面空格分割,然后打印出来各个参数

自定义分隔:

$ echo 'a b      c' | xargs -d 'b'      <-- 用字符‘b’分割
a        c

-p:用户确认

-p参数可以在执行命令时,弹出确认消息,让用户确认后才会执行相应的命令

$ echo 'a b      c' | xargs -d 'b' -p
echo a        c
 ?...y               <-- 输入y,确认
a        c

-n 数量:指定将几个参数传递给命令

不用-n参数

$ echo 'a      b c' | xargs -t echo
echo a b c       # 执行的是 echo a b c,也就是把所有的参数一次性传递给了echo
a b c

每次传递一个参数,也就是将a b c这三个参数,一个一个的交给echo执行

$ echo 'a      b c' | xargs -n 1 -t echo   # 设定每次传递1个参数给echo
echo a          # 看的出来,就传递了一个a
a
echo b
b
echo c
c

-i str:给参数的值起个变量名 str,默认是{},官方建议使用-I

先ls一下,查看文件

$ ls
aaa  chrome.lnk*  eclipse.lnk*  help.txt  name.txt  Typora.lnk*
$ ls | xargs -i echo "{} .." # 将传递进来的参数,用{}代替
aaa ..
chrome.lnk* ..
eclipse.lnk* ..
help.txt ..
name.txt ..
Typora.lnk* ..

-I str:类似-i

$ ls | xargs -I 'name' echo "name ...."  # 将传递的参数命名为name
aaa ....
chrome.lnk* ....
eclipse.lnk* ....
help.txt ....
name.txt ....
Typora.lnk* ....

-0:以null作为分隔符

find命令有个参数 -print0,可以将查找的内容以 null 分割,-0参数可以配合使用

正常的find

$ find -type f
./a b c   e.pub      # 注意这个名字带有空格的文件
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

find 命令的 -print0 参数

$ find -type f -print0
./a b c   e.pub./aaa./chrome.lnk./eclipse.lnk./help.txt./name.txt./Typora.lnk  # 以null分割

配合xargs使用,名字带有空格的文件,被拆分了!

$ find -type f | xargs -n 1
./a     # 文件名有空格,被拆开了
b
c
e.pub
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

使用 -print0 和 xargs 的 -0

$ find -type f -print0 | xargs -n 1 -0
./a b c   e.pub              # 文件完好
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

其实上面这个例子不使用 -0 也可以,比如手动指定分隔符为 \n,即回车换行符,而不用默认的空白符号:

$ find -type f| xargs -d '\n' -n 1
./a b c   e.pub
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

-L 数量:用几行作为命令参数

-L可以将每行的数据进行分割,然后再把几行的数据重组,作为一个整体传递给下一个命令

下面的例子有三行数据,注意中间的\n,前两行数据又有很多空格,xargs将这些行进行分割,然后每几行的参数放到一起,传递给下一个命令(默认是echo,显示消息)

$ printf "a    b c\nd e     f\nghi" | xargs -L 1
a b c           # a b c,一次传递一行参数给echo
d e f
ghi
$ printf "a    b c\nd e     f\nghi" | xargs -L 2 
a b c d e f     # 一次性传递了两行
ghi

-P 数量:一次用几个进程执行

-P 0 代表不限制几个进程,-P 2代表用2个进程。

xfs_admin 修改XFS 档案系统的 UUID 与Label name

如果你当初格式化的时候忘记加上标头名称,后来想要再次加入时,不需要重复格式化!直接使用这个xfs_admin 即可。

xfs_admin [-lu] [-L label] [-U uuid] 装置档名

选项与参数:

  • -l :列出这个装置的label name
  • -u :列出这个装置的UUID
  • -L :设定这个装置的Label name
  • -U :设定这个装置的UUID喔!
范例:设定/dev/vda4的label name为vbird_xfs,并测试挂载 
[root@study ~]# xfs_admin -L vbird_xfs /dev/vda4 
writing all SBs 
new label = "vbird_xfs"                  #产生新的LABEL名称啰!
[root@study ~]# xfs_admin -l /dev/vda4 
label = "vbird_xfs" 
[root@study ~]# mount LABEL=vbird_xfs /data/xfs/ 

范例:利用uuidgen产生新UUID来设定/dev/vda4,并测试挂载 
[root@study ~]# umount /dev/vda4        #使用前,请先卸载!
[root@study ~]# uuidgen
e0fa7252-b374-4a06-987a-3cb14f415488     #很有趣的指令!可以产生新的UUID喔!
[root@study ~]# xfs_admin -u /dev/vda4 
UUID = e0a6af55-26e7-4cb7-a515-826a8bd29e90 
[root@study ~]# xfs_admin -U e0fa7252-b374-4a06-987a-3cb14f415488 /dev/vda4 
Clearing log and setting UUID 
writing all SBs 
new UUID = e0fa7252-b374-4a06-987a-3cb14f415488 
[root@study ~]# mount UUID=e0fa7252-b374-4a06-987a-3cb14f415488 /data/xfs

xfsdump xfs系统备份

xfsdump可以备份xfs文件系统,并且将备份的相关资讯(档案系统/时间/session ID等等) 写入/var/lib/xfsdump/inventory 中,准备让下次备份时可以作为一个参考依据,可以设置level,进行差异备份。

xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份档] 待备份资料 
xfsdump -I 

选项与参数:

-L :xfsdump 会纪录每次备份的session 标头,这里可以填写针对此档案系统的简易说明

-M :xfsdump 可以纪录储存媒体的标头,这里可以填写此媒体的简易说明

-l :是L 的小写,就是指定等级~有0~9 共10 个等级,可以进行差异备份 (预设为0,即完整备份)

-f :有点类似tar 啦!后面接产生的档案,亦可接例如/dev/st0 装置档名或其他一般档案档名等

-I :从/var/lib/xfsdump/inventory 列出目前备份的资讯状态

备份:

xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
# 0.看一下有没有任何档案系统被xfsdump过的资料?
[root@study ~]# xfsdump -I
file system 0:
    fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c
    session 0:
        mount point: study.centos.vbird:/boot
        device: study.centos.vbird:/dev/vda2
        time: Wed Jul 1 18:43:04 2015
        session label: "boot_all"
        session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1
        level: 0
        resumed: NO
        subtree: NO
        streams: 1
        stream 0:
                pathname: /srv/boot.dump
                start: ino 132 offset 0
                end: ino 2138243 offset 0
                interrupted: NO
                media files: 1
                media file 0:
                        mfile index: 0
                        mfile type: data
                        mfile size: 102872168
                        mfile start: ino 132 offset 0
                        mfile end: ino 2138243 offset 0
                        media label: "boot_all"
                        media id: a6168ea6-1ca8-44c1-8d88-95c863202eab
xfsdump: Dump Status: SUCCESS
# 我们可以看到目前仅有一个session 0 的备份资料而已!而且是level 0 喔!

# 1.先恶搞一下,建立一个大约10 MB的档案在/boot内: 
[root@study ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.166128 seconds, 63.1 MB/s

# 2.开始建立差异备份档,此时我们使用level 1吧: 
[root@study ~]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot 
....(中间省略)....


# 3.最后再看一下是否有记录level 1备份的时间点呢?
[root@study ~]# xfsdump -I 
file system 0:
    fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c
    session 0:
        mount point: study.centos.vbird:/boot
        device: study.centos.vbird:/dev/vda2
....(中间省略)....

    session 1:
        mount point: study.centos.vbird:/boot
        device: study.centos.vbird:/dev/vda2
        time: Wed Jul 1 18:46:21 2015
        session label: "boot_2"
        session id: c71d1d41-b3bb-48ee-bed6-d77c939c5ee8
        level: 1
        resumed: NO
        subtree: NO
        streams: 1
        stream 0:
                pathname: /srv/boot.dump1
                start: ino 455518 offset 0
....(底下省略)....

xfsrestore

xfsrestore -I                                     <==用来察看备份档案资料 
xfsrestore [-f 备份档] [-L S_label] [-s 目录/文档] 目录  <==单一档案全系统复原 
xfsrestore [-f 备份档] -r 目录                 <==透过累积备份档来复原系统 
xfsrestore [-f 备份档] -i 目录                 <==进入互动模式

选项与参数:

  • -I :跟xfsdump 相同的输出!可查询备份资料,包括Label 名称与备份时间等
  • -f :后面接的就是备份档!企业界很有可能会接/dev/st0 等磁带机!我们这里接档名!
  • -L :就是Session 的Label name 喔!可用-I 查询到的资料,在这个选项后输入!
  • -s :仅复原某一个档案或目录
  • -r :如果是用档案来储存备份资料,那这个就不需要使用。如果是一个磁带内有多个档案,需要这东西来达成累积复原
  • -i :进入互动模式,进阶管理员使用的!一般我们不太需要操作它!

互动模式:

# 1.先进入备份档案内,准备找出需要备份的档名资料,同时预计还原到/tmp/boot3当中!
[root@study ~]# mkdir /tmp/boot3 
[root@study ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot3
 ========================== subtree selection dialog ===================== =====

the following commands are available:
        pwd
        ls [ <path> ]
        cd [ <path> ]
        add [ <path> ]        #可以加入复原档案列表中 
        delete [ <path> ]     #从复原列表拿掉档名!并非删除喔!
        extract               #开始复原动作!
        quit
        help

 -> ls
          455517 initramfs-3.10.0-229.el7.x86_64kdump.img
             138 initramfs-3.10.0-229.el7.x86_64.img
             141 initrd-plymouth.img
             140 vmlinuz-0-rescue-309eb890d09f440681f596543d95ec7a
             139 initramfs-0-rescue-309eb890d09f440681f596543d95ec7a.img
             137 vmlinuz-3.10.0-229.el7.x86_64
             136 symvers-3.10.0-229.el7.x86_64.gz
             135 config-3.10.0-229.el7.x86_64
             134 System.map-3.10.0-229.el7.x86_64
             133 .vmlinuz-3.10.0-229.el7.x86_64.hmac
         1048704 grub2/
             131 grub/

 -> add grub 
 -> add grub2 
 -> add config-3.10.0-229.el7.x86_64 
 -> extract

[root@study ~]# ls -l /tmp/boot3
-rw-r--r--. 1 root root 123838 Mar 6 19:45 config-3.10.0-229.el7.x86_64
drwxr-xr-x. 2 root root 26 May 4 17:52 grub
drwxr-xr-x. 6 root root 104 Jun 25 00:02 grub2
# 就只会有3 个档名被复原,当然,如果档名是目录,那底下的子档案当然也会被还原回来的!

xz 压缩文件

和gzip 、bzip2相比,xz压缩比更高,但是速度也最慢

xz [-dtlkc#] 档名 
xcat档名.xz 

选项与参数:

-d :解压缩

-t :测试压缩档的完整性,看有没有错误

-l :列出压缩档的相关资讯

-k :保留原本的档案不删除~

-c :压缩后的信息直接输出到屏幕,可以配合重定向指定压缩文件。

-# :同样的,也有较佳的压缩比的意思!

[root@bogon temp]# xz -c a > a.xz
[root@bogon temp]# ll
总用量 20
-rw-r--r--. 1 root     root     16 9月   5 13:18 a
-rw-r--r--. 1 root     root     72 9月   5 13:30 a.xz

Y

yum 安装工具

1. 查看软件信息,可更新列表

yum [option] [查询工作项目] [相关参数] 
选项与参数:
[option]::
  -y :当yum 要等待使用者输入时,这个选项可以自动提供yes 的回应;
  --installroot=/some/path :将该软件安装在/some/path 而不使用预设路径
[查询工作项目] [相关参数]:这方面的参数有:
  search :搜寻某个软件名称或者是描述(description) 的重要关键字;
  list :列出目前yum 所管理的所有的软件名称与版本,有点类似rpm -qa;
  info :同上,不过有点类似rpm -qai 的执行结果;
  provides:从档案去搜寻软件!类似rpm -qf 的功能!

查找软件示例:

[root@study ~]# yum search raid 
Loaded plugins: fastestmirror, langpacks       # yum系统自己找出最近的yum server 
Loading mirror speeds from cached hostfile     #找出速度最快的那一部yum server 
 * base: ftp.twaren .net                        #底下三个软件库,且来源为该伺服器!
 * extras: ftp.twaren.net
 * updates: ftp.twaren.net
....(前面省略)....
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
....(后面省略)....
# 在冒号(:) 左边的是软件名称,右边的则是在RPM 内的name 设定(软件名)

yum服务器上的软件:

[root@study ~]# yum list 
Installed Packages    <==已安装软件
GConf2.x86_64 3.2.6-8.el7 @anaconda
LibRaw.x86_64 0.14.8-5.el7.20120830git98d925 @base
ModemManager.x86_64 1.1.0-6.git20130913.el7 @anaconda
....(中间省略).... 
Available Packages    <==还可以安装的其他软件
389-ds-base.x86_64 1.3.3.1-20.el7_1 updates
389-ds-base-devel.x86_64 1.3.3.1-20.el7_1 updates
389-ds-base-libs.x86_64 1.3.3.1-20.el7_1 updates

可更新的软件:

[root@study ~]# yum list updates   <==一定要是update s喔!
Updated Packages
NetworkManager.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates
NetworkManager-adsl.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates

2. 安装,更新,删除软件

yum [option] [安装与升级的工作项目] [相关参数] 
选项与参数:
  install :后面接要安装的软件!
  update :后面接要升级的软件,若要整个系统都升级,就直接update 即可
  remove :卸载某个软件

示例:

$ yum -y install pam-devel
$ yum remove pam-devel

3. 安装源

查看使用的安装源:

$ yum repolist all 

修改安装源:

修改 /etc/yum.repos.d/CentOS-Base.repo,最重要的是 baseurl 这个参数,它就是默认的安装源。

[root@study ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  • [base]:代表软件库的名字!中括号一定要存在,里面的名称则可以随意取。但是不能有两个相同的软件库名称, 否则yum 会不晓得该到哪里去找软件库相关软件清单档案。
  • name:只是说明一下这个软件库的意义而已,重要性不高!
  • mirrorlist=:列出这个软件库可以使用的映射站台,如果不想使用,可以注解到这行;
  • baseurl=:这个最重要,因为后面接的就是软件库的实际网址!mirrorlist 是由yum 程式自行去捉映射站台, baseurl 则是指定固定的一个软件库网址!我们刚刚找到的网址放到这里来啦!
  • enable=1:就是让这个软件库被启动。如果不想启动可以使用enable=0 喔!
  • gpgcheck=1:还记得RPM 的数位签章吗?这就是指定是否需要查阅RPM 档案内的数位签章!
  • gpgkey=:就是数位签章的公钥档所在位置!使用预设值即可

清理 yum 缓存:

yum clean [packages|headers|all] 
选项与参数:
 packages:将已下载的软件档案删除
 headers :将下载的软件档头删除
 all :将所有软件库资料都删除!
范例一:删除已下载过的所有软件库的相关资料(含软件本身与清单) 
[root@study ~]# yum clean all

4. 群组安装

yum [群组功能] [软件群组] 
选项与参数:
   grouplist :列出所有可使用的『软件群组组』,例如Development Tools 之类的;
   groupinfo :后面接group_name,则可了解该group 内含的所有软件名;
   groupinstall:这个好用!可以安装一整组的软件群组,相当的不错用!
   groupremove :移除某个软件群组;

示例:查阅已安装和可安装的群组

范例一:查阅目前软件库与本机上面的可用与安装过的软件群组有哪些?
[root@study ~]# yum grouplist 
Installed environment groups:             #已经安装的系统环境软件群组
   Development and Creative Workstation
Available environment groups:             #还可以安装的系统环境软件群组
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
Installed groups:                         #已经安装的软件群组!
   Development Tools
Available Groups:                         #还能额外安装的软件群组!
   Compatibility Libraries
   Console Internet Tools
   Graphical Administration Tools
   Legacy UNIX Compatibility
   Scientific Support
   Security Tools
   Smart Card Support
   System Administration Tools
   System Management
Done

安装群组:

[root@study ~]# yum groupinstall "Scientific Support"

Scientific Support 里面的软件都是『可选择的』!而不是『强制的(mandatory)』, 因此预设情况下,上面这些软件通通不会帮你安装!!如果你想要安装上述的软件,那就得要修改设定档:

[root@study ~]# vim /etc/yum.conf 
.....(前面省略)..... 
distroverpkg=centos-release    #找到这一行,底下新增一行!
group_package_types=default, mandatory, optional 
.....(底下省略).....

[root@study ~]# yum groupinstall "Scpport"

Z

zcat 查看压缩档的内容

范例二:由于services是文字档,请将范例一的压缩档的内容读出来! 
[dmtsai@study tmp]$ zcat services.gz  
#由于services这个原本的档案是是文字档,因此我们可以尝试使用zcat/zmore/zless去读取! 
#此时屏幕上会显示servcies.gz 解压缩之后的原始档案内容!

zgrep 查找压缩档的内容

范例五:由范例四再次建立的services.gz中,找出http这个关键字在哪几行?
[dmtsai@study tmp]$ zgrep -n 'http' services.gz
14:# http://www.iana.org/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
90:http 80/udp www www-http # HyperText Transfer Protocol
posted @ 2020-09-05 17:01  wztshine  阅读(468)  评论(0编辑  收藏  举报