Linux(CentOS7)学习笔记

目录

Linux 笔记[1]

第零章 计算机概论

第一章 Linux是什么与如何学习

第二章 主机规划与磁盘分区

2.1.Linux 与硬件的搭配

  • 常见设备与其在 Linux 当中的文件名:

    设备 文件名
    SCSI/SATA/USB硬盘机 /dev/sd[a-p]
    USB 闪存盘 /dev/sd[a-p]
    VirtI/O 界面 /dev/vd[a-p]
    软盘机 /dev/fd[0-7]
    打印机 /dev/lp[0-2](25针打印机)、/dev/usb/lp[0-15](USB接口)
    鼠标 /dev/input/mouse[0-15](通用)、/dev/psaux(PS/2界面)、/dev/mouse(当前鼠标)
    CD-ROM/DVD-ROM /dev/scd[0-1](通用)、/dev/sr[0-1](通用,CentOS较常见)、/dev/cdrom(当前CD-ROM)
    磁带机 /dev/ht0(IDE界面)、/dev/st0(SATA/SCSI界面)、/dev/tape(当前磁带)
    IDE硬盘机 /dev/hd[a-d](旧式系统才有)

2.2.磁盘分区

  • SATA/USB/SAS 等磁盘接口都是使用 SCSI 模块来驱动的,因此这些接口的磁盘设备文件名都是 /dev/sd[a-p] 的格式。

  • MBR 的扩展分区并不是只占一个区块,而是会分布在每个分区的最前面几个扇区来记载分区信息。

  • GPT 使用34个 LBA 区块来记录分区信息。整个磁盘的最后 33 个 LBA 也拿来作为另一个备份。

    LBA0(MBR 相容区块):前 446 Bytes 存储开机程序。后原本记录分区表的记录特殊标准以此表明为 GPT 格式。

    LBA1(GPT 表头记录):记录分区表本身位置与大小、备份用的 GPT 分区放置位置、分区表的检验机制码(CRC32).

    LBA2-33(实际记录分区信息处):每个 LBA 可记录4笔分区记录。

  • fdisk 不认识 GPT,要使用的话用 gdisk 或 parted。

  • 开机过程:BIOS 首先执行,找到第一个扇区的 MBR 位置。执行 MBR 中的开机管理程序(boot loader),载入核心文件。核心文件开始操作系统功能。

    该 boot loader 也可提供个菜单,选择执行其他 boot loader,以选择不同的操作系统。

第三章 安装CentOS7.x

3.1.本练习机的规划——尤其是分区参数

  • 磁盘没有超过2TB,Linux默认以MBR模式处理分区表。

3.2.开始安装 CentOS7

  • 使用 GPT 分区表:Install CentOS 时按tab并输入:...x86_64 rd.live.check quiet inst.gpt。使用 GPT 时需要 BIOS Boot。
  • 安装时所选的项目,包括 root 密码等等,通通会被记录到/root/anaconda-ks.cfg这个文件。

第四章 首次登录与线上求助

4.1.首次登陆系统

4.2.文字模式下指令的下达

4.3.Linux系统的线上求助man page与info page

  • man page 代号代表内容:

    代号 代表内容
    1 使用者在shell环境中可以操作的指令或可执行文件
    5 配置文件或者时某些文件的格式
    8 系统管理员可用的管理指令

    输入/string或者?string向下或者向上寻找string,使用n和N向下或向上翻单词,pgup和pgdn向下或向上翻页,home和end翻第一页或最后一页。

    man page的数据通常放在/usr/share/man这个目录。

    man -f相当于whatisman -k相当于apropos。这两个特殊指令要使用需要创建 whatis 数据库才行(在 root 身份下下达指令mandb)。

  • info page类似man page,它以节点方式组织。任何页面可按h来看一些基本按键功能的介绍。把光标移动到*上按enter进入该节点,按tab可快速移动。

4.4.超简单文书编辑器:nano

4.5.正确的关机方法

  • 看目前有谁在线上who,看网络连接状态netstat -a,看背景执行的程序ps -aux
  • 主机前使用终端机(tty1-tty7)来登录系统时,不论以什么身份都能够关机,若使用远程管理工具(如ssh),只有 root 可以。

第五章 Linux的文件权限与目录配置

5.1.使用者与群组

5.2.Linux 文件权限概念

  • 文件夹的rwx是是否能读到文件名、修改文件名、进入该目录。

  • d目录、-文件、l链接文件、bRAM设备、c一次性读取设备(例如鼠标、键盘)。还有s数据接口文件(sockets)、p数据输送档(FIFO、pipe)

  • cp会复制执行者的属性和权限。

  • 对于目录,如果没有x权限,就无法进入该目录,那么就无法在该目录下执行指令,即使有r、w权限。

5.3.Linux 目录配置

  • FHS:

    一些代表性的目录
    可分享的 不可分享的
    不变的 /usr(软件放置处) /etc(配置文件)
    /opt(第三方协力软件) /boot(开机与核心档)
    可变动的 /var/mail(使用者邮件信箱) /var/run(程序相关)
    /var/spool/news(新闻群组) /var/lock(程序相关)
  • FHS要求必须要存在的目录:

    • /bin:在单人维护模式下还能被操作的指令。
    • /boot:开机会使用到的文件。
    • /dev:设备与周边设备文件。
    • /etc:系统主要的配置文件。一般来说,这个目录下各文件属性可被一般使用者查询,但只有 root 有权修改。
    • /lib:开机时用到的函数库,以及在/bin或/sbin下面的指令会调用的函数库。
    • /media:可移除设备。包括软盘、光盘、DVD等设备暂时挂载于此。
    • /mnt:暂时挂载额外设备。
    • /opt:第三方协力软件。
    • /run:系统开机后所产生的各项信息。
    • /sbin:开机所需要的指令。
    • /srv:一些网络服务启动之后,这些服务所需要取用的数据目录。
    • /tmp:正在执行的程序暂时放置文件的地方。
    • /usr:第二层FHS。
    • /var:第二层FHS,主要为放置变动的数据。

    FHS建议可以存在的目录:

    • /home
    • /lib<qual>
    • /root

    其他:

    • /lost+found:使用 ext2/ext3/ext4 文件系统格式才会有的一个目录。文件系统发生错误时,将一些遗失的片段放置到这个目录。
    • /proc:该目录本身是一个虚拟文件系统,放置的数据在内存中,不占用硬盘空间。
    • /sys:与/proc类似。

第六章 Linux 文件与目录管理

6.1.目录与路径

  • 根目录的上一层与根目录自己是同一个目录。
  • 添加 PATH:PATH="${PATH}:/root",添加/root下所有指令。

6.2.文件与目录管理

  • ls -l 变为 ll 是很多distribution设置的,利用了 Bash shell 的 alias 功能。

6.3.文件内容查询

  • cat、tac、nl、more、less、head、tail、od

6.4.文件与目录的默认权限与隐藏权限

  • 默认创建文件/目录权限为666/777-umask,调用umask可查看umask,调用umask 002可设置。root默认umask为022,一般用户为002。umask默认设置可在/etc/bashrc中。

  • ext2/ext3/ext4下可使用chattr和lsattr设置查看文件隐藏属性。

  • 文件特殊属性s、t。

    • Set UID:出现在文件拥有者的x权限上。

      • SUID 仅对二进制程序有效。执行者需要有x权限。SUID权限仅在执行该程序的过程中有效。执行者将具有该程序拥有者owner的权限。

      如:meyok修改密码需要调用指令/usr/bin/password(-rwsr-xr-x)会临时获得root权限,有root权限才可写入/etc/shadow(----------)。

    • Set GID:出现在文件/目录拥有组的x权限上。

      • 对于文件来说:SGID 仅对二进制程序有效。执行者需要有x权限。执行者将具有该程序拥有者群组的权限。
      • 对于目录来说:使用者若对该目录有rx权限,可进入该目录,使用者在该目录下的有效群组变为该目录的群组,若还有w权限,使用者创建的新文件群组就为该目录的群组。
    • Sticky Bit:只对目录有效。使用者有wx权限时,使用者在该目录下创建的目录和文件只有自己和root才能删除。

  • 文件权限出现大写S/T说明没有x这个权限。使用 chmod 可修改对应权限,SUID、SGID、SBIT对应4、2、1。如chmod 4755 test

  • 使用 file 指令可观察文件类型:属于 ASCII 或者是 data 或者 binary,有没有使用动态函数库等等。

6.5.指令与文件的搜寻

  • which:寻找 PATH 路径下的可执行文件的路径。

    history 是bash内置的指令,不在 PATH中,which找不到。

  • 寻找对应文件的路径,一般先用 whereis/locate,实在找不到用 find。

  • whereis 寻找的是 /bin、/sbin下面的可执行文件以及/usr/share/man下面的man page文件。

  • locate 寻找对应文件路径(文件名包含就行)是根据已创建的数据库 /var/lib/mlocate 里面的数据寻找的,所以不用再去硬盘当中寻找。该数据库每天一更新,使用updatedb可更新locate数据库(该指令会读取/etc/updatedb.conf中的设置,然后区硬盘里面进行搜寻文件名的动作更新数据库文件)。

  • find 本身就可搜索次目录。find是去硬盘中查找的。find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;

第七章 Linux磁盘与文件系统管理

7.1.认识 Linux 文件系统

  • U盘使用的文件系统一般为 FAT 格式,读取方式不用inode用”链接“一个个块。
  • 使用 dumpe2fs 可查询 ext 文件系统的 superblock 信息。

7.3.磁盘的分区、格式化、检验与挂载

  • 使用lsblk(list block device)列出系统上的所有磁盘列表。

  • 使用blkid列出设备的UUID等参数,UUID可用于挂载。

  • parted 列出磁盘的分区表类型和分区信息。如parted /dev/sda print

  • 磁盘分区时,应该先用 lsblk/blkid 先找到磁盘,再用 parted 来找出分区表类型,最后使用 fdisk/gdisk 分区。最后使用partprobe -s更新现在使用的分区表(加参数s会显示信息),可使用cat /proc/partitions查看。

  • fdisk使用柱面作为分区最小单位,而gdisk默认使用sector。

  • 创建新的分区后,需要对磁盘格式化(创建文件系统)。使用mkfs.xfs /dev/sda4,也可添加参数,如使用grep 'processor' /proc/cpuinfo查看系统的 CPU 数目,使用mkfs.xfs -f -d agcount=2 /dev/sda4进行仿真两颗CPU。 //TODO 磁盘阵列 RAID。使用mkfs -t xfs可查看mkfs.xfs的参数说明。

  • 格式化 ext4 文件系统:mkfs.ext4 /dev/sda5,mkfs.ext4的大部分默认值在/etc/mke2fs.conf这个文件中。

  • 使用xfs_repair /dev/sda4可检查/修复xfs文件系统,但只对未挂载的有效。对于已经挂载的需要卸载,根目录无法卸载,可使用-d参数。

  • fsck是一个综合指令,针对ext4可使用fsck.ext4。当superblock因故障损毁时,使用-b参数可使用备份superblock救援。使用dump2fs -h /dev/sda5 | grep 'Blocks per group'可查看下一个block group大小,然后使用fsck.ext4 -b 32768 /dev/sda5检验修复系统。

  • xfs_repair和fsck.ext4不可使用到挂载的分区上。

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中。单一目录不应该重复挂载多个文件系统。要作为挂载点的目录,理论上应该都是空目录才是。

    如,/home与/在同一个文件系统中,/home下有test与vbird两个目录,当/home被挂载新分区时,这两个目录会被隐藏起来,新分区被卸载后原本目录才会跑出来。

  • 使用mount来进行挂载,-t参数可以指定文件类型,但一般不使用,因为CentOS可通过分析superblock(几乎所有文件系统都有)搭配自己的驱动程序来测试挂载,测试成功则使用该类型文件系统挂载。/etc/filesystems有系统指定的测试挂载文件系统类型的优先顺序,/proc/filesystems有Linux'系统已经载入的文件系统类型。Linux支持的文件系统驱动程序在/lib/module/(umaner)/kernel/fs/ext4/lib/module/(umane -r)/kernel/fs/ext4/下

  • 通常使用UUID比设备文件名挂载更可靠,如挂载/dev/sda4:blkid /dev/sda4; mkdir -p /data/xfs; mount UUID="..." /data/xfs; df /data/xfs;

  • 光驱一挂载后就无法退出光盘片了,除非将它卸载。如果用的图形界面,系统会自动帮你挂载这个光盘到/media/里面去。

  • 文件通过major和minor数值代表某个设备,如使用ll /dev/sda*中原本放置文件大小的地方,和lsblk都可查看major、minor,该数值不可乱设置。mknod指令可设置major、minor,bcp分别代表存储、输入、FIFO文件,如:mknod /dev/sda10 b 252 10mknod /tmp/testpipe p,这里测试命令mknod使用完记得删除rm /dev/sda10 /tmp/testpipe

  • 使用xfs_admin可以修改xfs文件系统的UUID与Lable name,使用UUID的原因是在不同的Linux操作系统中可能并不是同一个设备文件名,如U盘在一个操作系统上为/dev/sda,而另一个为/dev/sdb。使用uuidgen可产生一个UUID,xfs_admin 的-l/-L参数列出/设置lable name,-u/-U参数列出/设置UUID,如:xfs_admin -L vbird_xfs /dev/sda4; xfs_damin -l /dev/sda4; mount LABEL=vbird_xfs /data/xfs;

  • 使用tune2fs可以修改ext4文件系统的UUID与Lable name,-L、-U参数与xfs_admin一样,-l参数类似于dumpe2fs -h。

7.4.设置开机挂载

  • 根目录/必须挂载,而且是第一个。

  • /etc/fstab是我们利用mount指令挂载时,将所有选项参数写入的文件。设置开机挂载需要修改这个文件。该文件的字段为:设备/UUID等、挂载点、文件系统、文件系统参数、dump、fsck。dump是用来作为备份的指令。早期开机流程中,会有一段时间检验本机的文件系统看是否完整。这个方式主要是fsck去做的,不过xfs自己会进行检验,不需要额外进行这个动作,所有设置为0。

  • /etc/fstab是开机时的配置文件,实际filesystem的挂载是记录到/etc/mtab与/proc/mounts这两个文件当中的。当/etc/fstab输入数据错误时,导致无法顺利开机成功,进入单人维护模式当中,/是read only的状态,自然无法修改/etc/fstab,也无法更新/etc/mtab,可使用这个指令mount -n -o remount,rw /

  • 特殊设备loop挂载,可挂载光盘/DVD镜像文件,这里以创建大文件以制作loop设备文件为例:使用dd指令制作dd if=/dev/zero of=/srv/loopdev bs=1M count=512,if是input file,/dev/zero一直会输入0的设备,of是out file,写入文件,bs即每个block大小,count即bs数量。然后将其格式化mkfs.xfs -f /srv/loopdev。最后挂载mount -o loop UUID=".." /mnt。使用df查看df /mnt

7.5.内存交换空间创建

  • 以新建一个/dev/sda6分区作为新添加的交换分区为例:使用gdisk创建/dev/sda6分区,partprobe更新分区表,然后mkswap /dev/sda6格式化分区,swapon /dev/sda6启动该分区,中途可使用free查看内存与Swap的情况,swapon -s也可以查看swap的情况。最后修改/etc/fstab:UUID=... swap swap defaults 0 0
  • 使用文件的话,类似上面的创建loop文件后,来格式化swap,再使用。
  • swapoff /tmp/swap /dev/sda6关闭对应使用的分区,swapon -a可根据/etc/fstab中内容打开。
  • Linux支持休眠模式的话,运行中的程序会被记录到swap中。

7.6.文件系统的特殊观察与操作

  • ls的total是该目录下文件占用的block大小,与文件本身大小有区别。

  • parted的print可设置单位,如:parted /dev/sda unit mb print

  • parted也可创建/删除分区,格式为:parted [设备] mkpart [primary|logical|extended] [ext4|vfat|xfs] 开始 结束parted [设备] rm [partition],如:parted /dev/sda mkpart primary fat32 36.0GB 36.5GB

  • parted也可修改分区表格式(MBR<->GPT)。

第八章 文件与文件系统的压缩、打包与备份

8.1.压缩文件的用途与技术

8.2.Linux系统常见的压缩命令

  • *.Z:compress程序压缩的文件;*.zip:zip程序压缩的文件;*.gz:gzip程序压缩的文件;*.bz2:bzip2程序压缩的文件;*.xz:xz程序压缩的文件;*.tar:tar程序打包的数据,并没有压缩过;*.tar.gz:tar程序打包的文件,其中并且通过gzip的压缩;*.tar.bz2:tar程序打包的文件,其中并且通过bzip2的压缩;*.tar.xz:tar程序打包的文件,其中并且通过xz的压缩。
  • gzip、bzip2、xz来对单一文件压缩,zcat/zmore/zless/zgrep、bzcat/bzmore/bzless/bzgrep、xzcat/xzmore/xzless/xzgrep来……。

8.3.打包命令:tar

  • tar命令用于将多个文件打包/分解成一个文件,同时可以压缩/解压缩。j参数表明使用bzip2,可换成z使用gzip(filename后一段拓展名换为gz)或J使用xz(filename后一段拓展名换为xz),c、t、x参数分别表示压缩、查看包内文件名、解压缩,v显示压缩解压缩处理的文件名。f参数指定处理的文件。C参数用在解压缩指明解压缩到的目录。

    • 压缩:tar -jcv -f filename.tar.bz2 要被压缩的文件/目录
    • 查询:tar -jtv -f filename.tar.bz2
    • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压的目录。

    压缩时会把根目录去除掉,以作用解压缩指定解压目录。如果不想拿可添加P参数

  • 只解压缩出某个文件,如etc/shadow,则:

    tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
    tar -jxv -f /root/etc.tar.bz2 etc/shadow

8.4.XFS文件系统的备份与还原

  • xfsdump备份整个xfs文件系统,它要求:该文件系统已被挂载、root权限、只能备份xfs文件系统、备份下来只能由xfsrestore解析、通过文件系统的UUID分辨各个备份文件,不能备份两个具有相同UUID的文件系统。

  • xfsdump是积累备份,下次备份只备份上次备份的差异文件。第一次备份是完整备份为level 0,此后备份为积累备份为level 1、level 2……,level记录放置于/var/lib/xfsdump/inventory中(备份后才有)。

  • 以备份 /boot 为例

    xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
    ll /srv/boot.dump
    ll /var/lib/xfsdump/inventory
    xfsdump -I
    ---------
    dd if=/dev/zero of=/boot/testing.img bs=1M count=10
    xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot
    ll /srv/boot*
    xfsdump -I

    l参数指定备份等级,默认0即完整备份;L参数记录每次备份的session标头,这里可写文件系统的简易说明;M记录存储的媒体标头,这里可写此媒体的简易说明;f参数接产生的文件;I从/var/lib/xfsdump/inventory参数列出目前备份的信息状态。

  • xfsrestore还原xfs系统。需要积累复原,先level0,然后level1……。以复原/boot为例:

    xfsrestore -I
    xfsrestore -f /srv/boot.dump -L boot_all /boot # 这里复原同名会被覆盖,其他新文件会被保留

    若复原level1:

    xfsrestore -f /srv/boot.dump1 /boot

    仅复原某个文件:

    xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /boot

    若不知道复原的文件名,可使用交互模式:

    xfsrestore -f /srv/boot.dump -i /boot
    ->ls
    ->add grub
    ->add grub2
    ...
    ->extract

8.5.光盘写入工具

//TODO

8.6.其他常见的压缩与备份工具

第九章 vim程序编辑器

9.1.vi与vim

  • 为什么要学vi:所有Unix Like系统都会内置vi文本编辑器,其他的不一定;很多个别软件的编程接口都会主动调用vi(如crontab、visudo、edauota等指令);vim具有程序编辑能力;因为程序简单,编辑速度相当快速。

9.2.vi的使用

  • zaiCentOS7中,一般用户的vi被vim取代了,使用vi得输入/bin/vi。

  • 常用的vi/vim指令模式下的快捷键:

    • ctrl+f/b:下/上移动一页。
    • 0/Home、$/End:移动到该行最前、最后。
    • G:移动到文件最后一行。而nG表示移动到第n行,gg表示第一行。
    • n<Enter>、n<space>:向下移动n行,向后移动n个字符。
    • /word、?word:向光标之前、之后寻找字符。使用n、N继续搜寻下一个。
    • :n1,n2s/word1/word2/g:在n1行与n2行中寻找word1并将其替换为word2。若所有行则用1,$s/word1/word2/g,取代前需要确认的话可使用1,$s/word1/word2/gc
    • x,X:在一行中,删除光标后一个/前一个字符。nx删除后n个字符。
    • dd:删除光标所在整行。ndd删除光标所在及以下n行。
    • yy:复制光标所在行。nyy复制光标所在及以下n行。
    • p,P:粘贴复制的行到光标所在行之后/之前。
    • u:复原前一个动作。
    • ctrl+r:重做上一个动作。
    • .:重复前一个动作。
    • i,I:i从目前光标处插入,I从光标行第一个非空白字符处插入。
    • a,A:a从光标的下一个字符处插入,A光标所在行最后一个字符处插入。
    • o,O:在光标所在处的上一行/下一行插入新行。
    • r,R:r取代光标所在字符一次,R会一直取代。
  • 在使用vim编辑时,vim会在与被编辑的文件目录下,在创建一个名为.filename.swp的文件。异常中断vim时,.filename.swp不会消失,使用O可以只读方式打开,使用R可载入.filename.swp的内容,但结束vim后.filename.swp不会自动删除。使用D可字节删除.filename.swp。

9.3.vim的额外功能

  • vim的区块选择,在指令模式下,使用v、V、ctrl+v可选择光标移动的字符、行、块,按y复制、按d删除、按p粘贴。
  • vim可以多文件编辑,输入:files查看当前编辑了那些文件,:n/N切换到下一个/上一个文件。
  • vim可以打开多窗口,输入:sp会再次打开当前文件,:sp filename会打开filename文件,使用ctrl+w在不同窗口切换。
  • vim支持挑字补全功能,插入模式中,ctrl+x后ctrl+n/f/o可根据文件的内容文字/文件名/扩展名予以补全。
  • vim会记录曾经做过的行为,保存在~/.viminfo中(使用后会自动创建)。
  • vim的设置可在指令模式下:set all查看,整体vim的设置值放在/etc/vim中,不过自己的可在~/.vimrc这个文件中设置(自己创建)。

9.4.其他vim使用注意事项

  • 中文编码问题。//TODO

第十章 认识与学习BASH

10.1.认识BASH这个Shell

  • /etc/shells这个文件记录了我们可以使用的shells。

  • 登录后,系统就会给个shell给我们工作,这个登录获取的shell记录在/etc/passwd内。

  • Bash shell的功能:

    • bash能记忆使用的指令记录,前一次登录所执行的记录在~/.bash_history中,这一次的暂存在内存中,登出后记录到~/.bash_history中。
    • tab键补全
    • 设置命令别名,如alias lm='ls -al'
    • 工作控制,前景背景控制//TODO
    • shell scripts
    • 万用字符,如ls -l /usr/bin/X*
  • type命令查询命令是否为Bash shell的内置命令。type [-tpa] name,不加任何参数,会显示出name是外部指令还是bash内置指令;t参数,file表示外部、alias表示别名、builtin表示内部;p参数,name为外部指令时,才会显示完整文件名;a参数,会由PATH路径中将含有name的指令列出来(包含别名)。

  • ctrl+u/k能从光标出删除前面/后面的指令串,ctrl+a/e将光标移动到指令串最前/最后。

10.2.Shell的变量功能

  • 环境变量通常以大写字符来表示。
  • 在bash中,当一个变量名称尚未设置时,默认的内容为空。
  • 使用env可查看环境变量,使用set可查看环境变量与自订变量。
  • $=本shell的PID,?=上个指令的回传值。
  • 使用export不加参数可查看环境变量。
  • Linux主机的终端机接口环境下,无法显示像中文这么复杂的编码文字。
  • 使用locale指令可查询Linux支持的语系,这些语序文件都放在/usr/lib/locale这个目录中。
  • Linux整体默认的语系定义在/etc/locale.conf中。终端接口Bash的语系,与LANG、LC_ALL这几个变量有关。
  • 设置LANG与LC_ALL时,其他语系变量会被取代,要让LC_ALL生效需要export。
  • read加参数-p可指示提示,加参数-t指示等待的秒数,如read -p "input: " -t 30 name
  • declare/typeset设置变量类型。declare的-a设置整列,-i设置整数,-x设置环境变量,-r设置只读(不可更改、unset),-变+可取消动作,设置为只读的话登出再登录才可复原该变量类型。
  • ulimit可设置用户使用资源的限制。复原ulimit方法是登录登出,ulimit -f设置文件大小只能继续变小。
  • ${变量#关键字}、${变量##关键字}、${变量%关键字}、${变量%%关键字}、${变量/旧字串/新字串}、${变量//旧字串/新字串}、${str-expr}、${str:-expr}、${str+expr}、${str:+expr}、${str=expr}、${str:=expr}、${str?expr}、${str:?expr}

10.3.命令别名与历史命令

  • ~/.bash_history记录的数据量由HISTFILESIZE这个变量值决定。
  • history查看最近执行的指令,!number会根据number执行对应指令,!!会执行上一条指令,!command会执行最近以command开头的那一条指令。
  • history -c将当前shell中的history清除,history -w将当前shell中的history写入~/.bash_history。

10.4.Bash Shell 的操作环境

  • 指令被下达时,确定使用的是哪一个的顺序(可使用type -a command查看):

    1.以绝对/相对路径下达,如:/bin/ls。

    2.alias

    3.bash内置(builtin)

    4.PATH

  • bash进站欢迎信息在/etc/issue中,通过telnet远程登陆程序是使用的/etc/issue.net。登录后想让使用者取得的信息在/etc/motd中。

  • bash的配置文件读取分login shell(由完整的登录流程取得的shell)与non-login shell(X window登录Linux后,再以X的图形化接口启动终端机;原本bash环境下再bash)两种情况。更新以下文件后,可使用source或.而不用重新登录使其生效。

    • login shell会读取以下配置文件:/etc/profile(系统的)->~/.bash_profile(个人的)(或者~/.bash_login、~/.profile,按此顺序只会读取一个)。/etc/profile还会调用外部的设置数据:/etc/profile.d/*.sh(/etc/locale.conf由/etc/profile.d/lang.sh调用进来,/usr/share/bash-completion/completions/*由/etc/profile.d/bash_completions.sh调用进来)。
    • non-login shell会读取~/.bashrc文件。该文件会读取/etc/bashrc。
  • 还有以下配置文件:

    • /etc/man_db.conf:man page的查找路径。
    • ~/.bash_history
    • ~/.bash_logout:登出bash后完成的动作
  • 使用stty可设置Linux热键。而bash自己的热键可通过set设置。

  • bash默认的组合键:

    组合按钮 执行结果
    ctrl+c 终止当前命令
    ctrl+d EOF
    ctrl+m Enter
    ctrl+s 暂停屏幕输出
    ctrl+q 恢复屏幕输出
    ctrl+u 在提示字符下,将整列命令删除
    ctrl+z 暂停当前的命令

10.5.数据流重导向

  • find /home -name .bashrc > list 2> list将正确,错误的输入到同一个list文件,但它是乱序的,不建议这么写,可以写成这样:find /home -name .bashrc > list 2>&1find /home -name .bashrc > list &>!

  • /dev/null可以吃掉任何导向这个设备的信息。

10.6.管线命令(pipe)

  • 管线命令只会处理standard output。

  • 撷取命令,通常是针对一行一行来分析的。

    • cut:从每行里取出想要的
      • cut -d '分割字符' -f fields:以分割字符分割,并获取fields个,如 echo ${PATH} | cut -d ':' -f 5获取前五个,echo ${PATH} | cut -d ':' -f 3,5获取第3-第5个。
      • cut -c 字符区间:获取指定字符区间内容,如export | cut -c 12-获取第12个字符及以后,export | cut -c 12-20获取第12-20个字符。
    • grep:某行有想要的取出改行。如last | grep 'root'。反向选择使用-v参数,对某个字符串加上颜色显示用--color=auto ‘str’参数,如grep --color=auto 'MANPATH' /etc/man_db.conf
  • 排序命令

    • sort:排序,默认以第一个数据,以文字型态排序。字符的排序与语系的编码有关。如cat /etc/passwd | sortcat /etc/passwd | sort -t ':' -k 3排序以:(默认tab键分割)分割的第三个排序,使用-n参数会以数字型态排序。
    • uniq:消除重复。-c参数还会计数。

    wc命令:计算字、行、字符。只是用wc都会显示,分别加上l、w、m参数分别显示字、行、字符数量。

  • tee:将数据流分送一份到文件。如ls -l /home | tee -a ~/homefile | more,将ls的信息分送一份到homefile文件中(-a参数以添加的模式,否则会覆盖homefile文件)并在屏幕中显示。

  • 字符替换

    • tr:用于删除/取代讯息中的文字。如last | tr '[a-z]' '[A-Z]',将小写转为大写。cat /etc/passwd | tr -d ':',cat输出信息中:被删除。

    • col:有特殊用途。如cat -A打印信息时会显示特殊按钮(如tab以^I显示而不是空白),使用col -x可将tab取代为空白键,cat /etc/man_db.conf | col -x |cat -A |more

    • join:对比两个文件,在每行中,以某个字段为依据,相同则两个文件的改行被合成一行。如join -t ':' /etc/passwd /etc/shadow | head -n 3,对比/etc/passwd与/etc/shadow文件,以:为分割符(t参数设置,默认以空白字符为分割符),对比分割后的第一个字段,相同被合并到同一行,且对比的字段自会在最前面显示一次。若要指定两文件对比第几个字段(而不是默认的第一个),可用-1和-2参数来指示,如join -t ':' -1 4 /etc/passwd -2 3 /etc/group | head -n 3,将分割后,第一个文件的第4个字段与第二个文件的第3个字段比较。

      使用join前一般需要对要处理的文件进行排序。

    • paste:将两个文件按行粘在一起,并以tab分开(可使用-d参数修改),其中文件可以以-代替,表示stdin。如cat /etc/group | paste /etc/passwd /etc/shadow - | head -n 3

    • expand:将tab转成空白键,-t参数设置转为几个。如grep '^MANPATH' /etc/man_db.conf | head -n 3 | expand -t 6 - | cat -A。使用unexpand可将空白转为tab。

  • split:将一个大文件,按行或大小分区,形成小文件。b参数设置按文件大小分区,可加单位b/k/m等;l参数以行分区;PREFIX代表前置字符(//TODO)。如split -b 300k /etc/services services会得到servicesaa、servicesab、servicesac……小文件。ls -al / | split -l 10 - lsroot得到lsrootaa、lsrootab、lsrootac……小文件,将小文件合为一个文件可使用cat lsroot* >> lsrootback

  • xargs:产生某个指令的参数。如id指令接一个参数,它也不是管线命令,对于以下指令cut -d ':' -f 1 /etc/passwd | head -n 3 | id,id前不仅传了3个参数,而且id也无法使用管线。那么可以使用这个cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -p -n 1 id,-p参数表示每次执行前都会询问,-n参数表示每次递给id几个参数。cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -e'sync' -n 1 id表示遇到sync参数就结束,注意没有空格。

    xargs一般用于那些不支持管线的命令,来引用stdin。

  • 前一个指令的stdout作为这次的stdin,可以用-来代替。

    许多指令需要用到文件名称也可以用-来代替。如tar -cv -f - /home.tar | tar -xv -f - -C /tmp/homeback,该指令前一个打包到stdout,经过管线后递给后面的stdin。

第十一章 正则表达式与文件格式化处理

11.1.开始之前:什么是正则表达式

  • 开机相关的程序在/lib/systemd/system/下面。
  • 正则表达时和万用字符是完全不同的东西。cp,ls等指令并未支持正则表达式,使用的是bash本身的万用字符而已。

11.2.基础正则表达式

  • 使用正则表达式时要注意编码顺序,如

    LANG=C时:0 1 2 3 ... A B C D ... Z a b c d ... z

    LANG=zh_TW时:0 1 2 3 ... a A b B c C d D ... z Z

    此时,[A-Z]就有不同结果。

  • 特殊符号:

    特殊符号 代表意义
    [:alnum:] 英文大小写字符及数字,即0-9,A-Z,a-z
    [:alpha:] 英文大小写字符,即A-Z,a-z
    [:blank:] 空白键与tab
    [:cntrl:] 键盘上的控制按钮,即CR、LF、Tab、Del等等
    [:digit:] 数字,即0-9
    [:graph:] 除了空白字符(空白键与tab)外的其他所有按键
    [:lower:] 小写字符,即a-z
    [:print:] 可以被打印出来的字符
    [:punct:] 标点符号
    [:upper:] 大写字符,即A-Z
    [:space:] 会产生空白的字符,包括空白键、tab、CR等等
    [:xdigit:] 16进位的数字类型,包括0-9,A-F,a-f
  • []中无论有几个字符都表示其中一个而已。

  • ^$代表行以某些字符开头、结尾。

  • .代表该位置必定有一个字符,*代表前一个字符0个及以上。

  • {}用于指定数量。{}在shell中有特殊意义,使用时需要加\。

  • 示例:

    • "[^g]oo"表示匹配oo字符且前一个字符不能为g。
    • "[^[:lower:]]oo"表示匹配oo字符且前一个字符不能为小写字符。
    • "^[^a-z]"表示以非小写字母开头的行。
    • "\.$"表示以小数点结尾的行。
    • "g.*g"表示以g开头结尾的字符串。
    • "go\{2\}"表示goo。"go\{2,4\}"表示goo、gooo、goooo。"go\{2,\}"表示goo、gooo、goooo、gooooo……。
  • sed工具,格式为sed [-nefr] [动作],其中的动作一定要用单引号引起来。

    • n表示silent模式,一般sed用法中来自STDIN的数据一般都会被列出到屏幕上,添加n则只会列出sed特殊处理那一行。

      动作格式为[n1,[n2]]function,n1,n2代表行号,function可取a(新增)、c(取代)、d(删除)、i(插入)、p(打印)、s(取代)。

      如打印2-5行:nl /etc/passwd | sed -n '5,7p'

    • sed有搜寻并取代功能,格式为sed 's/要被取代的字串/新的字串/g'。如ifconfig中的ip:/sbin/ifconfig eth0 | grep 'inet' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'。又如获取包含MAN的行且不要注释:cat /etc/man_db.conf | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'。(//TODO)

    • sed的-i选项可直接修改文件内容。如把行尾.换成!:sed -i 's/\.$/\!/g' regular_express.txt。在最后一行添加内容This is a testsed -i '$a # This is a test' regular_express.txt

11.3.延伸正则表达式

  • grep默认仅支持基础正则表达式,要使用延展正则表达式可使用grep -E或者egrep。
  • 延展正则表达式有:|、+、?、()、()+。

11.4.文件的格式化与相关处理

  • printf指令格式:printf '打印格式' 实际内容。如printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt | grep -v Name)

  • awk指令格式:awk '条件类型1{动作1} 条件类型2{动作2} ...' filename。awk主要处理每行的字段内的数据。默认字段分割符为空白键或tab。

    $0代表一行数据,$1$2……代表第一个、第二个……字段。

    awk内置变量有:NF每行拥有的字段总数;NR目前处理的第几行数据;FS目前分割字符(默认空白键)。

    awk的格式内容想要以print打印时,对于非变量的文字部分要用双引号括起来。如last -n 5 | awk '{print $1 "\t" $3}'

    awk的条件逻辑运算有:>大于、<小于、>=大于等于、<=小于等于、==等于、!=不等于。如cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}',这里添加{FS=":"}设置分割符,不添加关键字BEGIN的话会在第二行才开始生效。

    看一下示例:pay.txt文件内容如下:

    Name 1st 2nd 3th
    VBird 23000 24000 25000
    DMTsai 21000 20000 23000
    Bird2 43000 42000 41000

    可调用以下指令添加每个人的总分进行打印:

    cat pay.txt | \
    awk 'NR==1{printf "%10s %10s %10s %10s %10s\n", $1, $2, $3, $4, "Total"}
    NR>=2{total = $2 + $3 + $4
    printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

    awk在{}中的动作有多个时,可用;或enter间隔。printf格式加上\n才能分行。awk中的变量可直接使用不加$符号,如上述指令中的total

  • diff通常是用在同一文件(或软件)的新旧版本差异上,以行为单位来进行比对的。如:

    cp /etc/passwd passwd.old
    cat /etc/passwd | sed -e '4d' -e '6c no six line' > passwd.new

    sed要连接多个动作时每个动作的加参数e。

    diff passwd.old passwd.new

    可以看到4d3表示左边第4行被删除对应右边第3行、6c5左边第6行被取代成右边第5行。

    diff也可比对目录。

  • cmp以字节为单位比对,默认只会输出第一个发现的不同点。

  • patch用于将旧文件转换新文件。

    使用diff制作补丁文件,通常扩展名为.patch://TODO -Naur参数的意义

    diff -Naur passwd.old passwd.new > passwd.patch

    -pN参数表示取消N层目录,因为新旧数据在同一目录下,所以使用的是-p0。如果使用整体目录比对(diff 新目录 旧目录)时,就得依据创建patch文件所在目录来进行目录的删减。//TODO

    使用-R表示还原:

    patch -p0 < passwd.patch
    patch -R -p0 < passwd.patch
  • pr:文件打印准备。

第十二章 学习Shell Scripts

12.1.什么是Shell Scripts

  • shell scripts像是早期DOS年代的批处理文件(.bat)。

  • CentOS6.x以前的版本中,系统的服务启动接口是在/etc/init.d/这个目录下,目录下所有文件都是scripts。/etc/init.d/*这个脚本启动的方式已经被新一代的systemd所取代(从CentOS7开始)。

  • shell scripts用在系统管理上面是很好的一项工具,但是用在处理大量的数值运算上,就不够好了,因为shell scripts的速度较慢,且使用的CPU资源较多,造成主机资源的分配不良。

  • 脚本文件得有rx权限。

  • /bin/sh其实就是/bin/bash(链接文件)。

  • shell scripts中,第一行#!/bin/bash宣告这个文件按内语法使用bash的语法。那么当这个程序被执行时,他就能够载入bash相关的环境配置文件(一般来说是non-login shell的~/.bashrc)。其他的#都是注释的用途。一般来说要注释添加:内容与功能、版本信息、作者与联络方式、创建日期、历史记录等。

12.2.简单的shell scripts练习

  • declare -i total=${firstnum}*${secnu}可以使用total=$( (${firstnum}*${secnu}) )代替。

  • bc指令:

    echo "123.123*55.9" | bc
    num=3
    time echo "scale=${num}; 4*a(1)" | bc -lq
  • 原本运行scripts是启用一个新的bash,而通过source或者.运行则会在本bash生效。

12.3.善用判断式

  • test参数:

    test参数
    测试的标志 代表意义
    对于某个文件名的文件类型判断
    -e、-f、-d 该文件名是否存在、该文件名是否存在且为文件、该文件名是否存在且为目录
    -b、-c 该文件名是否存在且为block device设备、该文件名是否存在且为character device设备
    -S、-p、-L 该文件名是否存在且为Socket文件、该文件名是否存在且为FIFO(pipe)文件、该文件名是否存在且为链接文件
    关于文件权限侦测,但root权限常有例外
    -r、-w、-x 该文件名是否存在且有可读、可写、可执行权限
    -u、-g、-k 该文件名是否存在且有SUID、SGID、SBIT属性
    -s 该文件名是否存在且为非空白文件
    两个文件中的比较
    -nt、-ot newer than、older than
    -ef 判断file1与file2是否同一个inode
    关于两个整数之间的判定
    -eq、-ne equal、not equal
    -gt、-lt greater than、less than
    -ge、-le greater than or equal、less than or equal
    判定字符串
    test -z、-n string 判断字符串是否为0、非0
    test str1==、!=str2 判断字符串是否相等、不等
    多重条件判定
    -a、-o、! and、or、not
  • test可以被[]代替,注意括号两边要用空白字符分隔,避免与正则表达式模糊。括号内的变量最好用双引号引起来,常量最好用单/双引号引起来。比如下面这个例子:

    name="VBird Tsai"
    [ ${name} == "VBird" ]

    比较的是[ VBird Tsai == "VBird" ],所以要用引号引起来:[ "${name}" == "VBird" ]

  • shell scripts中$#代表参数个数、$@代表各个参数变量相当于"$1""$2""$3"...$*代表所有参数相当于"$1 $2 $3..."(这里默认的分割为空白键)。$0为指令名,$n为第n个参数。shift n可以删除掉前面n个参数。

12.4.条件判断式

  • if [ 条件判断式一 ]; then
    指令
    elif [ 条件判断式二 ]; then
    指令
    else
    指令
    fi

    多个条件可以写在一个中括号里,也可以写在多个中括号,中间用&&(and)或||(or)隔开

  • netstat -tuln可获取当前主机有启动的服务。其中本地IP为127.0.0.1的只对本机开放,0.0.0.0或:::的代表对整个Internet开放。

  • case $变量名称 in
    "第一个变量内容"
    程序段
    ;;
    "第二个变量内容"
    程序段
    ;;
    *)
    程序段
    ;;
    esac
  • function fname() {
    程序段
    }

    shell scripts的function要设置在调用之前。

  • echo -n参数可以不断行继续在同一行显示。

12.5.循环(Loop)

  • while [ condition ]
    do
    程序段
    done
  • until [ condition ]
    do
    程序段
    done

    当condition满足时终止。

  • for var in con1 con2 con3 ...
    do
    程序段
    done
  • seq可取连续数字如:seq 1 100,取整数1-100。也可使用bash内置机制{1..100}取代。

  • for ((初始值;限制值;执行步阶))
    do
    程序段
    done

12.6.shell scripts的追踪与的debug

  • sh [-nvx] scripts.sh的参数
    • n:不执行scripts,只检查语法。
    • v:执行scripts前,将scripts内容输出到屏幕上。
    • x:将使用到的scripts内容显示到屏幕上。

第十三章 Linux账号管理与ACL权限设置

13.1.Linux的账号与群组

  • 登录时的处理:根据输入的账号名,去/etc/passwd找寻对应的UID,并读取GID,在/etc/group中根据GID找寻组名。在/etc/shadow中根据UID核对密码。最后进入shell控管阶段。

  • /etc/passwd的文件结构:

    每行代表一个账号。

    账号名称 : 密码 : UID : GID : 使用者信息说明栏 : 主文件夹 : Shell

    • 密码中:早期密码放在/etc/passwd的密码字段,现在放在/etc/shadow中,这里只会是个"x"。

    • UID中:0表示系统管理员,但不建议有多个账号的UID为0。1-999是给系统账号使用(1-200由distributions自行创建的账号,201-999是若有使用者有系统账号需求时可以使用的),通常这些账号是不可登陆的。1000-60000给一般使用者用的。

    • GID为初始群组的ID。

    • 使用者信息说明栏中,没有什么重要用途,只是来解释这个账号的意义而已。//TODO finger

    • Shell中,指明账号使用的默认shell。

  • /etc/shadow的文件结构:

    账号名称 : 密码 : 最近更改密码的日期 : 密码不可变动天数 : 密码需要重新变更的天数 : 密码需要变更期限前的警告天数 : 密码过期后的宽限时间 : 账号失效日期 : 保留

  • 了解shadow是用哪种加密机制的:authconfig --test | grep hashing

  • /etc/group的文件结构:

    群组名称 : 群组密码 : GID : 此群组支持的账号名称

    • 群组密码通常不需要设置,这个设置通常是给群组管理员使用的,同样被移动到/etc/gshadow去了,这个字段只会是"x"。
    • 此群组支持的账号名称中,某个账号想假如该群组时,将账号填入这个字段就行。多个用逗号,之间不要有空格,如dmtsai,alex。在新版Linux中,初始群组的用户群不会加入该字段。
  • 检查自身账号假如的群组groups,第一个输出为有效群组,即当前登录的群组。使用newgrp groupname可转换当前有效群组,前提是在对应群组中,该指令是以另一个shell来提供功能的(但使用者的环境设置不会有影响),切换后记得exit

  • usermod、passwd

  • /etc/gshadow的文件结构:

    群组名称 : 密码栏 : 群组管理员账号 : 有加入该群组支持的所属账号

    • 密码栏中,为"!"开头或空表示无合法密码,所以无群组管理员。
    • 有加入该群组支持的所属账号中,与/etc/group那栏的内容相同。

    gshadow最大的功能就是创建群组管理员。

13.2.账号管理

  • useradd新增账号。使用useradd 账号名来创建账号,可添加这些参数:u指定UID、g指定初始群组的GID、G指定该账号还加入的群组、M/m不要/要创建主文件夹(系统账号/一般账号有该参数)、c说明即/etc/passwd中的第5栏、d指定某个目录成为主文件夹、r创建一个系统账号、s指定shell、e指定失效日。如useradd zhangsan,会在/etc/passwd、/etc/shadow、/etc/group、/home下添加对应内容。此后还需要使用passwd创建密码。

    useradd在创建账号时,会参考以下文件:

    • /etc/default/useradd:使用指令useradd -D可查看,其中字段的解释为:
      • GROUP=100:表示新建账号的初始群组使用GID为100的,为users群组。但这个不会生效,这是用于公共群组机制。而我们创建的使用的是私有群组机制,他会创建一个与用户名相同的群组,并作为初始群组,主文件夹的权限为700。
      • HOME=/home:默认主文件夹所在目录。
      • INACTIVE=-1:密码失效日。
      • EXPIRE=:账号失效日。
      • SHELL=/bin/bash:默认shell。
      • SKEL=/etc/skel:使用者主文件夹的内容数据参考目录。主文件夹中的内容都是由/etc/skel所复制过去的。
      • CREATE_MAIL_SPOOL=yes:是否主动帮使用者创建邮件信箱。
    • /etc/login.defs
      • MAIL_DIR:使用者默认邮箱放置目录。
      • shadow密码第4、5、6字段,其中的PASS_MIN_LEN已经失效,被pam模块取代。
      • UID/GID指定数值:注意的是,系统给予一个账号UID时,先参考UID_MIN,再在/etc/passwd中寻找最大UID,该值加1为新账号的UID。
      • CREATE_HOME yes:指明不添加M/m参数时是否创建使用者主文件夹。
      • UMASK 077:主文件夹的umask。
      • USERGROUPS_ENAB yes:如果使用userdel删除账号时,该账号所属初始群组没帐号了,该初始群组也会被删除。
      • ENCRYPT_METHOD SHA512:密码加密机制。
    • /etc/skel/*

    passwd指令设置密码,使用passwd修改当前账号的密码(root不需要输入原密码)。使用passwd 账号名修改对应账号的密码。一般身份(与root不同的)使用passwd修改密码时,大多数distributions会使用pam模块进行密码校验,这个管理机制被写在/etc/pam.d/passwd中,该文件与密码有关的测试模块就是使用的pam_cracklib.so,这个模块会检验密码相关信息并取代/etc/login.defs内的PASS_MIN_LEN设置。

    可以使用echo "abc123321" | passwd --stdin zhangsan来修改密码(并不是所有distributions都支持),不过要注意该指令被添加到了history。passwd 参数 账号名称可添加相关参数:S列出密码相关参数,即shadow文件中的大部分内容;l/u锁定/解除锁定账号,即通过在shadow密码栏中添加/删除!!前缀来让密码生效/失效;n/x/w修改shadow第4/5/6字段,接天数;i修改shadow第7字段,接日期。

    chage -l 账号名相当于passwd -S 账号名,也可添加相关参数修改密码相关信息。chage可以设置使用者在第一次登录时强制他一定要修改密码后才能继续使用:

    useradd lisi
    echo "abc123123" | passwd --stdin lisi
    chage -d 0 lisi

    这里设置了lisi账号的创始时间为1970/1/1,所以有问题,登录lisi账号时会要求修改密码。

  • usermod可修改相关信息。

  • userdel删除账号。注意如果账号只是暂时不用,修改/etc/shadow的第8字段(账号失效日期)为0即可,不用删除账号。确定要删除账号时,最好先用find指令查出整个系统属于该用户的文件。

  • useradd、usermod、userdel都是系统管理员使用的命令。

  • id指令查询自己相关的UID/GID等信息。

  • finger查询自己相关的信息,大部分在/etc/passwd中的内容,由于这个指令有点危险,所以新版本中已默认不安装这个软件了。

  • chfn与chsh都能修改/etc/passwd文件,这两个文件权限都是SUID。

  • 创建群组:groupadd [-g gid] [-r] 群组名称,g参数指定GID,r参数表明创建系统群组。

  • 修改群组:groupmod [-g gid] [-n group_name] 群组名称,g参数指定新GID,n参数指定新群组名。

  • 删除群组:groupdel 群组名称。当有账号以该群组为初始群组时,该群组无法删除。

  • 群组管理员功能,流程:

    • root为群组设置密码:gpasswd testgroup
    • root添加群组管理员:gpasswd -A zhangsan testgroup
    • zhangsan即可为testgroup群组添加用户:gpasswd -a zhangsan testgroupgpasswd -a lisi testgroup

13.3.主机的细部权限规划:ACL的使用

  • ACL(Access Control List)可以针对单一使用者、单一文件/目录来进行rwx的权限规范。

  • 目前ACL几乎已默认加入在所有常见的Linux文件系统了。使用dmesg | grep -i acl可检查看看。

  • setfacl指令格式:setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名。m/x不可混用,表示设置/删除后续acl参数;b表示移除所有的acl参数;k表示移除默认的acl参数;R表示递回设置acl,即包括次目录都会被设置;d表示设置默认acl,只对目录有效,在该目录新建的数据会引用次默认值。

    有效权限mask表明,使用者或群组所设置的权限必须要存在与mask的权限设置范围内才有效。

    • 对于某用户设置:如setfacl -m u:yangyi:rx acl_test1setfacl -m u:lisi:- acl_test1
    • 对于某用户组设置:如setfacl -m g:mygroup1:rx acl_test1
    • 设置有效权限:如setfacl -m m:rx acl_test1
  • getfacl指令格式:getfacl 目标文件名

  • setfacl对目录设置时,加上d,可让使用者在该目录下新增文件/目录时,继承acl。如:setfacl -m d:u:yangyi:rx acl_test_dir

  • 取消acl的示例:

    setfacl -x u:yangyi acl_test1
    setfacl -x d:u:yangyi acl_test_dir

13.4.使用者身份切换

  • su指令切换root,使用的non-login shell ,环境不会切换(PATH/USER/MAIL等变量)。su -/su -l username采用login shell登录到root/username用户上。

  • 只是用对应用户下命令可用c参数:su - -c "指令串"

  • sudo可以让你以其它用户(通常是root)执行指令,登录使用的自己的密码,但只有在/etc/sudoers内的用户才能使用sudo。

  • sudo指令格式:sudo [-b] [-u 新使用者账号],b参数将后续指令执行放到背景中,而不与当前shell产生影响;u参数指定欲转换的对象,无此参数代表转换root。如以sshd身材创建一个文件sudo -u sshd touch /tmp/mysshd。再如以zhangsan身份创建文件:

    sudo -u zhangsan sh -c "mkdir ~zhangsan/www; cd ~zhangsan/www; \
    echo 'This is index.html file' > index.html"
  • /etc/sudoers文件有一定规范,使用visudo指令(visudo)而不推荐vi来编辑该文件。其实visudo只是利用vi将/etc/sudoers文件调用出来更改而已。

  • /etc/sudoers文件行对应内容:

    • 单一用户:

      使用者账号 登陆者的来源主机名称=(可切换的身份) 可下达的指令

      root ALL=(ALL) ALL。ALL是个特殊的关键字代表所有主机/身份/指令。

    • 使用wheel用户组:

      sudoers文件中有这么一条:%wheel ALL=(ALL) ALL。表示wheel群组内可执行sudo,只要用户加入wheel群组,也可使用sudo命令。当然也可自己添加新的群组可使用sudo命令。

    使用sudo是可不用输入自己密码,通过在对应行的最后列添加 NOPASSWD: 即可,如%wheel ALL=(ALL) NOPASSWD: ALL

    可下达指令可增加不可执行的,如myuser ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [[:alpha:]]*, !/usr/bin/passwd root,myuser用户就不能使用sudo切换root下修改root的密码。可下达的指令必须使用绝对路径。

    sudoers中可使用别名,别名一定要大写:

    User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
    Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [[:alpha:]]*, !/usr/bin/passwd root
    ADMPW ALL=(root) ADMPWCOM

    sudo在5分种内再次输入不需要再次输入密码。

    在sudoers下添加以下内容的话,使用sudo su -,就可以不用root密码而登录到root身份上:

    User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
    ADMPW ALL=(root) /bin/su -

13.5.使用者的特殊shell与PAM模块

  • PAM借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求,在/etc/pam.d/*里面。

  • 配置文件结构:第一行宣告PAM版本,如#%PAM-1.0,其它#开头的都是注释。之后每行由三个字段组成:验证类别、控制标准、PAM模块与该模块参数。

    • 验证类别:PAM有4个阶段:auth(认证,检验使用者身份)、account(授权,检验使用者是否具有权限)、session(记录使用者登录/登出时信息)、password(运行阶段时验证的修订工作)。
    • 控制标准:required、requisite、sufficient、optional,还有include和substrack。有时是[]
  • PAM要用到的文件:

    • /etc/pam.d/*:每个程序个别的PAM配置文件。
    • /lib64/security/*:PAM模块文件实际放置目录。
    • /etc/security/*:其它PAM环境的配置文件。
    • /usr/share/doc/pam-*/:详细的PAM说明文件。
  • 常见模块:

    • pam_securetty.so:限制root只能从安全终端机登录。安全终端机的设置在/etc/securetty中。
    • pam_nologin.so:限制一般使用者是否能够登录主机。当/etc/nologin存在时,所有一般使用者无法再登录了(对root和已经登录的一般账号无影响)。
    • pam_selinux.so、pam_console.so、pam_loginuid.so、pam_unix.so
    • pam_env.so:用于设置环境变量。有额外的环境变量需要设置,可参考/etc/security/pam_env.conf的说明。
    • pam_pwquality.so:检验密码强度。最早之前其实是使用pam_cracklib.so这个模块,后来改为pam_pwquality.so并兼容pam_cracklib.so,同时提供/etc/security/pwquality.conf这个文件可额外指定默认值。
    • pam_limits.so:ulimit指令其实就是使用这个模块提供的能力,更多细部设置参考/etc/security/limits.conf。
  • /etc/security/limits.conf文件设置完就生效了。但PAM是在程序调用后才予以设置,因此修改完成的数据,对于已登录的使用者没有效果,得再次登录才生效。

  • 如果发生无法登录或者产生一些无法预期得错误时,PAM会将数据记载在/var/log/security中。

13.6.Linux主机上得使用者讯息传递

  • 了解目前已登录到系统上的使用者,使用wwho
  • 了解每个账号最近登录的时间,使用lastlog
  • write 使用者账号 [使用者所在终端接口]可向目标使用者发送信息,会立即显示到目标使用者的终端上。目标使用者可使用mesg n拒收任何人(除root)发送给自己的信息。wall "信息"可以向所有使用者发信息。
  • mailbox一般放在/var/spool/mail里,使用mail -s "邮件标题" username@localhost可发邮件,发送给本机上的用户可省略@localhost。收件者使用mail查询邮件,&后可使用输入?查看可进行的操作,通常有:h列出邮件标头,如列出40封h 40;d删除,如d10d20-40;s存储成文件,如s 5 ~/mail.file;x或者exit不执行刚才的动作(如删除)而退出;q执行刚才的动作而退出。

13.7.CentOS7环境下大量创建账号得方法

  • pwck指令检查/etc/passwd中得信息,主文件夹是否存在、对比/etc/passwd与/etc/shadow信息是否一致。
  • pwconv指令将etc/passwd中密码移动到/etc/shadow,将原本得密码设为"x"。若/etc/shadow中没有相关得密码数据,则会去/etc/login.defs取用相关得密码数据创建。
  • pwunconv指令将/etc/shadow中密码写回etc/passwd,并将/etc/shadow删除。
  • chpasswd指令读入未加密前的密码,经过加密后写入/etc/shadow中,如更改zhangsna的密码echo "zhangsan:abcabc" | chpasswd。chpasswd会读/etc/login.defs中的加密机制,若不适用该加密机制可加参数c/e处理。

第十四章 磁盘配额(Quota)与进阶文件系统管理

14.1磁盘配额(Quota)的应用与实作

  • ext文件系统家族的quota限额主要针对于整个文件系统,所以大多对挂载点进行设计;xfs可以使用project模式,针对于个别目录来设计。

  • xfs的quota时整合到文件系统内的。du可以重新计算磁盘使用率,但xfs可以通过xfs_quota直接回报各目录使用率,更快。

  • 不能对root设置quota。

  • 新版CentOS默认有启用SELinux,会加强某些细部的权限控制。因此在默认情况下,quota仅能针对/home进行设置。

  • quota可分别针对使用者、群组和个别目录(user、group、project)进行设置,但群组和个别目录不能同时设置。quota可对inode(文件数量)和block(磁盘使用量)进行设置。

  • quota的设置分hard和soft。达到hard时,就不能继续使用磁盘。达到soft时会警告并给予宽限时间,在宽限时间内将使用容量降于soft以下会消除限制,否则超过宽限时间时会将hard设置为当前soft。一般默认的宽限时间为7天。

  • 设置示例:设置/home(单独挂载一个xfs系统)下user与group

    • 设置/home的挂载参数:修改/etc/fstab文件内/home那行/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota 0 0。然后重新挂载umount /homemount -amount | grep 'home'。(注意重新挂载时,将所有一般用户登出。)

    • xfs_quota -x -c "print":列出目前系统的各文件系统,及quota参数。

      xfs_quota -x -c "df -h" /home:相当于df -h /home,只不过更精确。

      xfs_quota -x -c "report -ubid" /home:列出/home下所有用户的quota限制。

      xfs_quota -x -c "state":查看是否启用了quota。

    • 容量设置格式xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name":u/g针对于user/group,b/i针对于block/inode,name表明username/groupname。如:xfs_quota -x -c "limit -u bsoft=250M bhard=300M zhangsan" /home

    • 宽限时间设置格式xfs_quota -x -c "timer [-ug] [-bir] Ndays"。如xfs_quota -x -c "timer -ug -b 14days" /home

  • 设置示例:设置/home(单独挂载一个xfs系统)下user与project

    • 修改/etc/fstab:/dev/mapper/centos-home /home xfs defaults,usrquota,prjquota 0 0并重新挂载。
    • 目录quota必须要设置专案名称与专案识别码(只行取),并把专案识别码与目录添加到/etc/projects里,把专案名称与专案识别码添加到/etc/projid里。如echo "11:/home/zhangsan" >> /etc/projectsecho "myquotaproject:11" >> /etc/projid
    • 初始化专案名称:xfs_quota -x -c "project -s myquotaproject"。使用xfs_quota -x -c "print" /home查看对应的讯息。十一号xfs_quota -x -c "report -pbih" /home:列出/home下所有project的quota限制。
    • 容量设置示例:xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
  • disable暂时取消quota限制,可用enable恢复。off关闭quota限制,需要重新挂载才能生效(enable不可以)。remove必须在off后才能执行,移除掉quota的设置。如xfs_quota -x -c "disable -up" /homexfs_quota -x -c "enable -up" /homexfs_quota -x -c "off -up" /homexfs_quota -x -c "remove -p" /home

  • 对于跨文件系统设置quota的project功能,可用链接在本文件系统中生成链接文件链接另一文件系统中的需要设置quota的文件,然后对链接文件设置quota即可。

14.2.软件磁盘阵列(Software RAID)

  • RAID 将各小磁盘组成大磁盘。

  • RAID各的等级

    • RAID 0(等量模式,stripe):各磁盘分成等量的区块,名为chunk。文件写入时按照chunk大小分割好,然后依次分布到各个小磁盘上。最小的磁盘放满了,该磁盘就不放了,只依序放到更大的磁盘上。

      此模式下,任何一块小磁盘损坏后都无法恢复。

    • RAID 1(映射模式,mirror):需要两个同样大小的小磁盘,否则以最小磁盘容量为主。这种模式会让文件分别保存在两块小磁盘上,小磁盘保存的内容相同都为整个原文件。因此感觉整体RAID容量少了50%。

      此模式下,有限在于数据的备份,一块小磁盘损坏后,另一块小磁盘还有一样的数据可恢复。

    • RAID 1+0(或 RAID 0+1):即先让两块小磁盘RAID 1,所有RAID1在使用RAID 0模式(或先RAID 0,再RAID 1)。RAID 1+0 是目前存储厂商推荐的模式。

    • RAID 5:至少需要3块小磁盘。写入有点类似RAID 0,但循环写入时,每颗磁盘还会加入一个同位检查数据(parity),这个数据会记录其它磁盘的备份数据。每个循环写入时,都会有部分的parity被记录下来,并且记录的parity每次都记录在不同磁盘。只有一块小磁盘顺坏后,可根据其它磁盘的检查码来重建原本磁盘内的数据。

      此模式下,RAID的容量像是少了一块小磁盘。而RAID 6类似RAID 5但使用了两颗小磁盘容量用于存储parity,因此可容许两块磁盘损坏。

  • 预备磁盘(spark disk)用于,当RAID内某块小磁盘损坏时,以预备磁盘代替该磁盘,进行RAID复原。

  • 使用Software RAID示例:

    CentOS提供软件磁盘整列为mdadm这套软件,这套软件会以partition或disk为磁盘的单位。软件磁盘阵列由于是系统仿真的,因此使用的设备文件名是系统的设备文件,文件名为/dev/md0、/dev/md1……。

    下面创建一个RAID 5等级的软件磁盘整列,4个partition组成RAID 5,每个partition约1GB,还要有一个partition(1GB)设置为spark disk,chunk设置为256k,将RAID 5设备(/dev/md0)挂载到/srv/raid目录下:

    • 准备5个1GB大小的分区sda5、sda6、sda7、sda8、sda9。
    • 使用mdadm创建RAID:mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256k --raid-devices=4 --spare-devices=1 /dev/sda{5,6,7,8,9}
    • 使用mdadm --detail /dev/md0可查看该RAID的相关信息。可以看到那个是spare disk。
    • 使用cat /proc/mdstat可查看RAID的相关信息。可以看到那个是spare disk。
    • 使用mkfs.xfs格式化RAID:mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0
    • 挂载:mkdir /srv/raid; mount /dev/md0 /srv/raid; df -Th /srv/raid

    接下来仿真RAID错误的救援模式:

    • 先复制一些东西到该RAID中:cp -a /etc /var/log /srv/raid,查看使用情况:df -Th /srv/raid; du -sm /srv/raid/*
    • 仿真/dev/sda7这个分区出错了:mdadm --manage /dev/md0 --fail /dev/sda7。此时系统会启用spare disk那块并修复。
    • 接下来就可从RAID中移除这块磁盘,关闭Linux,拔出/dev/sda7这块顺坏的,装上新的/dev/sda7磁盘,将其放到/dev/md0中:mdadm --mange /dev/md0 --remove /dev/sda7,拔出顺坏磁盘装上新的,mdadm --mange /dev/md0 --add /dev/sda7
  • 新的distribution大多会自己搜寻/dev/md[0-9]然后在开机的时候给予设置好所需要的功能,不过还是建议修改以下配置文件。Software RAID的配置文件在/etc/mdadm.conf中。

    • 获取/dev/md0的UUID:mdadm --detail /dev/md0 | grep -i uuid
    • 设置/etc/mdadm.conf,在该文件中添加内容:ARRAY /dev/md0 UUID=...
    • 设置开机自动挂载,在/etc/fstab中添加内容:UUID=... /srv/raid xfs defaults 0 0
    • 重新挂载检验一下:umount /dev/md0; mount -adf -Th /srv/raid
  • 关闭软件RAID,需要卸载/dev/md0,同时关闭RAID:

    • 先卸载/dev/md0:umount /srv/raid,并删除/etc/fstab中相关信息。

    • 先覆盖掉RAID的metadata以及xfs的superblock,才关闭/dev/md0:

      dd if=/dev/zero of=/dev/md0 bs=1M count=50
      mdadm --stop /dev/md0
      dd if=/dev/zero of=/dev/sda5 bs=1M count=10
      dd if=/dev/zero of=/dev/sda6 bs=1M count=10
      dd if=/dev/zero of=/dev/sda7 bs=1M count=10
      dd if=/dev/zero of=/dev/sda8 bs=1M count=10
      dd if=/dev/zero of=/dev/sda9 bs=1M count=10
    • 检查RAID的相关信息cat /proc/mdstat,并删除/etc/mdadm.conf中相关的配置。

    上述中dd指令是用于分区重新规划,因为RAID的相关数据其实也会存一份在磁盘中,如果只是将配置文件删除并关闭了RAID,但是分区没有重新规划,重新开机后还是会将RAID创建起来,只是可能会换个名字如/dev/md127。

14.3.逻辑卷轴管理员(Logical Volume Manager)

  • LVM默认使用4MB的PE块。

  • LV设备文件名通常指定为/dev/vgname/lvname的格式。

  • 通过交换PE,将原本LV中的PE转移到其它设备中以降低LV容量,将其他设备中的PE加到此LV中以加大容量。

  • 数据写入LV时有两种方式:假如将/dev/sda1与/dev/sda2这两个partition加入VG中

    • 线性模式(Linear):线性模式会在/dev/sda1容量用完后,/dev/sda2的硬盘才会使用。
    • 交错模式(triped):交错模式会把一笔数据分成两份,分别写入/dev/sda1与/dev/sda2。

    LVM的主要用处时实现一个可以弹性调整容量大小的文件系统上,所以使用线性模式更好。交错模式类似RAID 0,如果要强调性能与备份,那么就可以直接使用RAID而不是LVM。

  • 创建LVM示例:

    • Disk阶段(实际的磁盘):准备4个1GB大小的分区sda5、sda6、sda7、sda8。使用gdisk时注意要将其设置为8e。

    • PV阶段:使用的指令有pvcreate、pvscan、pvdisplay、pvremove。PV的名称就是设备名

      使用pvscan先查看下系统上的PV,CentOS安装时我们创建了一个LVM,它的pv是/dev/sda3,vg是centos。

      使用pvcreate /dev/sda{5,6,7,8} 将其创建为PV。

      使用pvscan /dev/sda5可查看具体的pv信息。

    • VG阶段:使用的指令有vgcreate、vgscan、vgdisplay、vgextend、vgreduce、vgchange、vgremove。VG的名称是自定的。

      使用vgcreate -s 16M testvg /dev/sda{5,6,7}创建了testvg这个VG,s参数指定了PE的大小。

      使用vgscan查看系统上的VG。使用vgdisplay testvg查看具体的vg情况。

      使用vgextend testvg /dev/sda8添加/dev/sda8这个pv到testvg这个vg上。

    • LV阶段:使用的指令有lvcreate、lvscan、lvdisplay、lvextend、lvreduce、lvremove、lvresize。

      使用lvcreate -L 2G -n testlv testvg创建lv,l指定了lv的大小,n指定了lv的名字。

      使用lvscan查看系统上的lv。使用lvdisplay /dev/testvg/testlv查看具体的lv情况,注意这里lv必须使用带绝对路径的全名。

    • 文件系统阶段:格式化、挂载

      mkfs.xfs /dev/testvg/testlv
      mkdir /srv/lvm
      mount /dev/testvg/testlv /srv/lvm
      df -Th /srv/lvm
      cp -a /etc /var/log /srv/lvm
      df -Th /srv/lvm
  • 放大LV容量,xfs和ext家族都可以,但xfs不能缩小。放大是通过在文件系统中增加block group实现的,格式化的位置在于该设备后来新增的部分,设备前面已存在的文件系统没有变化。而新增的格式化过的数据,在反馈回原本的superblock而已。

    放大LV容量示例:

    • 使用vgdisplay testvg查看还有多少容量。
    • 使用lvresize -L +500M /dev/testvg/testlv添加500M。
    • 使用xfs_info /srv/lvm查看该文件的信息。
    • 使用xfs_growfs /srv/lvm增加文件挂载的大小。
  • 制作LVM thin Volume示例:

    • 使用lvcreate -L 1G -T testvg/testtpool创建一个thin pool。
    • 使用lvdisplay /dev/testvg/testtpool查看这个thin pool 的信息。
    • 也可使用lvs testvg更简洁的查看。
    • 使用lvcreate -V 10G -T testvg/testtpool testthin1创建对应lv。
    • 格式化与挂载:mkfs.xfs /dev/testvg/testthin1; mkdir /srv/thin; mount /dev/testvg/testthin1 /srv/thin

    注意,所有使用testtpool的lv(这里只有testthin1)的使用量之和不要超过testtpool的容量。

  • 快照区与被快照的LV必须要在同一个vg上。这里不推荐使用thin pool快照。

    创建快照示例:为/etc/testvg/testlv创建快照

    • 查看vg还剩下多少容量vgdisplay testvg
    • 创建快照lvcreate -s -l 26 -n testsnap1 /dev/testvg/testlv,参数s表明创建快照,参数l指定快照所用PE数量。
    • 挂载mkdir /srv/snapshot1; mount -o nouuid /dev/testvg/testsnap1 /srv/snapshot1

    xfs不允许相同的UUID文件系统挂载,需要加上nouuid参数。

  • 利用快照区复原系统:

    xfsdump -l 0 -L lvm1 -M lvm1 -f /home/lvm.dump /srv/snapshot1

    使用备份文件(这里生成/home/lvm.dump),而不是直接格式话testlv然后将testsnap1复制给他,因为这样格式化时会将testlv中所有数据搬移到snapshot1中,快照区容量通常不够大。

    umount /srv/snapshot1
    lvremove /dev/testvg/testsnap1
    umount /srv/lvm
    mkfs.xfs -f /dev/testvg/testlv
    mount /dev/testvg/testlv /srv/lvm
    xfsrestore -f /home/lvm.dump -L lvm1 /srv/lvm
  • 利用快照区可以对比/srv/lvm与snapshot1的内容。

  • 移除LVM

    umount /srv/lvm /srv/thin /srv/snapshot1
    lvs testvg
    lvremove /dev/testvg/testthin1 /dev/testvg/testtpool
    lvremove /dev/testvg/testlv
    vgvhange -a -n testvg # 这里将testvg修改为不具有active标志
    vgremove testvg

第十五章 例行性工作调度(crontab)

15.1.什么是例行性工作调度

  • at是可以处理仅执行一次就结束调度的指令,不过要执行at时,必须要有atd这个服务的支持才行。新版distributions可能atd默认并没有启动。
  • crontab这个指令所设置的工作会循环的一直进行下去。crontab除了可以使用指令执行外,亦可编辑/etc/crontab来支持。至于让crontab可以生效的服务则是crond这个服务器。
  • locate使用的文件名数据库放在/var/lib/mlocate中。

15.2.仅执行一次的工作调度

  • atd服务相关指令:

    systemctl restart atd
    systemctl enable atd
    systemctl status atd
  • at指令产生所运行的工作,会以文本方式保存在/var/spool/at内。

  • 使用/etc/at.allow/etc/at.deny进行at的使用限制。如果有/etc/at.allow,只有写在这个文件中的用户才能使用at;如果没有/etc/at.allow,有/etc/at.deny,没有写在这个文件中的用户才能使用at;两个文件都没有,只有root才能使用at。

  • at指令示例:

    at 23:00 2015-08-04
    at> /bin/sync
    at> /bin/sync
    at> /sbin/shutdown -h now
    at> <EOF> # 按CTRL+d
    at -c 1
  • 使用at时会进入一个at shell的环境。任务执行时的目录是at指令的目录。stdout和stderr会被传送到执行者的mailbox中,不过如果指令没有信息输入,是不会发送mail的,如果需要可使用m参数。

  • batch是利用at来进行指令的下达的,只是加入了一些控制参数。它会在CPU的工作负载小于0.8时才进行所下达的任务。CentOS7下batch已不支持时间参数了,batch指令示例:

    batch
    at> /usr/bin/updatedb
    at> <EOF>
  • uptime可观察1、5、15分支内平均工作负载量。

  • batch使用atq/atrm来管理的。

  • at与crontab的按每分钟检测工作是否应该执行。

15.3.循环执行的例行性工作调度

  • crond服务默认是启动的。

  • crontab能否使用与at类似,可在/etc/cron.allow/etc/cron.deny中配置。

  • crontab产生的任务保存在/var/spool/cron中,以账号作为判别。

  • cron执行的每一项工作会被保存在/var/log/cron这个登陆文件中,确定Linux是否被植入木马可查看这个文件看看。

  • root用户使用crontab -u username为指定用户编辑cron内容,使用crontab -l看查看cron内容,使用crontab -e编辑cron内容,使用cron -r删除所有cron内容。

  • crontab设置示例:

    */5 * * * * /home/meyok/test.sh

    指令下达最好使用绝对路径。周和月日不要同时设置。

  • 通过crontab -e的指令其实是使用/usr/bincrontab这个可执行文件。

  • 系统的例行性任务在/etc/crontab中设置。由于crontab是读到内存中的,修改完该文件可能不会马上执行,使用systemctl restart crond来重新启动crontab服务。

  • /etc/crontab中的内容:

    MAILTO=root:表明/etc/crontab中例行性工作的指令发送错误时,或者工作有stdout、stderr应该发送的mail给谁。

    其中多了一个执行指令的身份为谁。

  • 一般来说,crond默认有三个地方会有可执行脚本配置文件:/etc/crontab/etc/cron.d/*/var/spool/cron/*

  • /etc/cron.d/*下内容可放置自己开发新软件的crontab定时任务。

  • /etc/cron.d/0hourly中的内容有01 * * * * root run-parts /etc/cron.hourly。run-parts脚本会在大约5分钟内随机选择一个时间来执行/etc/cron.hourly目录内的所有可执行文件。

15.4.可唤醒停机期间的工作任务

  • anacron用于处理非24小时一直启动的Linux系统的执行,以及因为某些原因导致的超过时间而没有被执行的调度任务。

  • anacron也是每个小时被cron执行一次,然后anacron再去检测相关的调度任务有没有被执行,如果有超过期限的工作在,就执行该调度任务,执行完毕或无需执行任何调度时,anacron就停止了。

  • anacron是一个程序而非服务,配置文件在/etc/cron.hourly/0anacron。其中调用了/usr/sbin/anacron -s

  • anacron的配置文件/etc/anacrontab中内容:

    START_HOURS_RANGE=3-22
    1 5 cron.daily nice run-parts /etc/cron.daily

    /var/spool/anacron/*下记录了上次anacron执行的时间戳。上述表明,超过1天执行后面的指令,指令会被推测5min+3hours后执行。第三个字段是工作名称定义,没啥意义,就只是会在/var/log/cron里头记载该项任务的名称这样。

第十六章 程序管理与SELinux初探

16.1.什么是程序

  • 程序衍生出来的其它程序在一般状态下,也会沿用这个程序的相关权限。
  • fork-and-exec流程:系统先以fork方式复制一个与父程序相同的暂存程序,与父程序唯一区别就是PID,还多个PPID。暂存程序开始以exec的方式载入实际要执行的程序。
  • 一般daemon类型的程序都会加上d在文件名后头。

16.2.工作管理

  • 观察目前的背景工作状态jobs,加l参数可看PID。“+”代表代表最近被放到背景的工作号码,“-”代表最近第二。

  • 使用ctrl+z将当前前景工作放在背景暂停;使用fg将背景工作拿到前景继续执行:fgfg -fg %1;使用bg将背景工作放在背景继续执行:bg %3

  • 使用kill:kill -9 %1kill -15 %1,一个强制结束(9),一个正常结束(15,默认值)。参看signal可使用man 7 signalkill -l

  • at是将工作放置到系统背景,而与终端机无关。

  • nohup可以让你在离线或登出系统后,还能让工作继续执行。nohup并不支持bash内置的指令。其输出讯息会在~/nohup.out。

16.3.程序管理

  • 查询自身bash下相关的程序:ps -l。各字段意义:

    • F:process flags,说明这个程序的总结权限。为4表示权限为root,为1表示此子程序仅fork未exec。

    • S:STAT,表明程序状态。

      • R:表示正在运行。

      • S:表示正在睡眠状态(idle),可被唤醒(signal)。

      • D:不可被唤醒的睡眠状态,通常这支程序在等待I/O情况。

      • T:停止状态,可能是在工作控制或出错(traced)状态。

      • Z:Zombie,僵尸状态,程序已终止但无法被移除内存之外。

    • UID/PID/PPID。

    • C:代表CPUshiyonglv,单位为百分比。

    • PRI/NI:Priority/Nice,被CPU所执行的优选顺序,越小越先。

    • ADDR/SZ/WCHAN:与内存有关。ADDR是kernel function,指出该程序在内存的哪个部分,如果是个running程序一般会显示”-“。SZ代表此程序用掉多少内存。WCHAN表示目前程序是否运行中(“-”)。

    • TTY:登录者终端机位置,若为远程登录则使用动态终端接口(pts/n)。

    • TIME:实际花费CPU的时间。

    • CMD。

  • 观察系统所有程序:ps aux。各字段意义:

    • USER、PID、%CPU、%MEM
    • VSZ:该process使用的虚拟内存量(KBytes)。
    • RSS:该process占用的固定内存量(KBytes)。
    • TTY、STAT
    • START:该process触发启动的时间。
    • TIME、COMMAND
  • 列出所有程序:ps -lA。列出类似程序树的程序显示:ps axjf

  • 列出的程序中发现CMD后面有<defunct>,就代表为僵尸进程。通常僵尸进程无法管控,而直接交给systemd这支程序负责,它是系统的第一支程序。

  • top指令格式:top [-d 数字] | top [-bnp]。d参数指定几秒刷新一次,默认值5。b参数表明以批次方式执行。n与b搭配,表示需要进行几次top的输出结果。p参数指定PID。

  • pstree指令格式:pstree [-A|U] [-up]。A/U表明以ASCII/万国码字符连接。u、p参数表示显示username、pid。

  • killall可使用程序名来发送信号。

  • PRI是核心动态调整的,使用者无法直接调整PRI值。PRI(new) = PRI(old) + nice。nice值可取(-20~19),root随意调整自己与其他人的nice值,一般只能调整自己的nice值,且不能为负数,且只能调大。nice指令nice [-n 数字] command,renice指令renice [number] PID。nice值是会在父子进程中传递。

  • free、uname、uptime、netstat、dmesg、vmstat

16.4.特殊文件与程序

  • 基本上,目前主机上面的各个程序的PID都是以目录的型态存在于/proc中。如systemd的PID为1,它所相关的信息在/proc/1/*中,其中cmdline为这个程序被启动的指令串,environ为这个程序的环境变量内容。

  • 如果是正对于整个Linux系统相关的参数在/proc下。

  • fuser可让我们了解到某个文件(或文件系统)目前正在被哪些程序所利用。

  • lsof列出被程序所打开的文件文件名。

  • pidof找出某支正在执行的程序的PID。

16.5.SELinux初探

  • SELinux是通过MAC方式来空管程序,它控制的主体是程序,目标是该程序能否读取的文件资源。

  • SELinux的政策有三种:

    • targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策。
    • minimum:由targeted修订而来,仅针对选择的程序来保护。
    • mls:完整的SELinux限制,限制方面较为严格。
  • 安全性文本放置在文件的inode内。安全性文本可用ls -Zps -eZ查看,三个字段的意思为identify:role:type:

    • identify:常见有unconfined_u不受限用户,默认bash是不受SELinux管制,使用该bash程序创建的文件大多是unconfined_u;system_u系统用户,大部分是系统自己产生的文件。
    • role:通过该字段指明数据属于程序、文件资源还是代表使用者。一般角色有object_r代表文件或目录等文件资源;system_r代表程序,不过一般使用者也会被指定成为system_r。
    • type。
  • SELinux的三种模式:enforcing强制模式、permissive宽容模式(SELinux不匹配会有警告但不会限制domain/type的存取,常用于SELinux的debug)、disabled关闭。

  • 获取SELinux的模式可使用getenforce。获取SELinux的政策使用sestatus。SELinux的配置文件在/etc/selinux/config

  • 修改SELinux的模式使用setenforce [0|1],0为permissive,1为enforing。

  • 获取系统上SELinux的全部规则使用getsebool -asestatus -b

  • 查询SELinux规则使用seinfo、sesearch,需要下载setools-console。使用seinfo,Types字段指出了安全文本类别数,Booleans字段指出了SELinux规则数。查询所有身份识别、角色使用-u、-r参数。

  • 使用sesearch查询的格式sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布尔值]sesearch -A -s crond_t | grep spoolsesearch -A -b httpd_enble_homedirs。-A参数表明列出后面数据中,允许“读取或放行”的相关数据。

  • 使用semanage查看规则的作用:semanage boolean -l | grep httpd_enable_homedirs

  • 修改SELinux规则的布林值:getsebool httpd_enable_homedirssetsebool -P httpd_enable_homedirs 1。-P参数会直接将设置值写入配置文件,该设置数据未来会生效。

  • 修改SELinux type使用chcon,格式为:chcon [-R] [-t type] [-u user] [-r role] 文件chcon [-R] --reference=范例档 文件。-R参数会使得目录下的此目录也被修改,-v参数可在变化成功时将变动结果列出来。如chcon -v -t net_conf_t /etc/cron.d/checktimechcon -v --reference=/etc/shadow /etc/cron.d/checktime

  • 让文件恢复默认的SELinux type使用restorecon,格式为:restorecon [-Rv] 文件或目录

  • 查询默认SELinux type:semange fcontext -l | grep -E '^/etc | ^/etc/cron'。修改默认SELinux type:semanege fcontext -a -t system_cron_spool_t "/srv/mycron(/.*)?"

  • setoubleshoot服务会将关于SELinux的错误讯息与克服方法记录在/var/log/messages/var/log/setroubleshoot/*中。该服务需要两个软件setroubleshoot与setroubleshoot-server。原本的SELinux信息本来是以auditd与setroubleshootd服务来记录的。CentOS6后将两者整合在auditd中了,并没有setroubleshootd,因此安装完setroubleshoot-server需要重启setroubleshootd。CentOS对setroubleshootd的运行方式是:先由auditd调用audispd服务,audispd服务启动sedispatch程序,sedispatch程序将原本的auditd讯息转成setroubleshootd讯息,进一步存储下来的。检查sestroubleshoot是否安装rpm -qa | grep setoubleshoot

  • 匿名者使用ftp服务器的话(如果使用浏览器的话就是一种匿名者),主文件夹默认是/var/ftp,该匿名者只能在主文件下下载数据。一般账号使用ftp登录系统,能够取得自己主文件夹下面的文件数据,默认可以上传、下载文件。

  • 安装ftp的服务:yum install vsftpd。启动:systemctl start vsftpdsystemctl enable vsftpd

  • 匿名者默认要给用户下载的FTP文件会放置在/var/ftp/pub中,使用终端浏览器curl来看看:curl ftp://localhost/pub/。注意修订其下文件/目录的权限以及SELinux type:chmod a+r /var/ftp/pub/securettycurl ftp://localhost/pub/securettyrestorecon -Rv /var/ftp

  • 使用ftp下载主文件夹下的文件:curl ftp://ftptest:myftp123@localhost/~/test.txt。出现问题可查看/var/log/messages

  • 变更ftp端口:向/etc/vsftpd/vsftpd.conf不与前行留空白的条件下在最后一行添加listen_port=555。出现问题查看/var/log/messages

第十七章 认识系统服务(daemons)

17.1.什么是daemon与服务(service)

  • system V版本下,启动服务管理的方式是init脚本程序。系统核心调用的第一张程序是init,然后init去唤起所有的系统所需要的服务。
    • 所有的服务启动脚本放在/etc/init.d/下,可以通过以下方式处理:/etc/init.d/daemon [start|stop|restart|status]
    • init服务依据是独立启动或被一只总管程序分为两大类:
      • 独立启动模式(stand alone):服务独立启动,直接常驻于内存。
      • 总管程序(super daemon):由特殊的xinetd或inetd这两个总管程序提供socket对应或port对应的管理。xinetd又被称为super daemon。
    • init可根据使用者自订的执行等级(runlevel)来唤醒不同的服务,基本上有7个执行等级,比较重要的是:1单人维护模式、3纯文本模式、5文字加图形界面。而各个执行等级的启动脚本是通过/etc/rc.d/rc[0-6]/SXXdaemon链接到/etc/init.d/daemon,S为启动该服务,XX是数字为启动顺序。
    • 若要创建如上提到的SXXdaemon的话,不需要管理员手动创建链接文件,而通过指令chkconfig daemon onchkconfig daemon offchkconfig --list daemon
    • 执行等级的切换行为:如切换到等级5,使用init 5
  • 从CentOS7.x以后,Red Hat的distribution放弃System V,改用systemd这个启动服务管理机制。
    • systemd可以让所有的服务同时启动。
    • systemd相容于init的启动脚本。
    • systemctl不可自订参数。
    • 如果某个服务启动是管理员自己手动执行启动,而不是使用systemctl去启动的,那么systemd将无法侦测到该服务,而无法进一步管理。
    • systemd启动过程中,无法于管理员通过stdin传入讯息。
  • systemd将过去所谓daemon执行脚本通通称为一个服务单位(unit),而每种服务单位依据功能来区分是,就分类为不同的类型(type)。
  • systemd的配置文件按优先级低到高在如下目录:
    • /usr/lib/systemd/system/:每个服务最主要的启动脚本设置,有点类似以前的/etc/init.d下面的文件。
    • /run/systemd/system/:系统执行过程中所产生的服务脚本。
    • /etc/systemd/system:管理员依据主机系统的需求所创建的执行脚本。
  • /usr/lib/systemd/system/下依据扩展名区分type:
    • service:一般服务类型,主要是系统服务,包括服务器本身所需要的本机服务以及网络服务。
    • socket:内部程序数据交换的插槽服务。
    • target:执行环境类型,其实就是一群unit集合。
    • mount/automount:文件系统挂载相关的服务。
    • path:侦测特定文件或目录类型。某些服务需要侦测某些特定的目录来提供伫列服务,例如最常见的打印服务,就是通过侦测打印伫列目录来启动打印功能。
    • timer:循环执行的服务,类似于anacrontab,不过是systemd主动提供的,比anacrontab更加有弹性。

17.2.通过systemctl管理服务

  • systemctl指令格式:systemctl [start|stop|restart|reload|enable|disble|status|is-active|is-enable] [unit]。unit常见状态:

    • active(running):正有一只或多只程序正在系统中执行的意思。
    • active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。如开机或者挂载时才会进行一次的quotaon功能。
    • active(waiting):正在执行当中,不过还再等待其他的事件才能继续执行。
    • inactive:这个服务目前没有执行的意思。

    daemon的默认状态:

    • enabled:这个daemon将在开机时被执行。
    • disabled:这个daemon在开机时不会被执行。
    • static:这个daemon不可自己启动(enable不可),不过可能会被其他的enabled的服务来唤醒。
    • mask:这个daemon无论如何都无法被启动,因为已经被强制注销。可通过systemctl unmask方式改回原本状态。
  • 注销/还原服务指令:systemctl mask [unit]systemctl unmask [unit]。注销其实就是修改链接文件到/dev/null

  • systemctl list-unit-files会将系统上所有的服务通通列出来;而systemctl/systemctl list-units仅以unit分类做大致说明,使用时可指定type,如systemctl list-units --type=service --all

  • 与操作系统界面相关性比较高的target主要有:

    • graphical.target:就是文字加上图形界面,这个项目已经包含了multi-user.target项目。
    • multi-user.target:纯文本模式。
    • rescue.target:在无法使用root登录的情况下,systemd在开机时会多加一个额外的暂时系统,与原本的系统无关。这时可以取得root的权限来维护你的系统。但是这是额外系统,因此可能需要动到chroot的方式来取得原有的系统。
    • emergency.target:紧急处理系统的错误,还是需要使用root登录的情况。
    • shutdown.target:就是关机流程。
    • getty.target:可以设置需要几个tty之类的。

    获取默认的界面,将其转为纯文本模式:systemctl get-defaultsystemctl set-default multi-user.target

    在不关机的情况下,将目前操作环境改为纯文本模式,关掉图形界面:systemctl isolate multi-user.target。在service部分使用start/stop/restart,而target需使用isolate。

  • systemd提供了几个简单的指令用于切换操作模式:systemctl poweroffsystemctl rebootsystemctl suspendsystemctl hibernatesystemctl rescuesystemctl emergency。suspend会将系统状态保存在内存中,然后关闭掉大部分的系统硬件,唤醒后,系统数据会从内存中恢复,然后重新驱动大部分关闭的硬件。hibernate将系统状态保存到硬盘当中,然后关机,唤醒系统时,将保存在硬盘中的系统状元恢复回来。

  • 使用指令systemctl list-dependencies [unit] [--reverse]可查看unit依赖的unit,加--reverse参数查看哪些unit依赖该unit。

  • systemd的daemon运行中,除了那三个配置文件目录,还有以下相关目录:

    • /etc/sysconfig/*:几乎所有的服务会初始化的一些选项设置写入到这个目录下。
    • /var/lib/:一些会产生数据的服务都会将他的数据写入到该目录下。
    • /run/:放置了好多daemon的暂存盘。
  • 使用systemctl list-sockets查看socket服务。

  • /etc/services将服务于端口对应在一起。

17.3.systemctl针对于service类型的配置文件

  • 额外修改unit,以vsftpd.service为例,建议:

    • /etc/systemd/system/vsftpd.service.d/custom.conf:创建同名加.d的目录,并在该目录下写配置文件即可。这个目录下的文件会累加其他设置到/usr/lib/systemd/system/vsftpd.service内。
    • /etc/systemd/system/vsftpd.service.wants/*:此目录下为链接文件,意思是在启动vsftpd.service之后,最好加上这目录下面建议的服务。
    • /etc/systemd/system/vsftpd.service.requires/*:此目录下为链接文件,意思是在启动vsftpd.service之前,需要事先启动哪些服务。
  • unit中service配置文件。设置的项目是可以重复的,不过后面的值会取代前面的值;空白行、开头为#;代表注释;设置说明:

    • Unit:unit本身说明,以及与其它相依daemon的设置。

      • Description:简易说明,使用systemctl list-units时可以看到。
      • Document:提供管理员进行进一步的文件查询功能。
      • After/Before:说明(并非强制)此unit在哪个daemon启动之后/之前。
      • Requires:明确规定此unit在哪个daemon启动后才能启动。
      • Wants:规范这个unit启动之后最好还要启动什么服务。
      • Conflicts:与哪些服务不能同时启动。
    • Service:规范服务启动的脚本、环境配置文件文件名、重新启动方式等等。

      • Type:说明这个daemon启动的方式,会影响ExecStart。

        • simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中。
        • forking:由ExecStart启动的程序通过spawns延伸出其他子程序作为此daemon的主要服务。原生的父程序在启动结束后就会终止运行。
        • oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。
        • dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运行。因此设置这个项目时,通常也要设置BusName=才行。
        • idle:与simple类似,意思是,要执行这个daemon必须要所有的工作都顺利执行完毕才会执行。这类的daemon通常时开机到最后才执行即可的服务。
      • EnvironmentFile:指定启动脚本的环境配置文件。

      • ExecStart:就是实际执行此daemon的指令或脚本程序。也可使用ExecStartPre、ExecStartPost设置实际启动服务前、后进行额外的指令行为。使用指令串仅接受“指令 参数 参数”格式,不支持<>>>|&等特殊字符,很多bash语法也不支持。若要支持比较完整的bash语法,使用Type=oneshot才行。

      • ExecStop:与systemctl stop有关,关闭此服务时所进行的指令。

      • ExecReload:与systemctl reload有关的指令行为。

      • Restart:当设置为1时,则当此daemon服务终止后,会再次启动此服务。

      • RemainAfterExit:当设置为1时,则当此daemon所属的所有程序都终止后,此服务会再尝试启动。

      • TimeoutSec:若这个服务在启动或关闭时,因为某些缘故导致无法顺利“正常启动或正常结束”的情况下,则我们要等多久才进入“强制结束”的状态。

      • KillMode:可以是process、control-group、none中的一种。

        • process:当daemon终止时,只会终止主要的程序(ExecStart接的后面那串指令)。
        • control-group:当daemon终止时,则由此daemon所产生的其他control-group程序,也都会被关闭。
        • none:当daemon终止时,没有程序会被关闭。
      • RestartSec:与Restart有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要sleep多少时间在重新启动的意思。默认100ms。

    • Install:将此unit安装到哪个target里。

      • WantedBy:后面接的大部分是*.target unit,意思是这个unit本身是附挂在哪一个target unit下面的。
      • Also:当目前这个unit本身被enable时,Also后面接的unit也请enable的意思。
      • Alias:进行一个链接的别名的意思。当systemctl enable相关的服务时,则此服务会进行链接文件的创建。
  • 两个vsftpd运行的示例:

    cd /etc/vsftpd
    cp vsftpd.conf vsftpd2.conf
    vim vsftpd.conf # 注释掉上次增加的listen_port=555(在16章最后)
    cd /etc/systemd/system
    cp /usr/lib/systemd/system/vsftpd.service vsftpd2.service
    vim vsftpd2.service # 修改ExecStart指令,使用vsftpd2.conf配置文件
    systemctl daemon-reload
    systemctl list-unit-files --all | grep 'vsftpd'
    systemctl status vsftpd2.service
    systemctl restart vsftpd.service vsftpd2.service
    systemctl enable vsftpd.service vsftpd2.service
    systemctl status vsftpd.service vsftpd2.service
    netstat -tlnp
  • 将tty的数量由6降低到4个:

    vim /etc/systemd/logind.conf # 修改NAutoVTs=4,ReserveVT=0
    systemctl stop getty@tty5.service
    systemctl stop getty@tty6.service
    systemctl restart systemd-login.service
  • 启动tty8:systemctl start getty@tty8.service

  • 暂时新增vsftpd到2121端口:复制并修改配置文件,使用systemctl start vsftpd@vsftpd3.service

  • 制作一个备份自己系统的服务:

    vim /backups/backup.sh
    #!/bin/bash
    source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
    target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
    [ ! -d /backups ] && mkdir /backups
    tar -zcvf ${target} ${source} &> /backups/backup.log
    chmod a+x /backups/backup.sh
    ll /backups/backup.sh
    vim /etc/systemd/system/backup.service
    [Unit]
    Description=backup my server
    Requires=atd.service
    [Service]
    Type=simple
    ExecStart=/bin/bash -c " echo /backups/backup.sh | at now"
    [Install]
    WantedBy=multi-user.target
    systemctl daemon-reload
    systemctl start backup.service
    systemctl status backup.service

17.4.systemctl针对于timer的配置文件

  • 使用systemd的timer功能,需要:

    • timer.target一定要启动。
    • sname.service的服务存在。
    • sname.timer的时间启动服务存在。
  • 开机两小时后开始执行一次backup.service,并第一次执行后,每两天执行一次:

    vim /etc/systemd/system/backup.timer
    [Unit]
    Description=backup my server timer
    [Timer]
    OnBootSec=2hrs
    OnUnitActiveSec=2days
    [Install]
    WantedBy=multi-user.target
    systemctl daemon-reload
    systemctl enable backup.timer
    systemctl restart backup.timer
    systemctl list-unit-files | grep backup
    systemctl show timer.target
    systemctl show backup.service
    systemctl show backup.timer

17.5.CentOS7.x默认启动的服务简易说明

第十八章 认识与分析登录文件

18.1.什么是登录文件

  • 登录文件的权限通常是设置为仅有root能够读取而已。

  • 常见的几个登录文件(在/var/log下):

    • boot.log:开机的时候系统核心会去侦测与启动硬件,接下来开始各种核心支持的功能启动等。这些流程都会记录在/var/log/boot.log里面。不过这个文件只会存这次开机启动的信息,前次的不会保留下来。
    • cron:crontab调度是否被执行、进行过程有无错误、/etc/crontab是否撰写正确。
    • dmesg:记录系统在开机的时候核心侦测过程所产生的各项信息。
    • lastlog:记录系统上面所有账号最近一次登录系统时的相关信息。lastlog指令就是利用这个文件的记录信息来显示的。
    • maillog或mail/*:记录邮件的往来信息,其实主要是记录postfix(SMTP协定提供者)与dovecot(POP3协定提供者)所产生的讯息。
    • messages:几乎系统发生的错误讯息(或者是重要的信息)都会记录在这个文件中。
    • secure:基本上,只要牵涉到“需要输入账号密码”的软件,那么当登录时(不管登录正确或错误)都会被记录在此文件中。包括系统的login程序、图形接口登录所使用的gdm程序、su、sudo等程序、还有网络连线的ssh、telnet等程序,登录信息都会被记载在这里。
    • wtmp、faillog:这两个文件可以记录正确登录系统中的账号信息(wtmp)与错误登录时所使用的账号信息(faillog)。last指令就是读取wtmp来显示的。
    • httpd/*、samba/*:不同的网络服务会使用它们自己的登陆文件来记载它们自己产生的各项讯息。上述目录则是个别服务所制定的登陆文件。

    不同的Linux distributions通常登陆文件的文件名不会相同。

  • 登陆文件有两种方式产生:软件开发商自行定义写入的登录文件与相关格式;由Linux distribution提供的登陆文件管理服务来统一管理。

  • 基本上,系统由systemd所管理,那所有经由systemd启动的服务,如果在启动会结束的过程中发生一些问题或者是正常的讯息,就会将该讯息由systemd-journald.service以二进制的方式记录下来,之后再将这个讯息发送给rsyslog.service作进一步的记载。

  • systemd-journald.service的记录主要都放置于内存中。我们也能够通过journalctl以及systemctl status unit.service来查看各个不同服务的登陆文件。

18.2.rsyslog.service:记录登录文件的服务

  • rsyslogd针对各种服务与讯息记录在某些文件的配置文件就是/etc/rsyslog.conf,格式为:服务名称[.=!]讯息等级 讯息记录的文件名或设备或主机

    • 服务名称:有kern(kernel)、user、mail、daemon、auth、syslog、lpr、news、uucp、cron、authpriv、ftp、local0-local7

      相对序号 服务类别 说明
      0 kern(kernel) 核心产生的讯息,大部分都是硬件侦测以及核心功能的启用
      1 user 使用者层级所产生的信息,例如用户使用logger指令来记录登录文件的功能
      2 mail 与邮件收发相关的讯息
      3 daemon 主要是系统的服务所产生的讯息,例如systemd
      4 auth 主要与认证/授权有关的机制,例如login、ssh、su
      5 syslog 就是由syslog相关协定产生的信息,其实就是rsyslogd这支程序本身产生的信息
      6 lpr 打印相关的信息
      7 news 与新闻群组服务器有关的东西
      8 uucp 全面为Unix to Unix Copy Protocol,早期用于unix系统间的程序数据交换
      9 cron 就是例行性工作调度cron/at等产生讯息记录的地方
      10 authpriv 与auth类似,但记录较多账号私人的信息,包括pam模块的运行等
      11 ftp 与FTP通讯协定有关的讯息输出
      16-23 local0-local7 保留给本机用户使用的一些登陆文件讯息,较常与终端机互动
    • 讯息等级数值高到低为:7debug、6info、5notice、4warning(warn)、3err(error)、2crit、1alert、0emerg(panic)。除了0-6间还有两个比较特殊的等级:debug(错误侦测等级)和none(不需登录等级)。

    • 服务名称与讯息等级之间的连号有:

      • .:代表比后面还要严重的等级。
      • .=:代表所需要的等级就是后面接的等级。
      • .!:代表不等于,即是除了该等级外的其他等级都记录。
  • syslog是Linux核心所提供的登陆文件设计指引,所有的要求大概都写入到一个名为syslog.h的头文件中。如果想要开发与登陆文件有关的软件,那么就要依据syslog函数的要求去设计。早期CentOS5.x以前,要达成syslog的功能是由一支名为syslogd的daemon来完成的,从CentOS6以来则是通过rsyslogd这个daemon。

  • rsyslog.conf格式举例:

    mail.* -/var/log/maillog
    news.*;cron.* /var/log/cronnews
    *.*;news,cron,mail.none /var/log/messages # 或者 *.*;news.none;cron.none;mail.none

    其中的“-”,是由于邮件产生的信息多,因此希望先将邮件产生的信息存储在内存中,等到数据量够大了才一次性的将所有数据都填入磁盘内。

  • rsyslogd的登录文件只有被编辑过(使用vi/vim)就无法继续写入。可以重新启动rsyslog.service服务来让他继续提供服务。

  • 使用chattr +a /var/log/admin.log一定程度上可以保护登录文件的信息安全,但我们进行登录文件轮替时(logrotate),将会无法移动该登录文件的文件名。

  • 登陆文件服务器默认端口为514。

    对于服务端(假如IP为192.168.1.100),需修改/etc/rsyslog.conf,将对应TCP或UDP的注释给删掉,如使用TCP:

    $ModLoad imtcp
    $InputTCPServerRun 514

    对于客户端,向/etc/rsyslog.conf添加内容:

    *.* @@192.168.1.100
    #*.* @192.168.1.100 使用UDP需要这样写

18.3.登录文件的轮替(logrotate)

  • logrotate程序是挂在cron下面进行的,/etc/cron.daily/下logrotate文件就是记录了每天要进行的登录文件轮替行为。

  • logrotate的配置文件在/etc/logrotate.conf和/etc/logrotate.d/中。/etc/logrotate.conf会读取/etc/logrotate.d/下的内容。

  • /etc/logrotate.conf中的内容:

    weekly # 默认每周进行一次rotate工作
    rotate 4 # 保留几个登陆文件
    create # 由于登陆文件被更名,因此创建一个新的来继续存储之意
    dateext # 让被轮替的文件名加上日期作为文件名
    # compress # 被更动的登陆文件是否需要压缩
    include /etc/logrotate.d # 将该目录中的所有文件都读进来进行rotate工作
    /var/log/wtmp { # 仅对/var/log/wtmp所设置的参数
    monthly
    create 0664 root utmp # 指定新建文件的权限于所属账号、群组
    minsize 1M # 文件大小一定要超过1M后才进行rotate
    rotate 1
    }

    /etc/logtoate.d/syslog中的内容:

    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null | true
    endscript
    }

    其中,执行脚本被放在sharedscripts与endscript之中,prerotate与postrotate分别是在执行logrotate之前和之后的指令。

  • 尝试对/var/log/admin.log设置rotate:

    chattr +a /var/log/admin.log
    vim /etc/logrotate.d/admin
    /var/log/admin.log
    {
    monthly
    size=10M
    rotate 5
    compress
    sharedscripts
    pretrotate
    chattr -a /var/log/admin.log
    endscript
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null | true
    /usr/bin/chattr +a /var/log/admin.log
    endscript
    }
    logrotate -v /etc/logrotate.conf
    logrotate -vf /etc/logrotate.conf

18.4.systemd-journald.service简介

  • rsyslogd必须在开机完成并且执行了rsyslogd后,登陆文件才会开始记录。要记录系统在开机过程、启动服务的过程中的信息,在以前核心还得自己产生一个klogd服务,然后等到rsyslogd启动后传送给他处理。但现在systemd是核心唤醒的第一支执行的软件,他可主动调用systemd-journald来协助记载登录文件,上述信息可被直接记录到systemd-journald里去。

  • systemd-journald是内存的登陆文件记录方式,他以文件型态被放在/run/log/下面(/run在CentOS7其实是内存内的数据,所以重新开机后,下面的数据就被刷新了)。

  • 使用journalctl查询systemd-journald.service的数据:

    journalctl
    journalctl --since "2015-08-08 00:00:00" --until "2015-08-19 00:00:00"
    journalctl --since today
    journalctl --since yesterday --until today
    journalctl _SYSTEMD_UNIT=crond.service -n 10 # 列出对应unit的最新10条
    journalctl _COMM=su _COMM=login -n 10 # 列出su、login执行的登陆文件讯息,最新10条
    journalctl -p err # 列出等级为err的登陆文件讯息
    journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10 # 列出auth、authpriv相关的登陆文件讯息
    journalctl -f # 以实时变化列出,结束使用ctrl+c
  • logger指令将数据存储到登陆文件,格式为:logger [-p 服务名称.等级] "讯息"。如logger -p user.info "I will check logger command"

  • systemd-journald的配置文件主要参考/etc/systemd/journald.conf的内容。

  • 保存journalctl所读取的登陆文件,需要创建/var/log/journal目录:

    mkdir /var/log/journal
    chown root:systemd-journal /var/log/journal
    chmod 2775 /var/log/journal
    systemctl restart systemd-journald.service

    不过既然有rsyslog.service以及logrotate,建议journald.service产生的登陆文件放在/run/log下。

18.5.分析登录文件

  • logwatch会每天分析一次登录文件,并且将数据以email的格式发送给root。

第十九章 开机流程、模块管理与Loader

19.1.Linux的开机流程分析

  • 开机流程:

    1. 载入BIOS的硬件信息与进行自我测试,并依据设置取得第一个可开机的设备。
    2. 读取并执行第一个开机设备内的MBR的boot loader(亦即是grub2、spfdisk等程序)。
    3. 依据boot loader的设置载入Kernel,Kernel会开始侦测硬件与载入驱动程序。
    4. 在硬件驱动成功后,Kernel会主动调用systemd程序,并以default.target流程开机。
      • systemd执行sysinit.target初始化系统及basic.target准备操作系统。
      • systemd启动multi-user.target下的本机与服务器服务。
      • systemd执行multi-user.target下的/etc/rc.d/rc.local文件
      • systemd执行multi-user.target下的getty.target及登录服务。
      • systemd执行graphical需要的服务。
  • 每个文件系统(filesystem或者是partition)都会保留一块开机扇区(boot sector)提供OS安装boot loader,而通常操作系统默认都会安装一份loader到它根目录所在文件系统的boot sector上。在安装Linux时,可选择将boot loader安装到MBR上去,这样MBR和boot sector上都有boot loader。但Windows会默认主动的将MBR与boot sector上都安装一份boot loader(而且Windows的loader默认不具有控制权转交的功能,所以要先装Windows再装Linux才能实现多重开机)。

  • 核心文件取名为/boot/vmlinuz,可被boot loader载入(直接指向可开机的程序区段来开始操作系统)。

  • 核心模块放置在/lib/modules中,而Linux核心通过动态载入核心模块,这要求/lib不可以与/分别放在不同的partition。

  • 虚拟文件系统(Initial RAM Disk/Filesystem)能够通过boot loader来载入内存,一般取名为/boot/initrd或/boot/initramfs。其被解压缩后是一个小型文件系统,可使用lsinitrd /boot/initramfs-...查看。其中init链接到usr/lib/systemd/sytem,而该目录下default.target又连接到initrd.target。而initrd.target也是需要读入一堆例如basic.target、sysinit.target等等的硬件侦测、核心功能启用的流程,然后开始让系统顺利运行。最终才又卸载initramfs的小型文件系统,挂载实际系统的根目录。这样才能读取/lib/modules中的核心模块。

  • 在核心载入完毕、进行完硬件侦测与驱动程序载入后,此时核心会主动调用第一支程序,systemd。所有的动作都会通过systemd的默认启动服务集合,即/etc/systemd/system/default.target。

  • systemV使用runlevel的概念来启动系统,systemd相容于旧式systemV,使用ll -d /usr/lib/systemd/system/runlevel*.target | cut -c 28-可查看。

  • systemV中要让系统额外执行某些程序的话,可将其指令/脚本的绝对路径名称写到/etc/rc.d/rc.local中。systemd相容于systemV这个功能使用rc-local.service服务,不需要启动,该服务根据/etc/rc.d/rc.local是否有可执行的权限来决定是否启动:

    chmod a+x /etc/rc.d/rc.local
    systemctl daemon-reload
    systemctl list-dependencies multi-user.target | grep rc-local
  • 开机过程会用到的主要配置文件:

    • /etc/modprobe.d/*.conf:单纯要核心载入模块的位置。

    • /etc/modules-load.d/*.conf:可以加上模块参数的位置。

      如修改防火墙设置:

      vim /etc/module-load.d/meyok.conf
      options nf_conntrack_ftp ports=555
    • /etc/sysconfig/*。

19.2.核心与核心模块

  • 核心与核心模块的位置:

    • 核心:/boot/vmlinuz或/boot/vmlinuz-version
    • 核心解压缩所需RAM Disk:/boot/initramfs(/boot/initramfs-version)
    • 核心模块:/lib/modules/version/kernel或/lib/modules/$(uname -r)/kernel
    • 核心源代码:/usr/src/linux或/usr/src/kernels/(要安装才会有,默认不安装)

    如果该核心被顺利的载入系统当中了,那么就会有几个信息记录下来:

    • 核心版本:/proc/version
    • 系统核心功能:/proc/sys/kernel
  • 对于新的硬件,但操作系统不支持的解决办法:

    • 重新编译核心,并加入最新的硬件驱动程序源代码。
    • 将该硬件的驱动程序编译成模块,在开机时载入该模块。
  • /lib/modules/$(uname -r)/modules.dep这个文件记录了模块依赖性,使用depmod这个指令可创建该文件。

    cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net # 添加一个新的驱动,kernel核心模块扩展名一定是ko
    depmod # 更新modules.dep文件
  • 使用lsmod观察目前核心载入了多少的模块,其中Used by字段显示此模块是否被其他模块所使用,这样可以看出某个模块载入前必须载入哪些其他模块。

  • 使用modinfo显示对应模块的相关信息,如modinfo drm显示drm模块的filename、description等。

  • 手动载入模块可使用modprobe指令和insmod指令,后者相较于前者不会分析某块依赖性,且必须使用完整的文件名:

    insmod /lib/modules/$(uname -r)/kernel/fs/fat/fat.ko # 手动载入fat.ko模块
    lsmod | grep fat # 显示相关信息
    rmmod fat # 移除fat模块
    modprobe vfat # 载入vfat模块
    modprobe -r vfat # 删除vfat模块

19.3.Boot loader:Grub2

  • Linux将boot loader的程序码执行与设置值载入分成两个阶段来执行。

    • 执行boot loader主程序:这个主程序必须被安装在开机区,即是MBR或boot sector。
    • 主程序载入配置文件:通过boot loader载入所有配置文件与相关的环境参数文件。一般来说,配置文件都在/boot下面。
  • grub2优点:

    • grub2认识与支持较多的文件系统,并且可以使用grub2的主程序直接在文件系统中搜寻核心文件名。
    • 开机的时候,可以自行编辑与修改开机设置项目,类似bash的指令模式。
    • 可以动态搜寻配置文件,而不需要在修改配置文件后重新安装grub2,即是修改/boot/grub2/grub.cfg中的内容。
  • 磁盘与分区在grub2中的代号:(hd0,1)(hd0,msdos1)(hd0,gpt1),其中硬盘以hd表示。

  • grub.cfg文件中:

    • set default:默认由哪个选项开机。set timeout:默认的秒数。
    • menuentry中:
      • --class、--unrestricted、--id
      • {}内:在选择这个菜单之后就会进行的动作。
        • set root='hd0,gpt2':指定grub2配置文件在哪个设备。
        • linux16 /vmlinuz-... root=/dev/mapper/centos-root...:Linux核心文件以及核心执行时所下达的参数。/vmlinuz-...需要搭配上面的set root才是完整路径,如果/boot没有独立分区,仅有/分区,则应该为/boot/vmlinuz-...。这里的root=/dev/mapper/centos-root...指的是linux文件系统中,根目录是在哪个设备上。
        • initrd16 /initramfs-3.10...:就是initramfs所在文件名,需要搭配set root=xxx。
  • 一般不建议直接修改grub.cfg配置文件,而使用grub2-mkconfig指令来产生新的grub.cfg文件,通过/etc/default/grub这个主要环境配置文件与/etc/grub.d/目录内的相关配置文件来处理比较妥当。

  • /etc/default/grub中的内容:

    • GRUB_TIMEOUT:倒数时间设置,若一定要选择则填-1即可。
    • GRUB_TIMEOUT_STYLE:可以是menu、countdown、hidden等等。menu默认。如果不想要使用者看到菜单,可设置为countdown,会显示剩余的等待秒数,而hidden不会显示。
    • GRUB_TERMINAL_OUTPUT:输出画面使用哪一个终端机。
    • GRUB_DEFAULT:默认使用哪一个menuentry来开机,可以是:saved,代表使用grub2-set-default来设置哪一个menuentry为默认值的意思,通常为0;数字,如1,代表第二个menuentry开机;title名;id名等等。
    • GRUB_CMDLINE_LINUX:核心外加参数功能。
  • 修改grub.cfg示例:

    vim /etc/default/grub
    GRUB_TIMEOUT=40
    GRUB_DEFAULT=0
    GRUB_TIMEOUT_STYLE=menu
    ...
    GRUB_CMDLINE_LINUX="... quiet elevator=deadline" # 修改硬盘读写机制为deadline
    grub2-mkconfig -o /boot/grub2/grub.cfg

    可以使用以下指令查看grub.cfg内容是否变了:

    grep timeout /boot/grub2/grub.cfg
    grep default /boot/grub2/grub.cfg
    grep linux16 /boot/grub2/grub.cfg
  • grub2-mkconfig分析/etc/grub.d/*里面的文件,然后执行该文件来创建grub.cfg。一般来说,会有以下文件存在:

    • 00_header:主要在创建初始的显示项目,大部分在/etc/default/grub里面所设置的变量,大概都会在这个脚本当中被利用来创建grub.cfg。
    • 10_linux:根据分析/boot下面的文件,尝试找到正确的linux核心与读取这个核心需要的文件系统模块与参数等,都在这个脚本运行后找到并设置到grub.cfg当中。这个脚本会将所有在/boot下面的每一个核心文件都对应到一个菜单。
    • 30_os-prober:默认回到系统上找其他的partition里面可能含有的操作系统,然后将该操作系统做成菜单。如果不想将其他操作系统侦测到拿来开机,在/etc/default/grub里加上GRUB_DISABLE_OS_PROBER=true
    • 40_custom:如果还有其他自己手动加上去的菜单项目,或者是其他的需求,建议在这个文件中补充。
  • 添加一个指定核心开机示例:

    使用graphical.target开机而不考虑default.target,在40_custom中添加内容:

    vim /etc/grub.d/40_custom
    menuentry '...' --class ... --unrestricted --id 'mygraphnical' {
    ...
    linux16 ... elevator=deadline systemd.unit=graphical.target
    ...
    }
    grub2-mkconfig -o /boot/grub2/grub.cfg

    上面大部分数据都是从grub.cfg中已有的menuentry复制来的,新增了id、systemd.unit字段,删除了{与--unrestricted中间的内容。

  • 通过chainloader的方式一脚loader控制权示例:

    将loader控制权转交给在/dev/sda1上的windows:

    vim /etc/grub.d/40_custom
    menuentry "Windows" {
    insmod chain # 载入chainloader模块
    insmod ntfs # 建议加入windows所在的文件系统模块
    set root=(hd0,1) # 是在哪一个分区
    chainloader +1 # 请去boot sector将loader软件读出来的意思
    }
    grub2-mkconfig -o /boot/grub2/grub.cfg

    如果设置MBR,不需要加入文件系统模块,set root为(hd0)

  • 如果有特殊需要所以想重制initramfs文件,可以使用dracut或mkinitrd来处理。CentOS7应该用dracut,不过mkinitrd也有所保留:

    dracut -v initramfs-test.img $(uname -r) # 以dracut的默认功能创建一个initramfs虚拟磁盘文件
    dracut -v --add-drivers "e1000e" --filesystems "ext4 nfs" initramfs-new.img $(uname -r) # 额外加入e1000e网卡驱动与ext4/nfs文件系统在新的initramfs内
    lsinitrd initramfs-new.img | grep -E '(e1000|ext4|nfs)'
  • 测试与安装grub2,用于Linux原来并非使用grub2,指令格式grub2-install [--boot-directory=DIR] INSTALL_DEVICE,其中DIR为实际的目录,默认/boot/grub2,INSTALL_DEVICE为安装的设备代号。如grub2-install /dev/sda。如果要安装到某个partition中grub2-install --force -recheck --skip-fs-probe /dev/sda4

  • 开机在菜单中进入救援模式,在对应的菜单上按e,在linux16那行添加systemd.unit=rescue.target,然后ctrl+x。不过救援模式还是要输入root密码。

  • 设置开机画面使用图形显示方式:

    vim /etc/default/grub
    ...
    GRUB_TERMINAL=gfxterm # 设置主要东终端机显示为图形界面
    GRUB_GFXMODE=1024x768x24 # 图形界面的X,Y,彩度数据
    GRUB_GFXPAYLOAD_LINUX=keep # 保留图形界面,不要使用text
    ...
    grub2-mkconfig -o /boot/grub2/grub.cfg
  • 为个别菜单加上密码:

    grub.cfg会像下面这样:

    set superuser="meyok"
    password meyok abcd1234
    password yang dcba4321
    menuentry "..." --unrestricted {
    ...
    }
    menuentry "..." --users "" {
    ...
    }
    menuentry "..." --users "yang" {
    ...
    }

    这里的用户与linux中的无关。其中设置表明meyok为系统管理员,yang为普通用户,yang无法进入第二个菜单。如果没有加--users也没有--restricted,那么只有系统管理员可以进入该菜单。

    除了使用明文密码,还可使用密文。使用grub2-mkpasswd-pbkdf2生成对应密码的密文,修改/etc/grub.d/01_users中的内容:

    grub2-mkpasswd-pbkdf2
    vim /etc/grub.d/01_users
    cat << eof
    set superuser="meyok"
    password-pbkdf2 meyok grub.pbkdf2.sha512.10000...... # 后面是使用grub2-mkpasswd-pbkdf2指令生成的密文
    password-pbkdf2 yang grub.pbkdf2.sha512.10000......
    chmod a+x /etc/grub.d/01_users
    grub2-mkconfig -o /boot/grub2/grub.cfg

19.4.开机过程的问题解决

  • 忘记root密码,可使用rd.break的核心参数来处理。rd.break是在Ram Disk里面的操作系统状态,因此不能直接取得原本的linux系统操作环境,所以还需要chroot的支持,更有SELinux的问题:在rd.break的Ram Disk环境下,系统是没有SELinux的,更改了/etc/shadow,这个文件的SELinux安全文本的特性将会被取消,加上/.autorelabel让系统在开机的时候自动使用默认的SELinux type重新写入SELinux安全文本到每个文件去。操作过程:

    在菜单上按e,linux16那行添加rd.break,ctrl+x执行,执行指令:

    mount
    mount -o remount,rw /sysroot
    chroot /sysroot
    echo "your_root_new_pw" | passwd --stdin root
    touch /.autorelabel
    exit
    reboot

    不过"加上/.autorelabel让系统在开机的时候自动使用默认的SELinux type重新写入SELinux安全文本到每个文件去"会很耗时,也可这样做:在rd.break模式下,修改完root密码后,将/etc/selinux/config内的SELinux类型改为permissive。重新开机后,使用root下达restorecon -Rv /etc仅修改/etc下面的文件。重新修改/etc/selinux/config,改回enforcing,然后setenforce 1即可。

  • 直接开机就以root执行bash的方法:在linux16那行末尾添加init=/bin/bash即可,执行后就有个bash,不需要root密码且有root权限。但是要完整的操作该系统是不可能的,因为PID一号为bash了,所以更多用在救援方面就是了。同样的,要操作该系统还是得要remount根目录才行mount -o remount,rw /

第二十章 基础系统设置与备份策略

20.1.系统基本设置

  • 使用nmcli这个指令来设置网络参数:

    nmcli connection show
    nmcli connection show eth0
    nmcli connection modify eth0 \
    > connection.autoconnect yes \
    > ipv4.method manual \
    > ipv4.adddresses 172.16.1.1/16 \
    > ipv4.gateway 172.16.200.254 \
    > ipv4.dns 172.16.200.254
    nmcli connection up eth0
    nmcli connection show eth0
    nmcli connection modify eth0 \
    > connection.autoconnect yes \
    > ipv4.method auto \
    nmcli connection up eth0
    nmcli connection show eth0
  • 修改主机名称:

    hostnamectl
    hostnamectl set-hostname www.meyok.top
    cat /etc/hostname
  • 时区设置:

    timedatectl
    timedatectl list-timezones | grep -i new
    timedatectl set-timezone "America/New_York"
    timedatectl
    timedatectl set-timezone "Asia/Shanghai"

20.2.服务器硬件数据的收集

  • 系统有个dmidecode软件,它可以解析CPU型号、主板型号与内存相关得型号等。

  • 核心所侦测到的各项硬件设备,后来就会被记录在/proc与/sys中。但核心侦测到的硬件并非完全正确,因为它仅是使用最适当的模块来驱动这个硬件。

  • lspci、lsusb、iostat

  • 磁盘支持SMART的协定话,可使用smartd服务来了解磁盘的健康状态:

    smartctl -a /dev/sda # 用smartctl来显示完整的/dev/sda信息
    smartctl -t short /dev/sda # 命令磁盘进行一次自我检测的动作,然后再次观察磁盘状态
    smartctl -a /dev/sda

    注意不建议在系统繁忙时进行,因为进行磁盘自我检查时,可能I/O状态较频繁。

20.3.备份要点

  • Linux哪些数据具有备份的意义:
    • 操作系统本身需要备份的文件:/etc//home//var/spool/mail/var/spool/{at|cron}/boot//root/,如果自行安装过其他的软件,那么/usr/local//opt也最好备份一下。
    • 网络服务的数据库方面
      • 软件本身的设置文件,如/etc//usr/local/
      • 软件服务提供的数据,如WWW数据有/var/www整个目录或/srv/www整个目录以及系统使用者主文件夹;Mariadb有/var/lib/mysql整个目录。
      • 其他在Linux主机上面提供的服务之数据库文件。
    • 推荐需要备份的目录:/etc/home/root/var/spool/mail//var/spool/cron//var/spool/at//var/lib
    • 不需要备份的目录:/dev/proc/sys/run/mnt/media/tmp

20.4.备份的种类、频率与工具的选择

  • 备份可以分为积累备份和差异备份:
    • 积累备份:除第一次备份为完整备份后,此后备份都是备份与前一次有差异的文件。常用的工具有ddcpioxfsdump/xfsrestore等。可以通过tar来完整备份。
    • 差异备份:每次备份都是与原始的完整备份比较的结果。可以通过rsync来镜像备份。

20.5.VBird的备份策略与scripts

  • 有些时候,在进行备份时,被备份的文件可能同时被其他的网络服务所修改,所以备份时最好将该服务关掉。

20.6.灾难复原的考虑

第二十一章 软件安装:源代码与Tarball

21.1.开放源码的软件安装与升级简介

  • Linux上面的软件几乎都是经过GPL的授权,所以每个软件几乎均提供原始程序码,并且你可以自行修改该程序码,以符合你个人的需求。
  • /usr/lib
  • 通常软件开发商都会写一支侦测程序来侦测使用者的作业环境,以及该作业环境是否有软件开发商所需要的其他功能,该侦测程序侦测完毕后,就会主动创建这个Makefile的规则文件。通常这支侦测程序的文件名为configure或者是config。
  • 不同版本的核心所使用的系统调用可能不同,而且每个软件所需要的相依函数库也不相同。

21.2.使用传统程序语言进行编译的简单范例

  • Linux默认函数库在/lib、/lib64。默认include头文件在/usr/include。

21.3.用make进行宏编译

  • 相同名环境变量的优先级,从高到低:make命令行、makefile中、shell原本。
  • makefile中$@代表当前target。

21.4.Tarball的管理与建议

  • tarball安装步骤:

    1. 将tarball文件在/usr/local/src目录下解压缩。
    2. 在解压缩后查看INSTALL、README相关内容。
    3. 以自动侦测程序configure或config侦测作业环境,并创建Makefile文件。
    4. 编译并安装。建议是安装到一个独立的目录中,如/usr/local/packages。而且必需手动将这个软件的man page写到/etc/man_db.conf中。
  • 默认情况下,原本的Linux distribution释出安装的软件大多在/usr中,而使用者自行安装的软件则建议放置在/usr/local里。

  • 使用tarball方式安装ntp范例:

    cd /usr/local/src
    tar -zxvf /root/ntp-4.2.8p3.tar.gz
    cd ntp-4.2.8p3
    vi INSTALL
    ./configure --help | more
    ./configure --prefix=/usr/local/ntp --enable-all-clocks --enable-parse-clocks
    make clean; make
    make check
    make install
  • patch指令中的-pxx的xx代表拿掉几个目录的意思。

  • kernel的patch都仅针对与前一个版本而已。

21.5.函数库管理

  • 将常用到的动态函数库载入内存中:

    1. 在/etc/ld.so.conf里面写下想要读入高速缓存内存当中的动态函数库所在的目录。
    2. 利用ldconfig这个可执行文件将/etc/ld.so.conf的数据读入高速缓存当中。
    3. 同时也将数据记录一份在/etc/ld.so.cache这个文件当中。
    vim /etc/ld.so.conf.d/meyok.conf
    /usr/lib64/mysql
    ldconfig
    ldconfig -p
  • 判断某个可执行文件含有什么动态函数库,使用ldd:/usr/bin/passwdldd -v /lib64/libc.so.6

21.6.检验软件的正确性

  • 使用md5sum/sha1sum/sha256sum进行指纹校验,可查看官网对应的指纹数据进行比对。如md5sum ntp-4.2.8p3.tar.gz

第二十二章 软件安装RPM、SRPM与YUM

22.1.软件管理员简介

  • RPM是以一种数据库记录的方式来将你所需要的软件安装到你的Linux系统的一套管理机制。

22.2.RPM软件管理程序:rpm

  • RPM文件在安装完毕后,该软件相关的信息就会被写入/var/lib/rpm目录下的数据库文件中。

  • rpm安装示例:

    rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.e17.x86_64.rpm
    rpm -ivh http;//website.name/path/pkgname.rpm

    rpm升级与更新,使用-Uvh参数或-Fvh参数。

    rpm查询rpm -qa

22.3.YUM线上升级机制

22.4.SRPM的使用:rpmbuild(Optional)

第二十三章 X Window设置介绍

23.1.什么是X Window System

23.2.X Server配置文件解析与设置

23.3.显卡驱动程序安装范例

第二十四章 Linux核心编译与管理

24.1.编译前的任务:认识核心与取得核心源代码

24.2.核心编译的前处理与核心功能选择

24.3.核心的编译与安装

24.4.额外(单一)核心模块编译

24.5.以最新核心版本编译CentOS7.x的核心


  1. 鳥哥.鳥哥的 LINUX 私房菜:基礎學習篇[M].台灣:碁峰資訊股份有限公司,2016-01-27:1-1158. ↩︎

posted @   MeYokYang  阅读(285)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示