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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 文件系统的整体信息,inode 数据区块的总量,使用量,剩余量,文件系统的格式和相关信息

前言


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


一篇地址: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=RANDOM∗10/32768;echoRANDOM*10/32768 ; echo RANDOM10/32768;echonumber
  • 随机生成一个数字


  • set 观察和设置自定义变量


  • PS1 提示字符


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

  • 参数意义


  \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


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
20天前
|
Linux
Linux源码阅读笔记10-进程NICE案例分析2
Linux源码阅读笔记10-进程NICE案例分析2
|
20天前
|
Linux
Linux源码阅读笔记09-进程NICE案例分析1
Linux源码阅读笔记09-进程NICE案例分析1
|
18天前
|
Unix Linux 开发工具
linux笔记 diff及patch的制作与使用
这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。
15 2
linux笔记 diff及patch的制作与使用
|
21天前
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
33 9
|
20天前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
20天前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
24天前
|
存储 缓存 编译器
Linux源码阅读笔记06-RCU机制和内存优化屏障
Linux源码阅读笔记06-RCU机制和内存优化屏障
|
20天前
|
Linux 开发者
Linux源码阅读笔记18-插入模型及删除模块操作
Linux源码阅读笔记18-插入模型及删除模块操作
|
20天前
|
Linux
Linux源码阅读笔记12-RCU案例分析
Linux源码阅读笔记12-RCU案例分析
|
20天前
|
数据采集 Linux
Linux源码阅读笔记20-PCI设备驱动详解
Linux源码阅读笔记20-PCI设备驱动详解
下一篇
DDNS