鸟哥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开机流程:
- BIOS:开机主动执行的程序,用于找到可以开机的设备(含有主引导记录的设备)
- MBR:设备中第一个磁区内的主引导记录,内含引导加载程序
- 引导加载程序(boot loader):Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过它,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
- 操作系统:。。。
引导加载程序(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
-
终端切换,退出
- [Ctrl] + [Alt] + [F2] ~ [F6] :文字界面登入tty2 ~ tty6 终端机;
- [Ctrl] + [Alt] + [F1] :图形介面桌面。
- 从终端启动图形界面:
[dmtsai@study ~]$ startx
- 退出终端:
exit
-
查看、修改语言
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才行!
-
date
语法:
$ date +%Y/%m/%d $ date +%H:%M
[dmtsai@study ~]$ date +%Y/%m/%d 2015/05/29 [dmtsai@study ~]$ date +%H:%M 14:33
-
cal
语法:
cal # 当前月的日历 cal [month] [year] # 某年某月日历
-
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.
-
按键
[Ctrl]-c : 程序终止
[Ctrl]-d:键盘输入结束(End Of File, EOF或End Of Input)』;相当于exit;
[Tab] : 命令自动补全
-
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 [指令] (根据关键字查找指令)
-
sync
同步资料,将缓存写入硬盘
用法:
sync
-
shutdown
语法:
shutdown [-krhc] [时间] [警告讯息]
选项与参数:
-
-k : 不要真的关机,只是发送警告讯息出去!
-
-r : 在将系统的服务停掉之后就重新开机(常用)
-
-h : 将系统的服务停掉后,立即关机。(常用)
-
-c : 取消已经在进行的shutdown 指令内容。
-
时间: 指定系统关机的时间!默认1 分钟。
- 20:15 (指定时间关机)
- now (立刻关机)
- +10 (10分钟后关机)
-
-
reboot
reboot systemctl reboot
-
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等压缩指令,进行压缩打包
账号管理
用户登录系统步骤:
- 先找寻/etc/passwd 里面是否有你输入的帐号,如果没有则报错,如果有的话则将该帐号对应的 UID 与GID,家目录,shell设定 (在/etc/group 中) 读出来
- 核对密码表,进入/etc/shadow 里面找出对应的帐号与 UID,核对一下你刚刚输入的密码与里头的密码是否相符
- 上述无误后,就进入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::: <==底下说明
账号:加密后的密码:密码变动日期:需要过几天才能再次更改密码的日期:密码更改周期:密码变动前警告天数:过期后几天失效:失效日期:保留栏位
-
帐号名称:
第一栏就是帐号,必须要与/etc/passwd相同 -
密码:
经过编码的密码(加密),这个档案的预设权限是『-rw-------』或者是『----------』,亦即只有root才可以读写,由于各种密码编码的技术不一样,因此不同的编码系统会造成这个栏位的长度不相同。由于固定的编码系统产生的密码长度必须一致,因此『当你让这个栏位的长度改变后,该密码就会失效(算不出来)』,在此栏位前加上!或*改变密码栏位长度,就会让密码『暂时失效』了。 -
最近更动密码的日期:
这个栏位记录了『更动密码那一天』的日期,是以1970年1月1日作为1而累加的日期
-
密码不可被更动的天数:(与第3栏位相比)
这个帐号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是0的话,表示密码随时可以更动的意思。 -
密码需要重新变更的天数:(与第3栏位相比)
为了强制要求使用者变更密码,这个栏位可以指定在最近一次更改密码后,在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设定你的密码,否则这个帐号的密码将会『变为过期特性』 -
密码需要变更期限前的警告天数:(与第5栏位相比)
当帐号的密码有效期限快要到的时候(第5栏位),系统会依据这个栏位的设定,发出『警告』言论给这个帐号,提醒他。 -
密码过期后的帐号宽限时间(密码失效日):(与第5栏位相比)
密码有效日期为『更新日期(第3栏位)』+『重新变更日期(第5栏位)』,过了该期限后使用者依旧没有更新密码,那该密码就算过期了。 -
帐号失效日期:
这个日期跟第三个栏位一样,都是使用1970年以来的总日数设定。这个栏位表示: 这个帐号在此栏位规定的日期之后,将无法再使用。 -
保留栏:
最后一个栏位是保留的,看以后有没有新功能加入。
/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:::
- 群组名称
- 密码栏,同样的,开头为! 表示无合法密码,所以无群组管理员
- 群组管理员的帐号(相关资讯在gpasswd中介绍)
- 加入该群组支援的所属帐号(与/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的方法:
- 运行程序时:nice命令
- 已经存在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以上大小的文件。
选项与参数:
- 与时间有关的选项:-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 还要新的档案档名
- 与使用者或群组名称相关:
- -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 搜寻。
- 与档案权限及名称有关的参数:
-
-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