《linux鸟哥的私房菜》笔记(下)

717 阅读15分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

前言

接续上一篇文章,本篇内容很多,请耐心观看。

上一篇地址:juejin.cn/post/700103…

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

  • 磁盘组成和分区复习

    • 请看第一章对于磁盘的记录
    • GPT和MBR分区
    • 磁盘组成
  • 文件系统的特性

    • Linux正统文件系统为ext2
      • windows 不支持 ext2 文件系统
    • 通常一个可挂载的数据为一个文件系统而不是分区
      • 通常将文件权限和文件属性放在不同的区块
        • 权限和属性放到inode
        • 实际数据放到数据区块
      • 每个inode都有编号
        • 超级区块
          • 文件系统的整体信息,inode 数据区块的总量,使用量,剩余量,文件系统的格式和相关信息
        • inode 记录文件的属性,一个文件占用一个inode, 记录文件的数据所在区块号码
        • 数据区块:实际记录的文件内容,文件过大会占用多个区块
      • 这种方式是索引式文件系统
      • ext2 的限制
        • 区块的大小和数量格式化之后不能修改
        • 每个区块最多防止一个文件的数据
        • 承上,如果文件大于区块,占用多个区块
        • 承上,反之,剩余空间会被浪费
    • inode table
      • inode 记录如下
        • 读写属性
        • 拥有者和用户组
        • 文件大小
        • 建立或者状态改变的时间 ctime
        • 最后一次读取时间
        • 最后修改时间
        • 定义文件的标识
        • 文件真正的内容指向
      • 特点
        • 每个inode 大小固定128B (ext4 到了 256B)
        • 文件占用一个 inode
        • 建立文件数量和inode数量有关
        • 读取文件需要先找到inode, 分析Inode 记录的权限和用户是否符合,符合才可以读取
      • 1KB的块最大单一文件限制为16GB是如何计算的?
        • 12个直接、一个间接、一个三间接
        • 12个直接指向 12 * 1 K = 12 K
        • 间接 256*1K = 256K
        • 1的大小可以存256条记录
        • 双间接
          • 256*256* 1K = 256*2K
        • 三间接
          • 256 * 256 * 256
        • 总额,三者相加 = 12 + 256 +256 * 256 + 256 * 256 * 256 = 16GB
    • 超级区块
      • 主要信息
        • 数据区块 和 inode 总量
        • 未使用和已经使用的inode 数量
        • 数据区块的inode 大小
        • 文件系统的挂载时间、最近一次的写入数据时间、最近一次检验磁盘时间、文件系统的信息
        • 一个有效数值、如果此文件已经被挂载,有效为0,否则为1
      • 区块对照表
      • inode 对照表
      • dump2fs
  • 和目录树的关系

    • 读取一个文件路径的底层步骤
    • 例子
      • 读取/etc/passwd 的流程如下
        • / 的 inode
        • / 的区块
        • etc/ 的 inode
        • etc/ 的区块
        • passwd 的 inode
        • passwd 的 区块
  • ext 文件的存取和日志式文件系统功能

    • 新增文件系统操作
      • 确定是否有w和x权限
      • 根据inode 对照表找到对应的inode号码,新文件写入
      • 根据区块对照表找到没有使用的区块代码,将实际的数据写入区块,更新inode的区块数据
      • 将刚刚写入的inode 与区块数据同步更新inode对照表和区块对照表,并更新超级区块的内容
      • 同步操作
    • 日志式文件系统
      • 预备:写入一个文件的时候,需要日志记录区块记录某个文件要写入的信息
      • 实际写入:开始写入文件权限和数据,更新Metadata 的数据
      • 结束:完成数据和metadata的更新,在日志记录区块记录
  • Linux文件系统的执行

    • 异步处理
      • 没被修改的数据设置为clear
      • 被修改后,设置为脏数据
      • 此时操作还在进行,没有写入磁盘
    • 文件系统贺内存的关系
      • 系统会常用文件数据放到内存缓冲区,加速读写
      • Linuxd物理内存最后都会用光,这才是正常 情况
      • 手动sync 强制内存脏数据回写磁盘
      • 正常关机,会主动sync回写磁盘
      • 不正常关机,需要重启之后磁盘校验,甚至文件系统的损坏
  • 挂载点的意义

    • 传统文件系统:
      • ext2
      • minix
      • fat
      • iso9660
    • 日志式文件系统
      • ext3
      • ext4
      • reiserFs
      • windows ntfs
      • ibm jfs
      • sgi xfs
      • zfs
    • 网络文件系统
      • nfs
      • smbfs
    • 查询
      • ls -l /lib/moudules/$(uname -r)/kernel/fs
      • cat /proc/filesystems
    • linux VFS
  • XFS 文件系统

    • ext的问题
      • 支持面最广,格式化最慢
    • 数据区
      • inode 容量可以调整
      • 实际最高可使用区块为4K
      • inode 可以再 256b - 2MB
    • 文件系统活动登录区
    • 实时运行区
    • 查看命令
      • xfs_info 挂载点|设备
        • xfs_info /dev/vda2
        • df -T /boot
  • 文件系统的简单操作

    • 磁盘和目录的容量
      • df
        • 列出文件系统的整体磁盘使用量
        • 参数
          • -a 列出所有文件系统
          • -k kbyte 显示文件系统容量
          • -m mbbyte 显示文件系统容量
          • -h 以人们较容易阅读的Gbyte,mbyte,kbyte 等格式自行显示
          • -H 以 M=1000K 替换 M=1024K进位方式
          • -T 连同磁盘分区文件系统名称也列出
          • -i 不用磁盘容量,inode 数量显示
        • 格式
          • Filesystem: 文件系统是哪个硬盘分区
          • 1K-blocks:说明下面的数字是1KB
          • Used:使用掉的
          • Available:剩下的磁盘大小
          • Use%:使用率,如果大于90%注意一下
          • mounted on:磁盘的挂载目录
        • 案例
          • df -aT
            • 列出系统内所有特殊文件以及名称都列出来
          • df -h
            • 易读方式读取
      • du
        • 查看文件系统的磁盘使用量(常用在查看目录所占用磁盘空间)
        • 参数
          • -a 列出所有的文件和目录容量,因为默认仅仅是统计目录下面的文件量
          • -h 易读的方式显示
          • -s 仅仅李处总量,列出各个的目录占用量
          • -S 不包含子目录下面的总计,与-s有点差别
          • -k kb 列出
          • -m mb列出
        • 案例
          • du
          • du -sm /*
  • 硬链接和符号链接

    • 回顾

      • 每个文件占用一个inode
      • 读取文件必须要inode号码
    • 硬链接知识某个目录增加一个文件名链接到Inode的关联记录

    • 任何一个Inode硬链接删除,都不会影响另一个文档

    • 缺点:

      • 不能链接目录
        • 为什么?
      • 不能跨文件系统
        • 为什么?
    • 符号链接

      • 特点

        • 相当于windows 快捷方式,但是改变这个快捷方式的内容会直接影响源文档的内容
        • 相当于文件引用的完全拷贝
        • 如果源文件删除,引用会找不到内容
      • 符号链接的容量计算

        • 根据引用对象文件名字长度来确定
      • Ln 默认使用硬链接

      • 参数

        • ln
          • -s 符号链接,如果建立必须此参数
          • -f 如果文件存在,删除后建立
  • 磁盘的格式化、分区、校验、挂载

    • 新增磁盘的做法

      • 对磁盘划分,建立可用分区
      • 对于磁盘进行格式化,建立分区可用文件系统
      • 仔细一点,则对于文件系统校验,
      • Linux 上需要建立挂载点,挂载上来
    • 如何知道自己的系统的文件系统

      • lsblk device

      • 选项与参数: -d :仅列出磁盘本身,并不会列出该磁盘的分区数据 -f :同时列出该磁盘内的文件系统名称 -i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用) -m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据) -p :列出该装置的完整文件名!而不是仅列出最后的名字而已。 -t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等

      • 显示列解读

         NAME:就是装置的文件名啰!会省略 /dev 等前导目录!  MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!  RM:是否为可卸除装置 (removable device),如光盘、USB 磁盘等等  SIZE:当然就是容量啰!  RO:是否为只读装置的意思  TYPE:是磁盘 (disk)、分区槽 (partition) 还是只读存储器 (rom) 等输出  MOUTPOINT:就是前一章谈到的挂载点

      • 案例

        • lsblk -ip /dev/vda
    • blkid 列出设备的 UUID等参数

    • parted 列出磁盘的 分区 表类型与 分区

      • parted /dev/vda print

      • Model: Virtio Block Device (virtblk)
        Disk /dev/vda: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos
        Disk Flags: 
        
        Number  Start   End     Size    Type     File system  标志
         1      1049kB  42.9GB  42.9GB  primary  ext4         启动
        
        
        
    • 磁盘分区:gdisk / fdisk

      • MBR 分区表请使用 fdisk 分区, GPT 分区表请 使用 gdisk 分区!

      • gdisk

        • gdisk 设备名称

        • 显示参数

           Number:分区槽编号,1 号指的是 /dev/vda1 这样计算。  Start (sector):每一个分区槽的开始扇区号码位置  End (sector):每一个分区的结束扇区号码位置,与 start 之间可以算出分区槽的总容量  Size:就是分区槽的容量了  Code:在分区槽内的可能的文件系统类型。Linux 为 8300,swap 为 8200。不过这个项目只是一个提示而 已,不见得真的代表此分区槽内的文件系统喔!  Name:文件系统的名称等等。

      • 注意不要加数字

      • gdisk 新增分区

        • cat /proc/partitions
      • partprobe 更新 linux 内核的分区表信息

        • partprobe -s 需要root权限
        • 查看内核分区记录
          • cat /proc/partitions
      • 用gdisk 删除一个分区

    • fdisk

      • fdisk /dev/vda

        a toggle a bootable flag
        b edit bsd disklabel
        c toggle the dos compatibility flag
        d delete a partition <==删除一个 partition
        l list known partition types
        m print this menu
        n add a new partition <==新增一个 partition
        o create a new empty DOS partition table
        p print the partition table <==在屏幕上显示分区表
        q quit without saving changes <==不储存离开 fdisk 程序
        s create a new empty Sun disklabel
        t change a partition's system id
        u change display/entry units
        v verify the partition table
        w write table to disk and exit <==将刚刚的动作写入分区表
        x extra functionality (experts only)
        
  • 磁盘格式化

    • xfs 文件系统 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 。
      
    • 其他

      范例:找出你系统的 CPU 数,并据以设定你的 agcount 数值
      [root@study ~]#  grep  'processor' /proc/cpuinfo
      processor : 0
      processor : 1
      # 所以就是有两颗 CPU 的意思,那就来设定设定我们的 xfs 文件系统格式化参数吧!!
      [root@study ~]#  mkfs.xfs - - f - - d agcount=2 /dev/vda4
      meta-data=/dev/vda4 isize=256 agcount=2, agsize=131072 blks
      = sectsz=512 attr=2, projid32bit=1
      = crc=0 finobt=0
      .....(底下省略).....
      # 可以跟前一个范例对照看看,可以发现 agcount 变成 2 了喔!
      # 此外,因为已经格式化过一次,因此 mkfs.xfs 可能会出现不给你格式化的警告!因此需要使用 -f
      
    • ext4 文件系统mkfs.ext4

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

        选项与参数: -b :设定 block 的大小,有 1K, 2K, 4K 的容量, -L :后面接这个装置的标头名称

    • 其他文件系统 mkfs

  • 文件系统检验

    • xfs_repair 处理 XFS 文件系统

      • xfs_repair [ - fnd] 装 置名
      选项与参数:
      -f :后面的装置其实是个文件而不是实体装置
      -n :单纯检查并不修改文件系统的任何数据 (检查而已)
      -d :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用
      
      • 案例
       xfs_repair /dev/vda4
       
       范例:检查一下系统原本就有的 /dev/centos/home 文件系统
      [root@study ~]#  xfs_repair /dev/centos/home
      
    • fsck.ext4 处理 EXT4 文件系统

      fsck.ext4 [ - pf] [ - b superblock]  装 置名 称
      
      选项与参数:
      -p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
      -f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入
      细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
      -D :针对文件系统下的目录进行优化配置。
      -b :后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblock 因故损毁时,
      透过这个参数即可利用文件系统内备份的 superblock 来尝试救援。一般来说,superblock 备份在:
      1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768
      
    • 只有在极度严重的问题才使用这些命令

    • 文件系统挂载与卸除

      • 前提

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

        • 案例
        [root@study ~]#  mount - -a a
        [root@study ~]#  mount [- - l]
        [root@study ~]#  mount [- - t  文件系 统 ] LABEL='' 挂 载点
        [root@study ~]#  mount [- - t  文件系 统 ] UUID='' 挂 载点 # 鸟哥近期建议用这种方式喔!
        [root@study ~]#  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: 重新挂载,这在系统出错,或重新更新参数时,很有用!
        
        • /etc/filesystems:系统指定的测试挂载文件系统类型的优先级;
        • /proc/filesystems:Linux 系统已经加载的文件系统类型
      • 我们 Linux 支持的文件系统之驱动程序都写在如下的目录中

        • /lib/modules/$(uname -r)/kernel/fs/
    • 挂载 xfs/ext4/vfat

      • 范例
      范例:找出 /dev/vda4 的 UUID 后,用该 UUID 来挂载文件系统到 /data/xfs 内
      [root@study ~]#  blkid /dev/vda4
      /dev/vda4: UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" TYPE="xfs"
      
      [root@study ~]#  mount UUID="e0a6af55- - 26e7- - 4cb7- - a515- - 826a8bd29e90" /data/xfs
      mount: mount point /data/xfs does not exist # 非正规目录!所以手动建立它!
      [root@study ~]#  mkdir - - p /data/xfs
      [root@study ~]#  mount UUID="e0a6af55- - 26e7- - 4cb7- - a515- - 826a8bd29e90" /data/xfs
      [root@study ~]#  df /data/xfs
      Filesystem 1K-blocks Used Available Use% Mounted on
      /dev/vda4 1038336 32864 1005472 4% /data/xfs
      
      # 顺利挂载,且容量约为 1G 左右没问题!
      范例:使用相同的方式,将 /dev/vda5 挂载于 /data/ext4
      [root@study ~]#  blkid /dev/vda5
      /dev/vda5: UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" TYPE="ext4"
      [root@study ~]#  mkdir /data/ext4
      [root@study ~]#  mount UUID="899b755b- - 1da4- - 4d1d- - 9b1c- - f762adb798e1" /data/ext4
      [root@study ~]# 
      
    • 挂载 cd 或者 dvd

      范例:将你用来安装 Linux 的 CentOS 原版光盘拿出来挂载到 /data/cdrom!
      [root@study ~]#  blkid
      .....(前面省略).....
      /dev/sr0: UUID="2015-04-01-00-21-36-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
      [root@study ~]#  mkdir /data/cdrom
      [root@study ~]#  mount /dev/sr0 /data/cdrom
      mount: /dev/sr0 is write-protected, mounting read-only
      [root@study ~]#  df /data/cdrom
      Filesystem 1K-blocks Used Available Use% Mounted on
      /dev/sr0 7413478 7413478 0 100% /data/cdrom
      # 怎么会使用掉 100% 呢?是啊!因为是 DVD 啊!所以无法再写入了啊!
      
    • 挂载 vfat 中文随身碟 (USB

      • 案例
      • 注意:不能够是 NTFS 的文件系统
      范例:找出你的随身碟装置的 UUID,并挂载到 /data/usb 目录中
      [root@study ~]#  blkid
      /dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
      [root@study ~]#  mkdir /data/usb
      [root@study ~]# mount - - o codepage=950,iocharset=utf8 UUID="35BC- - 6D6B" /data/usb
      [root@study ~]#  # mount - - o codepage=950,iocharset=big5 UUID="35BC- - 6D6B" /data/usb
      [root@study ~]#  df /data/usb
      Filesystem 1K-blocks Used Available Use% Mounted on
      /dev/sda1 2092344 4 2092340 1% /data/usb
      
      • 重新挂载根目录与挂载不特定目录

        • 案例
        范例:将 / 重新挂载,并加入参数为 rw 与 auto
        [root@study ~]# mount - - o remount,rw,auto /
        
        范例:将 /var 这个目录暂时挂载到 /data/var 底下:
        [root@study ~]#  mkdir /data/var
        [root@study ~]#  mount  -- bind /var /data/var
        [root@study ~]#  ls - - lid /var  /data/var
        16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /data/var
        16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /var
        # 内容完全一模一样啊!因为挂载目录的缘故!
        [root@study ~]#  mount | grep var
        
    • umount ( 将装置 文件 卸除)

      • 案例
      [root@study ~]#  umount [- - fn]  装 置文件名或挂 载点
      选项与参数:
      -f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
      -l :立刻卸除文件系统,比 -f 还强!
      -n :不更新 /etc/mtab 情况下卸除。
      就是直接将已挂载的文件系统给他卸除即是!卸除之后,可以使用 df 或 mount 看看是否还存在目
      录树中? 卸除的方式,可以下达装置文件名或挂载点,均可接受啦!底下的范例做看看吧!
      范例:将本章之前自行挂载的文件系统全部卸除:
      [root@study ~]#  mount
      .....(前面省略).....
      /dev/vda4 on /data/xfs type xfs (rw,relatime,seclabel,attr2,inode64,logbsize=256k,sunit=512,..)
      /dev/vda5 on /data/ext4 type ext4 (rw,relatime,seclabel,data=ordered)
      /dev/sr0 on /data/cdrom type iso9660 (ro,relatime)
      /dev/sda1 on /data/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=950,iocharset=...)
      /dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
      # 先找一下已经挂载的文件系统,如上所示,特殊字体即为刚刚挂载的装置啰!
      # 基本上,卸除后面接装置或挂载点都可以!不过最后一个 centos-root 由于有其他挂载,
      # 因此,该项目一定要使用挂载点来卸除才行!
      [root@study ~]#  umount /dev/vda4 <==用装置文件名来卸除
      [root@study ~]#  umount /data/ext4 <==用挂载点来卸除
      [root@study ~]#  umount /data/cdrom <==因为挂载点比较好记忆!
      [root@study ~]#  umount /data/usb
      [root@study ~]#  umount /data/var <==一定要用挂载点!因为装置有被其他方式挂载
      
      
  • 磁盘 文件系统参数自定义

    • mknod

      • 就是透过文件的 major 与 minor 数值来替代的
      • 手动处理装置文件案例
      [root@study ~]#  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
      brw-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 喔!^_^
      [root@study ~]#  rm /dev/vda10 /tmp/testpipe
      rm: remove block special file '/dev/vda10' ? y y
      rm: remove fifo '/tmp/testpipe' ? y y
      
      • xfs_admin 修改 XFS 文件系统的 UUID 与 Label name

        • 案例
        xfs_admin [-lu] [-L label] [-U uuid] 设备文件
        选项与参数:
        -l :列出这个装置的 label name
        -u :列出这个装置的 UUID
        -L :设定这个装置的 Label name
        -U :设定这个装置的 UUID 喔!
        
      • tune2fs 修改 ext4 的 label name 与 UUID

        [root@study ~]#  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)
        
    • 设定开机挂载

      • 系统挂载的一些限制

        • 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。

        • 其它 mount point 必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则 (FHS)

        • 所有 mount point 在同一时间之内﹐只能挂载一次。

        • 所有 partition 在同一时间之内﹐只能挂载一次。

        • 如若进行卸除﹐您必须先将工作目录移到 mount point(及其子目录) 之外

      • 查看

        • cat /etc/fstab
        • 描述信息如下:
        [装置/UUID 等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
        
        • 解释
          • 第一栏:磁盘装置文件名/UUID/LABEL name:
            • 文件系统或磁盘的装置文件名,如 /dev/vda2 等
            • 文件系统的 UUID 名称,如 UUID=xxx
            • 文件系统的 LABEL 名称,例如 LABEL=xxx
          • 第二栏:挂载点 (mount point)::
          • 第三栏:磁盘分区槽的文件系统:
          • 第四栏:文件系统参数:
          • 第五栏:能否被 dump 备份指令作用:
          • 第六栏:是否以 fsck 检验扇区:
  • 特殊装置 loop 挂载

    • 挂载光盘/DVD 映象文件
    • 大型文件的格式化
    • 挂载
  • 内存置换空间(swap)

    • 使用实体 分区置 槽建置 swap
      • 基本步骤
        1. 分区:先使用 gdisk 在你的磁盘中分区出一个分区槽给系统作为 swap 。由于 Linux 的 gdisk 预设会将分 区槽的 ID 设定为 Linux 的文件系统,所以你可能还得要设定一下 system ID 就是了。
        2. 格式化:利用建立 swap 格式的『mkswap 装置文件名』就能够格式化该分区槽成为 swap 格式啰
        3. 使用:最后将该 swap 装置启动,方法为:『swapon 装置文件名』。
        4. 观察:最终透过 free 与 swapon -s 这个指令来观察一下内存的用量吧!
  • 使用 文件置 建置 swap

    • 透过一个案例学习
      1. 使用 dd 这个指令来新增一个 128MB 的文件在 /tmp 底下:
      2. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式
      3. 使用 swapon 来将 /tmp/swap 启动啰!
      4. 使用 swapoff 关掉 swap file,并设定自动启用
  • 文件系统的特殊观察与操作

    • 磁盘空间之浪费问题
    • 利用 GNU 的 parted 进行 分区 行为(Optional)
    • parted 可以直接在一行指令列就完成分区,是一个非常好用的指令!它常用的语法如下:
    [root@study ~]#  parted [ 装 置 ] [ 指令 [ [ 参数 ]]
    选项与参数:
    指令功能:
    新增分区:mkpart [primary|logical|extended] [ext4|vfat|xfs] 开始 结束
    显示分区:print
    删除分区:rm [partition]
    范例一:以 parted 列出目前本机的分区表资料
    [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 <==是 GPT 还是 MBR 分区
    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
    4 33.3GB 34.4GB 1074MB xfs Linux filesystem
    5 34.4GB 35.4GB 1074MB ext4 Microsoft basic data
    6 35.4GB 36.0GB 537MB linux-swap(v1) Linux swap
    [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
    
    • 显示参数的意义
    1. Number:这个就是分区槽的号码啦!举例来说,1 号代表的是 /dev/vda1 的意思;
    2. Start:分区的起始位置在这颗磁盘的多少 MB 处?有趣吧!他以容量作为单位喔!
    3. End:此分区的结束位置在这颗磁盘的多少 MB 处?
    4. Size:由上述两者的分析,得到这个分区槽有多少容量;
    5. File system:分析可能的文件系统类型为何的意思!
    6. Name:就如同 gdisk 的 System ID 之意。
    
    • 案例
      • 使用parted 将 mbr 分区表改成 gpt
        • 非常危险,无法还原

第八章 文件和文件系统的压缩

  • 压缩文件的用途和技术

  • Linux 常见的压缩命令

    • gzip , zcat 、zmore、zless、zgrep

      • 语法

        • gzip [-cdtv] 文件名
        • zcat 文件名.gz
        选项与参数:
        -c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;
        -d :解压缩的参数;
        -t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
        -v :可以显示出原文件/压缩文件案的压缩比等信息;
        -# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6
        
      • egrep 查找

    • bzip2, bzcat/bzmore/bzless/bzgrep

      • 对于gzip 的升级
      • 优点
        • 比gzip 压缩率更好
      • 缺点
        • 时间要更久
    • xz, xzcat/xzmore/xzless/xzgrep

      • 优点
        • 比bzip2 压缩率还要好
      • 缺点
        • 很慢
  • 打包命令(常用)

    • 选项和参数
    选项与参数:
    -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 后面要立刻接要被处理的档名!建议 -f 单独写一个选项啰!(比较不会忘记)
    -C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
    其他后续练习会使用到的选项介绍:
    -p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
    -P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
    --exclude=FILE:在压缩的过程中,不要将 FILE 打包!
    
    • 常用如下命令
      • 压缩tar -jcv -f filename.tar.bz2 文件或者目录名称
      • 查询 tar -jtv filename.tar.bz2
      • 解压缩 tar -jxv -f filename.tar.bz2 要解压的地方
    • 案例
      • 压缩 /etc 下面的文件,查看优点特殊的地方
      • 为什么要去掉 / 根目录路径?
      • 如果要tar 里面加上这个根路径,要怎么做?
      • 备份数据解压缩,并且到特定的目录下面
        • 如何指定要解开的目录
    • 只解开单一文件的办法
      • 先查找文档名称
        • tar - - jtv - - f /root/etc.tar.bz2 | grep 'shadow'
    • 打包某目录,但不含该目录下的某些 文件
      • --exclude 参数用法
    • 仅备份比某个时刻还要新的 文件
      • 先使用搜索找到对应的文件
      • tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2015/06/07" /etc/*
    • 利用管道一遍打包一遍备份
      • tar -cvf - /etc | tar -xvf -
        • 注意 - 代表输入和输出
    • 例题:系统备份的案例
      • 结合上面所学。使用过滤方式备份数据
    • 解压缩后的 SELinux
      • 可能影响系统配置
  • XFS 文件系统的备份与还原

    • 使用备份命令 xfs_dump

      • 备份行为可以累积,类似SVN的手法,新建备份只新增差异文件
      • 限制
        • 文件系统必须挂载
        • xfsdump 必须使用 root 的权限才能操作 (涉及文件系统的关系)
        • xfsdump 只能备份 XFS 文件系统啊!
        • xfsdump 备份下来的数据 (文件或储存媒体) 只能让 xfsrestore 解析
        • xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同 UUID 的文件系统 喔!
        • xfsdump 预设仅支持文件系统的备份,并不支持特定目录的备份
    • 使用方法

      • xfsdump [- - L S_label] [- - M M_label] [- - l #] [- - f 备 份 档 ] 待 备 份 资
      • 选项和参数
      选项与参数:
      -L :xfsdump 会纪录每次备份的 session 标头,这里可以填写针对此文件系统的简易说明
      -M :xfsdump 可以纪录储存媒体的标头,这里可以填写此媒体的简易说明
      -l :是 L 的小写,就是指定等级~有 0~9 共 10 个等级喔! (预设为 0,即完整备份)
      -f :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 装置文件名或其他一般文件档名等
      -I :从 /var/lib/xfsdump/inventory 列出目前备份的信息状态
      
      • 案例

      • 累积备份

  • XFS 文件系统还原 xfsrestore

    • 占位,等安装对应系统再来
  • 用 xfsrestore 观察 xfsdump

    • 简单复原 level 0 的文件系统
    • 复原累积备份资料
    • 仅还原部分 文件的 的 xfsrestore 互动模式
  • 光盘写入工具

    • 了解即可
  • 其他常见的压缩和备份工具

    • dd

      • 作用
        • dd 可以读取磁盘装置的内容,然后将整个装置备份成一个文件呢
      • 使用方法
        • dd if="input_file" of="output_file" bs="block_size" count="number"
      • 选项和参数
      选项与参数:
      if :就是 input file 啰~也可以是装置喔!
      of :就是 output file 喔~也可以是装置;
      bs :规划的一个 block 的大小,若未指定则预设是 512 bytes(一个 sector 的大小)
      count:多少个 bs 的意思。
      
      • 案例
        • 范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
          • dd if=/etc/passwd of=/tmp/passwd.back
        • 范例二:将刚刚刻录的光驱的内容,再次的备份下来成为映像挡
        • 范例三:假设你的 USB 是 /dev/sda 好了,请将刚刚范例二的 image 刻录到 USB 磁盘中
        • 范例四:将你的 /boot 整个文件系统透过 dd 备份下来
      • 例题:
      你想要将你的 /dev/vda2 进行完整的复制到另一个 partition 上,请使用你的系统上面未分区完毕的容量再建立一
      个与 /dev/vda2 差不多大小的分区槽 (只能比 /dev/vda2 大,不能比他小!),然后将之进行完整的复制 (包括需
      要复制 boot sector 的区块)。
      答:
      因为我们的 /dev/sda 也是个测试的 USB 磁盘,可以随意恶搞!我们刚刚也才测试过将光盘映像文件给它复制进
      去而已。 现在,请你分区 /dev/sda1 出来,然后将 /dev/vda2 完整的拷贝进去 /dev/sda1 吧!
      
      • 注意点
        • 需要注意dd 连同 uuid 一起复制,如果要复制两块完全相同的硬盘,需要重新定义一下 uuid
  • cpio

    • 作用

      • cpio 可以备份任何东西,包括装置设备文件
      • 暂时只记住语法即可
    • 缺点

      • 不会主动去找文件,需要find 找到文件才能备份
    • 语法

    [root@study ~]#  cpio - - ovcB > [file|device] <==备份
    [root@study ~]#  cpio - - ivcdu < [file|device] <==还原
    [root@study ~]#  cpio - - ivct < [file|device] <==察看
    备份会使用到的选项与参数:
    -o :将数据 copy 输出到文件或装置上
    -B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes !
    这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
    还原会使用到的选项与参数:
    -i :将数据自文件或装置 copy 出来系统当中
    -d :自动建立目录!使用 cpio 所备份的数据内容不见得会在同一层目录中,因此我们
    必须要让 cpio 在还原时可以建立新目录,此时就得要 -d 选项的帮助!
    -u :自动的将较新的文件覆盖较旧的文件!
    -t :需配合 -i 选项,可用在"察看"以 cpio 建立的文件或装置的内容
    一些可共享的选项与参数:
    -v :让储存的过程中文件名可以在屏幕上显示
    -c :一种较新的 portable format 方式储存
    

练习题

  • 情境模拟题一:请将本章练习过程中产生的不必要的文件删除,以保持系统容量不要被恶搞!

  • 情境模拟题二:你想要逐时备份 /home 这个目录内的数据,又担心每次备份的信息太多, 因此想要使用 xfsdump 的方式来逐一备份数据到 /backups 这个目录下。该如何处理? o 目标:了解到 xfsdump 以及各个不同 level 的作用; o 前提:被备份的资料为单一 partition ,亦即本例中的 /home 实际处理的方法其实还挺简单的!我们可以这样做看看:

  • 情境模拟三:假设过了一段时间后,妳的 /home 变的怪怪的,妳想要将该 filesystem 以刚刚的备份数据还 原, 此时该如何处理呢?妳可以这样做的:

    ​ 由于 /home 这个 partition 是用户只要有登入就会使用,因此你应该无法卸除这个东西!因此,你必 须要注销所有一般用户, 然后在 tty2 直接以 root 登入系统,不要使用一般账号来登入后 su 转成 root ! 这样才有办法卸除 /home 喔!

第九章 Vim编辑器

  • vi 和 vim

  • 为什么要学习vi 和vim

    • 内置命令会使用
    • unix 基本都会自带
    • 方便简单
    • 功能强大
  • vi使用方法

    • 三种模式
      • 一般命令模式 +
      • 编辑模式
      • 命令行模式
  • 注意

    • 一般指令模式可与编辑模式及指令列模式切换, 但编辑模式与指令列 模式之间不可互相切换喔
  • 简单案例

    • 使用『 vi filename 』进入一般指令模式
    • 使用 i 进入编辑模式
    • 使用esc 退出到一般命令模式
    • :wq 进行保存
  • 常用操作

    • 一般模式

      • hjkl 可以进行上下左右的移动

      • ctrl + f ctrl + b 上下移动一页

      • / 查找 继续按下n继续查找

      • 0 或者 home

      • $ 或者 end

      • gg 跳到第一行

      • n(数字) enter 光标下移 N 行

      • :n1,n2s/word1/word2/g

        • n1 与 n2 为数字。在第 n1 与 n2 列之间寻找 word1 这个字符串,并将该字符串取代 为 word2 !举例来说,在 100 到 200 列之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』。(常用)
      • :1,$s/word1/word2/gc

        • 从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显 示提示字符给用户确认 (confirm) 是否需要取代!(常用)
      • :1,$s/word1/word2/g

        • 从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
      • x 退出但是不改变时间

      • dd 删除一行

      • yy 复制一行

      • nyy 复制多行 如3yy

      • u 恢复前一个操作

      • ctrl + r 重做上一个动作

      • . 重复上一个动作

    • 编辑模式

      • i I 插入模式

        • i 为『从目前光标所在处插入』
        • I 为『在目前所在列的第一个非空格符处开始插入】
      • a 和 A

        • a 为『从目前光标所在的下一个字符处开始插入』
        • A 为『从光标所在列的最后一个字符处开始插入』
      • o 和 O

      • r 和 R

    • 命令模式

      • w
      • q
      • !
    • 实际案例,实际操作的例子

1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录;
2. 进入 vitest 这个目录当中;
3. 将 /etc/man_db.conf 复制到本目录底下(或由上述的连结下载 man_db.conf 文件);
4. 使用 vi 开启本目录下的 man_db.conf 这个文件;
5. 在 vi 中设定一下行号;
6. 移动到第 43 列,向右移动 59 个字符,请问你看到的小括号内是哪个文字?
7. 移动到第一列,并且向下搜寻一下『 gzip 』这个字符串,请问他在第几列?
8. 接着下来,我要将 29 到 41 列之间的『小写 man 字符串』改为『大写 MAN 字符串』,并且一个一个挑
选是否需要修改,如何下达指令?如果在挑选过程中一直按『y』, 结果会在最后一列出现改变了几个 man
呢?
9. 修改完之后,突然反悔了,要全部复原,有哪些方法?
10. 我要复制 66 到 71 这 6 列的内容(含有 MANDB_MAP),并且贴到最后一列之后;
11. 113 到 128 列之间的开头为 # 符号的批注数据我不要了,要如何删除?
12. 将这个文件另存成一个 man.test.config 的檔名;
13. 去到第 25 列,并且删除 15 个字符,结果出现的第一个单字是什么?
14. 在第一列新增一列,该列内容输入『I am a student...』;
15. 储存后离开吧!
  • vim 缓存处理办法

    • 问题
      • 问题一:可能有其他人或程序同时在编辑这个文件:
      • 问题二:在前一个 vim 的环境中,可能因为某些不知名原因导致 vim 中断 (crashed):
  • vim 的额外功能

  • 可视区块

    • v 开始反白
    • V 行反白
    • y 反白复制
    • d 反白删除
  • 多文件编辑

    • :n 编辑下一个文件
    • :N 编辑上一个文件
    • :files 列出目前这个vim 开启的所有文件
    • 案例
      • 多文件编辑
  • 多窗口功能

    • :sp {filename}
      • 存在文件名对比文件,
      • 否则新建一个窗口用于对比
    • 利用 ctrl + w + 上 或者 ctrl + w + 下 来切换窗口
  • vim 关键词补全

    • 快捷键使用
      • [ctrl]+x -> [ctrl]+n 透过目前正在编辑的这个『文件的内容文字』作为关键词,予以补齐
      • [ctrl]+x -> [ctrl]+f 以当前目录内的『文件名』作为关键词,予以补齐
      • [ctrl]+x -> [ctrl]+o 以扩展名作为语法补充,以 vim 内建的关键词,予以补齐
  • vim 环境设定与记录: ~/.vimrc, ~/.viminfo

  • vim 常用图

    • 查看图片
  • 其他vim 注意事项

    • 中文乱码
    • dos 和 linux 换行
      • dos2nnix
      • unix2dos
  • 语系编码转换

    • iconv -f big5 -t utf8 vi.big5 -o vi.utf8
    • iconv -f utf8 -t big5 vi utf8 | \

练习题

  • 在第七章的情境模拟题二的第五点,编写 /etc/fstab 时,当时使用 nano 这个指令, 请尝试使用 vim 去编 辑 /etc/fstab ,并且将第七章新增的那一列的 defatuls 改成 default ,会出现什么状态? 离开前请务必要 修订成原本正确的信息。此外,如果将该列批注 (最前面加 #),你会发现字体颜色也有变化喔!
  • 尝试在你的系统中,你惯常使用的那个账号的家目录下,将本章介绍的 vimrc 内容进行一些常用设定,包 括: o 设定搜寻高亮度反白 o 设定语法检验启动 o 设定默认启动行号显示 o 设定有两行状态栏 (一行状态+一行指令列) :set laststatus=2

第十章 认识 BASH 这个 Shell

  • 简单认识shell

    • 什么是shell?
      • 广义:就是指可以调动内核和硬件打交道的一个壳程序
      • 狭义:通过内核指挥硬件工作的命令程序
    • 为什么要学习shell?
      • 防止突发情况
      • 个人提升
      • 公司要求
      • 某些特殊情况只能使用shell去解决
    • 不学习shell会怎么样
      • 使用 x windows
      • 使用第三方应用程序
    • 如何学习shell
      • 多敲
      • 多练
      • 多模拟场景
        • 定期清理过期日志
        • 开启启动某些应用程序
        • 磁盘预警
  • 系统合法的shell 和 /etc/shells 功能

    • cshell 和 bshell (bash)
    • 检查/etc/shell 可以得到系统可使用的shell
      • /bin/sh
      • /bin/bash 默认
      • /bin/tcsh
      • /bin/csh
  • bash的功能

    • history 历史功能
      • 记录的位置:家目录的 .bash_history
        • 注意:按照登陆来记录,记录上次登陆的命令,本次的被存在缓存
    • 补全功能
      • 确定命令正确
    • 命令别名
      • alias
        • 简单用:alias lm ='ls -al'
    • 通配符
  • 判断命令是否为 Bash shell 内置 : type

    • man bash

    • type 基本使用

      • type -t umask
    • 命令快捷键:常用

      • ctrl + u 和 ctrl + k
      • ctrl + a 和 ctrl + e
  • shell 基本内容学习

    • 变量定义
      • echo 和 unset
        • 案例:
          • echo $HOME
          • 设置:变量 echo ${myname}
        • 特殊点
          • echo 默认变量为“空”
      • 设置规则
        • 双引号和单引号的区别
      • 案例
        • 如何进入到内核的目录模块
          • cd /lib/moudules/$(name -r)/kernel
    • 变量取消
      • unset name
  • 环境变量设置

    • env 查看环境变量

    • declare 定义变量的另一种方式,声明变量

      • declare -i number=RANDOM10/32768;echoRANDOM*10/32768 ; echo number
        • 随机生成一个数字
    • set 观察和设置自定义变量

    • PS1 提示字符

      • 有许多的定义,具体可以查看对应的百度内容

      • blog.csdn.net/qq_34208467…

      • 参数意义

          \d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
          \H :完整的主机名。举例来说,鸟哥的练习机为『study.centos.vbird』
          \h :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『study』后面省略
          \t :显示时间,为 24 小时格式的『HH:MM:SS』
          \T :显示时间,为 12 小时格式的『HH:MM:SS』
          \A :显示时间,为 24 小时格式的『HH:MM』
          \@ :显示时间,为 12 小时格式的『am/pm』样式
          \u :目前使用者的账号名称,如『dmtsai』;
          \v :BASH 的版本信息,如鸟哥的测试主机版本为 4.2.46(1)-release,仅取『4.2』显示
          \w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
          \W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
          \# :下达的第几个指令。
          \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~
        
    • $

      • 查看PID : $$
    • ?

      • 代表着上一个命令的返回值
      • 如何理解?
        • 一般命令执行之后会有一个0和非0的值,如果是0代表执行成功
        • 非0则代表失败
    • export 自定义环境变量

      • env 和 set有什么区别?

        • env 是父进程环境变量
        • set 可以是子进程变量
        • 子进程仅仅继承父进程的环境变量,不继承自定义变量
      • 使用export 可以让自定义变量变成环境变量

    • declare 环境变量转自定义变量

  • 语系变量

    • locale -a 查看系统支持的所有语言
  • 变量有效范围

    • 变量键盘读取和数组声明:read 、array、declare
    • read
      • 作用
        • 等待键盘输入
      • 参数
        • -p 提示字符
        • -t 等待秒数
    • declare , typeset
      • 作用
        • 声明变量类型
          • -a 定义数组类型
          • -i 定义整数类型
          • -e export 相同
          • -r readonly类型
      • 注意:
        • 默认字符串类型
        • 默认最多为整型运算
  • 和文件系统程序有关的限制关系:ulimit

    • 作用
      • 限制开启文件数量,可使用CPU时间
      • 可使用内存总量
    • 参数和语法:
    选项与参数:
    -H :hard limit ,严格的设定,必定不能超过这个设定的数值;
    -S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。
    在设定上,通常 soft 会比 hard 小,举例来说,soft 可设定为 80 而 hard
    设定为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,
    系统会有警告讯息通知你!
    -a :后面不接任何选项与参数,可列出所有的限制额度;
    -c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),
    这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。
    -f :此 shell 可以建立的最大文件容量(一般可能设定为 2GB)单位为 Kbytes
    -d :程序可使用的最大断裂内存(segment)容量;
    -l :可用于锁定 (lock) 的内存量
    -t :可使用的最大 CPU 时间 (单位为秒)
    -u :单一用户可以使用的最大程序(process)数量
    
    • 如何恢复?
      • 注销再登陆
  • 变量的删除、取代和替换

    • 变量删除替换

      • 案例:
      ${variable#/*local/bin:} }
      上面的特殊字体部分是关键词!用在这种删除模式所必须存在的
      
      ${ variable#/*local/bin:}
      这就是原本的变量名称,以上面范例二来说,这里就填写 path 这个『变量名称』啦!
      
      ${variable# #/*local/bin:}
      # 号的作用
      这是重点!代表『从变量内容的最前面开始向右删除』,
      且仅删除最短的那个
      
      ${variable# /*local/bin:}
      代表要被删除的部分,由于 # 代表由前面开始删除,所以这里便由开始的 / 写起。
      需要注意的是,我们还可以透过通配符 * 来取代 0 到无穷多个任意字符
      以上面范例二的结果来看, path 这个变量被删除的内容如下所示:
      /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
      
      • 简单理解
      ${variable# #/*local/bin:}
      # 号的作用
      这是重点!代表『从变量内容的最前面开始向右删除』,
      且仅删除最短的那个 
      
      • # 和 ## 代表如下
        • # 符合替换字符的【最短的】哪一个
        • ## 符合替换字符最长的哪一个
      • 如何从后面向前面删除内容
        • % 和 %%
    • 替换

      • 案例
      范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:
      [dmtsai@study ~]$  echo ${path/sbin/SBIN}
      
    • 变量测试和内容替换

      • 案例
      范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root
      [dmtsai@study ~]$  echo ${username}
      <==由于出现空白,所以 username 可能不存在,也可能是空字符串
      [dmtsai@study ~]$  username=${username-root}
      
      • 关键点在于 - 号码
      • 后面接变量不存在的替换字符
      • 如果是空字符串也想替换要怎么做
        • :- 前面加上 : 冒号即可
    • 提示变量不存在 ?

      • 案例

        测试:若 str 不存在时,则 var 的测试结果直接显示 "无此变量"
        [dmtsai@study ~]$  unset str; var=${str? 无 此 变数} }
        -bash: str: 无此变量 <==因为 str 不存在,所以输出错误讯息
        
  • 命名别名和历史命令

    • alias 和 unalias
    • history
      • 自行man 查询使用方式
  • bash shell 的操作环境

    • 路径和命令的查找顺序(面试终点)
      • 根据绝对和相对路径查找的命令
      • 由于alias 查找出来的命令
      • bash 内置的 命令来执行
      • 根据$PATH 环境变量来查找
  • 登陆的欢迎信息

    • cat /etc/issue
    • cat /etc/issue.net 用于ssh等远程登陆使用的欢迎信息
    • cat /etc/motd 用于所有登陆用户想要知道的某些信息
  • bash 的环境配置文件

    • login 和 non-login shell
      • login shell 取得bash 的时候需要的完整登陆流程
      • non-login shell: 取得bash 的方法不需要重复登陆的操作
    • 为什么需要最先了解这两个东西
      • 因为不同的登陆形式获取的shell配置不一样
  • login shell读取的内容

    • /etc/profile 系统整体配置,很脆弱,一旦奔溃恢复比较麻烦
      • /etc/profile 的主要内容
        • PATH
        • MAIL
        • USER
        • HOSTNAME
        • HISTSIZE
        • umask
        • 调用外部文件
          • /etc/profile.d/*.sh
          • /etc/locale.conf
          • /usr/share/bash-completion/completions/*
    • ~/.bash_profile 或者 ~/.bash_login 或者 ~/.profile 用户个人的配置文件
  • 读取配置文件的命令 source

    • 作用
      • 当案例需要多个变量环境的时候,很方便的切换变量环境
      • 安装某些软件的时候快速改变环境变量测试是否设置正确
    • 注意点:
      • /etc/bashrc (red hat 系统特有)
        • 作用
          • 根据不同的UID 设置umask
          • 根据不同UID 设置提示字符
          • 调用 /etc/profile.d/*.sh
  • 终端环境设置 stty 、 set