30no2's Blog.

鸟哥的linux私房菜《第四版》——读后感

字数统计: 19.7k阅读时长: 81 min
2020/10/15 Share

一、主机的规划与磁盘分区

1、linux与硬件的搭配

  • 各个组件或者装置在linux底下都是一个文件。
  • 开机流程
    • BIOS:开机主动执行的韧体,会认识第一个可开机的装置
    • MBR:第一个可开机的装置的第一个扇区内的主要启动记录区块,内含开机管理程序
    • 开机股那里程序(boot loader):一支可读取核心文件来执行的软件
      • 提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!
      • 载入核心文件:直接指向可开机的程序区段来开始操作系统
      • 转交其他loader:将开机管理功能转交给其他loader负责
    • 核心文件:开始操作系统的功能。。。

2、磁盘分区

  • 目录树结构:整个目录树架构最重要的就是那个根目录(root directory)这个根目录的表示方法为一条斜线/
  • 挂载:就是利用一个目录当作进入点,将磁盘分区槽的数据放置在该目录下;也就是说,进入该目录就可以读取该分区槽的意思。这个动作叫做挂在,进入的点叫做挂载点。

二、安装centos7

  • 若安装笔记本电脑失败时,可尝试在开机时加入【linux nofb apm=off acpi=off】来关闭省电功能
  • 安装过程进入分区后,请以【自定义的分区模式】来处理自己规划的分区方式
  • centos 7预设使用xfs作为文件系统
  • 没有连上Internet时,可尝试关闭防火墙,但SELinux最好选择强制状态
  • 设定时不要选择启动kdump,应为那是给核心开发查阅当机数据
  • 如果我的磁盘分区时使用MBR方式,并设定了四个Primary分区槽,这是磁盘还有空间,由于最多只有四个Primary的磁盘分区槽,没有多的可以进行分区了,且由于没有Extended,就不能在使用Logical分区。

三、首次登入与在线求助

  • 查看文档

    • 空格键——向下翻一页
    • 【Page Down】——向下翻一页
    • 【Page Up】——向上翻一页
    • 【Home】——去到第一页
    • 【End】——去到最后一页
    • /string 向【下】搜寻string这个字符串,如果要搜寻vbird的话,就输入/vbird
    • ?string 向【上】搜寻string这个字符串
    • n,N:继续往下查询N用于反向查询
    • q 结束
  • Linux系统在线求助man page

    • man -f 指令 ,在某些情况下,你可能知道要使用某些特定的指令或者是修改某些特定的配置文件,但是偏偏忘记了该指令的完整名称。有些时候则是你只记得该指令的部分关键词。

    • 【man -f man】

      • 左边部分:指令(或文件)以及该指令所代表的意义(就是那个数字);
      • 右边部分:这个指令的简易说明

      【man 1 yum-groups-manager】

    • info page

      • info page 则是将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写,并且在各个页面中还有类似的网页的【超链接】来跳到各不同的页面中,每个独立的页面也被称为一个节点。
    • 总结:

      • 在终端机模式中,如果你知道某个指令,但却忘记了相关选项与参数,请先善用 –help的功能来查询相关信息
      • 当有任何你不知道的指令或文件格式这种玩意儿,请使用man或者info来查询
      • 而如果你想要架设一些其他的服务,或想要利用一整套软件来达成某项功能时,到/usr/share/doc底下查一下有没有该服务的说明文档
  • 超级文书编辑器:nano

    • [ctrl]-G:取得联机帮助(help),很有用的!
    • [ctrl]-X:离开 naon 软件,若有修改过文件会提示是否需要储存喔!
    • [ctrl]-O:储存文件,若你有权限的话就能够储存文件了;
    • [ctrl]-R:从其他文件读入资料,可以将某个文件的内容贴在本文件中;
    • [ctrl]-W:搜寻字符串,这个也是很有帮助的指令喔!
    • [ctrl]-C:说明目前光标所在处的行数与列数等信息;
    • [ctrl]-_:可以直接输入行号,让光标快速移动到该行;
    • [alt]-Y:校正语法功能开启或关闭(单击开、再单击关)
    • [alt]-M:可以支持鼠标来移动光标的功能
  • 正确的关机方法

    • 在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作,若不正常关机,则可能造成文件系统的损毁。

    • 观察系统的使用状态:

      • 如果要看目前有谁在线,可以下达【who】这个指令,而如果要看网络的联机状态,可以下达【netstat -a】这个指令,要看背景执行的程序可以执行【ps -aux】这个指令
      • 关机:shutdown

      • 重启:reboot

    • 相关指令

      • 将数据同步写入硬盘中的指令:sync

      • 转换为管理员权限

        • su -
          • 输入密码后转为管理员权限
        • tips:
          • sync可以被一般账号使用,只不过一般账号用户所更新的硬盘数据就仅有自己的数据,不像root可以更新整个系统中的数据了。
      • 惯用的关机指令:shutdown

        • shutdown 【参数】

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

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

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

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

          • 时间:指定系统关机的时间!世家你的范例地下会说明。若没有这个项目,则默认1分钟后自动进行。

            • 例子:

              1
              2
              3
              4
              5
              6
              shutdown -h now #立刻关机,其中now相当于时间为0的状态
              shutdown -h 20:25 #系统在今天的20:25分会关机,若在21:25才下达此指令,则隔天才关机
              shutdown -h +10 #系统踩过十分钟后自动关机
              shutdown -r now #系统立刻重启
              shutdown -r +30 'The system will reboot' #再过三十分钟系统会重新启动,并显示后面的讯息给所有在线使用者
              shutdown -k now 'This system will reboot' #仅发出警告信件的参数!系统并不会关机,吓唬人。
      • systemctl【指令】

        • 指令项目包括如下:
          • halt:进入系统停止模式,屏幕可能会保留一些讯息,这与你的电源管理模式有关
          • poweroff:进入系统关机模式,直接关机没有提供电力
          • reboot:直接重新启动
          • suspend:进入休眠模式
      • 重新启动,关机:reboot,halt,poweroff

  • 重点回顾
    • 为了避免瞬间断电造成的 Linux 系统危害,建议做为服务器的 Linux 主机应该加上不断电系统来持续提供稳定的电力;
    • 养成良好的操作习惯,尽量不要使用 root 直接登入系统,应使用一般账号登入系统,有需要再转换身份
    • 可以透过『活动总览』查看系统所有使用的软件及快速启用惯用软件
    • 在 X 的环境下想要『强制』重新启动 X 的组合按键为:『[alt]+[ctrl]+[backspace]』;
    • 预设情况下,Linux 提供 tty1~tty6 的终端机界面;
    • 在终端机环境中,可依据提示字符为$或#判断为一般账号或 root 账号;
    • 取得终端机支持的语系数据可下达『echo $LANG』或『locale』指令;
    • date 可显示日期、cal 可显示日历、bc 可以做为计算器软件;
    • 组合按键中,[tab]按键可做为(1)命令补齐或(2)档名补齐或(3)参数选项补齐,[crtl]-[c]可以中断目前正在运作中的程序;
    • Linux 系统上的英文大小写为不同的资料
    • 联机帮助系统有 man 及 info 两个常见的指令;
    • man page 说明后面的数字中,1 代表一般账号可用指令,8 代表系统管理员常用指令,5 代表系统配置文件格式;
    • info page 可将一份说明文件拆成多个节点(node)显示,并具有类似超链接的功能,增加易读性;
    • 系统需正确的关机比较不容易损坏,可使用 shutdown, poweroff 等指令关机。

四、linux的文件权限与目录配置

  • 文件权限read/write/execute权限

(一)使用者与群组

1、文件拥有者:

  • linux是多人多任务的系统,为了考虑每个人的隐私以及每个人喜好的工作环境,【文件拥有者】的角色就显得的相当重要了。

2、群组概念:

  • 群组最有用的功能是团队开发中使用,限制非自己团队的其他人不能阅览内容。
  • 如果teacher这个账号是projecta与projectb这两个专题的老师,想同时观察两者的进度,则同时支持projecta与projectb这两个群组!也就是说:每个账号都可以由多个群组的支持-
  • 使用者和群组的概念
    • 使用者的意义:有使用权但是有的私人文件不能使用
    • 群组:属于群组的都能使用

3、其他人的概念

  • 群组意外的用户则为其他人

4、Linux用户身份与群组记录的文件

  • linux系统中root相关信息,/etc/passwd这个文件内的。密码则记录在/etc/shadow这个文件下
  • linux所有的组名都在/etc/group

(二)linux文件权限概念

1、linux文件按属性

  • ls -al

-rw-r–r–. 1 root root 2150 10月 15 16:01 initial-setup-ks.cfg

1)第一栏代表这个文件的类型与权限(permission)
  • 【rwx】的三个参数的组合,【r】代表可读的(read)【w】代表可写(write)【x】代表可执行(execute)
  • 【-rwxr-xr–】:
    • 【-】【rwx】【r-x】【r–】
    • 【1】【234】【567】【890】
      • 1:代表这个文件名为目录或者文件,本例中为文件(-)
      • 234:拥有者的权限,本例中为可读,可写,可执行(rwx)
      • 567:同群组用户权力,本例中为可读可执行(rx)
      • 980:其他用户权力,本例中为可读(r),就是只读之意
      • 同时注意到,rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号(-)就是了
2)第二栏表示有多少档名连接到此节点(i-node)

每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录,因此每个档名就会链接一个i-node。这个属性记录的,就是有多少不同的档名连接到相同的一个i-node号码。

3)第三栏表示这个文件(或目录)的【拥有者账号】
4)第四栏表示这个文件的所属群组
5)第五栏为这个文件的容量大小,默认单位为bytes
6)第六栏为这个文件的建档日期或者是最近的修改日期
7)第七栏为这个文件的档名
  • 如果档名之前多了一个【.】,则代表这个文件为【隐藏档】,可以使用【ls】【ls -a】。

2、linux文件权限的重要性

  • 系统保护的功能
  • 团队开发软件或数据共享工具
  • 未将权限设定妥当的危害
  • 在修改linux文件与目录属性之前,要先搞清楚什么数据是可变的,什么是不可变的。

3、如何改变文件属性与权限

chgrp:改变文件所属群组

chown:改变文件拥有者

chmod:改变文件的权限,SUID,SGID,SBIT等特性

  • 改变所属群组,chgrp(change group的缩写)
1
chgrp users test.txt
  • 改变文件拥有者,chown(change owner的缩写)
    • /etc/passwd这个记录的用户名称才能改变,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上-R的选项即可。
1
2
chown bin test.txt #将test.txt的拥有者改为bin这个账号
chown root:root test.txt #将test.txt的拥有者和群组改回为:root
  • 改变权限,chmod

    • 数字类型改变文件权限

      • r:4
      • w:2
      • x:1
    • 三种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,

      • owner = rwx = 4+2+1 = 7
      • group = rwx = 4+2+1 = 7
      • others = — = 0+0+0=0
1
chmod 777 test.txt #将test.txt这个文件权限都设定

4、目录与文件之权限意义

1)权限对文件的重要性
  • r(read):可读取此文件的实际内容,如读取文本文件的文字内容
  • w(write):可以编辑,新增或者修改该文件的内容(但不含删除该文件)
  • x(eXecute):该文件具有可以被系统执行的权限
2)权限对目录的重要性
  • r(read contents in directory ):表示具有读取目录结构列表的权限
  • w(modify contents of directory ):表示你具有移动该目录结构列表的权限
    • 建立新的文件与目录
    • 删除已经存在的文件与目录(不论该文件的权限为何!)
    • 将已经存在的文件或者目录进行更名;
    • 搬移该目录内的文件,目录位置
  • x(access directory):x代表的是用户能否进入该目录成为工作目录的用途,即你登陆Linux时,所在的家目录就是你当下的工作目录
    • 如果你在某目录下不具有x的权限,那么你就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r或者w的权限
    • 要开放目录给任何人浏览时,应该至少给r和x权限但是w权限不能随便给

5、Linux文件种类与扩展名

1)文件种类
  • 正规文件
    • 纯文本:人类可以读到的数据,例如数字,字母等
    • 二进制文件:电脑可以执行的文件
    • 数据格式文件:程序运作时候会读取特定格式的文件,例如我们登录数据,记录在/var/log/wtmp 中,我们可以用last读出来,但是用cat则是乱码
  • 目录
  • 连结档:类似window的快捷方式,第一个属性为【I】
  • 设备与装置文件
    • 与系统周边以及存储等相关的一些文件,通常都集中在/dev这个目录中,分为两种
      • 区块设备档:一些存储设备,例如硬盘,/dev/sda
      • 字符设备文件:一些串型设备,例如键盘鼠标等
  • 资料接口文件(sockets):我们可以启动一个程序来监听客户端的要求,而客户端可以透过这个socket来进行数据的沟通。属性为【s】,位置/run/tmp
  • 数据传输文件(FIFO,pips):特殊的文件类型,他主要目的解决多个程序同时存取一个文件造成的错误问题。属性为:【p】
2)Linux文件扩展名

​ 一个linux文件能不能执行,我们通常与他第一栏的十个属性有关,在linux下,只要你有这个文件的权限为x时,则这个文件就有执行能力。

​ “具有可执行能力”和“具有可执行力的代码”是两回事

​ 通常可执行的后缀名:

  • *.sh:脚本或者批处理文件
  • Z, .tar, .tar.gz, .zip, *.tgz:经过打包的压缩文件
  • .html , .php :网页相关文件
3)Linux文件长度的限制

​ 单一的文件或者目录最大允许文件名为:255bytes,以一个ASCII英文占用一个bytes来说,则大约可以255个字符长度,若以每中文字占用2bytes来说,最大档名大约在128个中文字之谱。

4)Linux文件名的限制

避免特殊字符

* ? > < ; & ! [ ] | \ ‘ “ ` ( ) { }

(三)Linux目录配置

1、Linux的目录配置依据:FHS

将目录分为四种交互形态:

  • 可分享的:可以分享给其他挂载使用的目录,所以包括执行文件,与用户邮件等数据,是能够分享给网络上其他主机挂载用的目录

  • 不可分享的:自己机器上运作的装置文件或者与程序有关的socket文件等,由于与自身机器有关,所以当然就不适合分享给其他主机了。

  • 不变的:有些数据是不会经常变动的,跟随distribution而不变动,例如:函数库,文件说明,系统管理员所管理的主机配置文件

  • 可变动的:经常改变的数据,例如登录文件,一般用户可自行收受的新闻组等。

  • /(root,根目录):与开机有关

  • /usr(unix software resource):与软件安装/执行有关

  • /var(variable):与系统运作过程有关

  • 根目录(/)的意义与内容

    • 根目录也与开机/还原/系统修复等动作有关

      • 根目录所在的分区卡槽应该越少越好,应用程序所安装的软件最好不要与根目录放在同一个分区槽内,保持根目录越小越少。如此不但效能较佳,根目录所在的文件系统也较不容易发生的问题。
    • FHS要求必须要存在的目录

      • /bin 放置 的是在单人维护模式下还能够被操作的指令
      • /boot 这个目录主要在放置开机会使用到的文件,如果使用的是grub2这个开机管理程序,则还会存在/boot/grub2/这个目录
      • /dev 这个目录任何装置与接口设备都是以文件的形态存在这个目录中。
      • /etc 系统主要的配置都放在这个目录里面,FHS建议不要放置可执行文件,

        • /etc/opt(必要):这个目录放置第三方协力软件 /opt的相关配置文件
        • /etc/X11(建议):与X Window有关的配置
        • /etc/sgml(建议):与SGML格式有关的各项配置文件
        • /etc/xml(建议):与xml格式有关的各项配置文件
      • lib /lib放置的则是在开机时会用到函数库,以及在/bin或/sbin底下的指令会呼叫的函式库而已。

        • /lib/modules:这个目录主要放置可抽换的核心相关模块。
      • media /media底下放置的是可移除的装置,如软盘,光盘。
      • /mnt 暂时挂载
      • /opt 这个是给第三方协力软件放置的目录
      • /run 早期的FHS规定系统开机后所产生的各项信息应该要放置到/var/run目录下,新版的FHS则规范到/run底下
      • /sbin 放在/sbin 底下的为开机过程中所需要的,里面包括了开机、修复、还原 系统所需要的指令,本机自行安装的软件所产生的系统执行文件,则防止到/usr/local/sbin/当中
      • /srv 是一些网络服务启动之后,这些服务所需要取用的数据目录。 常见的服务例如www,ftp。
      • /tmp 这是让一般用户或者正在执行的程序暂时放置的地方。每个人都能够存储的。建议每次开机都清除/tmp的数据。
      • /usr 第二层FHS设定
      • /var 第二层FHS设定,主要为放置变动性的数据
    • FHS建议可以存在的目录

      • /home 这是系统默认的用户家目录,新增一个账号时,默认的用户家目录,都会规范在这里。
      • /lib 用来存放在与 /lib 不同格式的二进制函式库
      • /root 系统的管理员(root)的家目录 。
      • /usr 的意义与内容:/usr里面防止的内容是可分享的与不可变动的。GHS建议所有软件开发者,应该将他们的数据合理的分别放置的到这个目录的次目录,而不自行建立该软件自己独立的目录。
      • /var的意义与内容:
        • 如果/usr 是安装时会占用较大硬盘容量的目录,那么/var 就是在系统运作后才会渐渐占用硬盘容量的目录。
第一部份:FHS 要求必须要存在的目录
/var/cache/ 应用程序本身运作过程中会产生的一些暂存档;
/var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的 目录。 举例来说,MySQL 的数据库放置到/var/lib/mysql/而 rpm 的数据库则放到/var/lib/rpm 去!
/var/lock/ 某些装置或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该装置时, 就 可能产生一些错误的状况,因此就得要将该装置上锁(lock),以确保该装置只会给单一软件所使用。举 例来说,刻录机正在刻录一块光盘,你想一下,会不会有两个人同时在使用一个刻录机烧片? 如果 两个人同时刻录,那片子写入的是谁的资料?所以当第一个人在刻录时该刻录机就会被上锁, 第二 个人就得要该装置被解除锁定(就是前一个人用完了)才能够继续使用啰。目前此目录也已经挪到 /run/lock 中!
/var/log/ 重要到不行!这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记 录登入者的信息)等。
/var/mail/ 放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中! 通常这两个目录 是互为链接文件啦!
/var/run/ 某些程序或者是服务启动后,会将他们的 PID 放置在这个目录下喔!至于 PID 的意义我们会在后续章 节提到的。 与 /run 相同,这个目录链接到 /run 去了!
/var/spool/ 这个目录通常放置一些队列数据,所谓的『队列』就是排队等待其他程序使用的数据啦!这些数据被 使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中, 但使用者收下该信 件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被送出 后就被删除。如果是工作排程数据(crontab),就会被放置到/var/spool/cron/目录中!
1)针对FHS,各家distributions 的异同,与 CentOS7 的变化

CentOS 的网络设定数据放在/etc/sysconfig/network-scripts/ 目录下,但是 SuSE 则是将网络放置在 /etc/sysconfig/network/ 目录下,目录名称可是不同的呢! 】

  • /bin –> /usr/bin
  • /sbin –> /usr/sbin
  • /lib –> /usr/lib
  • /lib64 –> /usr/lib64
  • /var/lock –> /run/lock
  • /var/run –> /run

2、目录树

​ 在linux底下,所有的文件与目录都是由根目录开始的。

  • 目录树的起始点为根目录(/,root);
  • 每一个目录不止能使用本地端的partition的文件系统,也可以使用网络上的filesystem。举例来说,可以利用Network File System(NFS)服务器挂载某特定目录
  • 每一个文件在此目录中的文件名(包含完整路径)都是独一无二的

3、绝对路径和相对路径

  • .:代表当前目录,也可以使用./来表示
  • ..:代表上一层目录,也可以../来表示

4、Centos 的观察

1
2
3
4
uname -r #查看核心版本
uname -m #查看操作系统的位版本
yum install redhat-lsb #查看版本号,需要root身份
lsb_release -a #查看信息

5、重点

  • 更改文件的群组支持可用 chgrp,修改文件的拥有者可用 chown,修改文件的权限可用 chmod

  • 修改文件权限

    chmod 754 filename

  • 配置数据

    • /etc/ 几乎系统所有配置文件均在这里
    • /boot/ 开机配置文件,
    • /usr/bin, /bin 一般执行档摆放的地方
    • /usr/sbin,/sbin 系统管理员常用的指令集
    • /dev 所有系统装置文件的目录
    • /var/log 系统注册表文件的地方
    • /run 经常变动的项目

五、Linux文件与目录管理

1、目录与路径

  • 文件与目录的检视:ls

  • 复制、删除、移动:cp, rm, mv

2、文件与目录管理

  • 取得路径的文件名与目录名称

  • basename /etc/sysconfig/network # network 取得最后的档名

  • dirname /etc/sysconfig/network # /etc/sysconfig 取得目录名

3、文件内容查阅

  • cat 由第一行还是显示文件内容
  • tac 由最后一行显示文件内容(tac是cat倒着写的)
  • nl 显示的时候 显示行号
  • more 一页一页显示文件内容
  • less与more类似 比more好的是,他可以往前翻页
  • head 只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取文件内容

4、文件与目录的默认权限与隐藏权限

  • 除了基本 r, w, x 权限外,在 Linux 传统的 Ext2/Ext3/Ext4 文件系统下,我们还可以设定其他的系统隐藏属性, 这部份可使用 chattr 来设定,而以 lsattr 来查看,最重要的属性就是可以设定其不可修改的特性!

  • 文件预设权限:umask 用户在建立文件时默认的属性,修改权限则umask 后加对应数值,例如umask 002

  • 文件隐藏属性:

    • chattr(配置隐藏属性)
    1
    chattr [+-=][ASacdistu] 文件或目录名称
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    范例:请尝试到/tmp 底下建立文件,并加入 i 的参数,尝试删除看看。
    [root@study ~]# cd /tmp
    [root@study tmp]# touch attrtest <==建立一个空文件
    [root@study tmp]# chattr +i attrtest <==给予 i 的属性
    [root@study tmp]# rm attrtest <==尝试删除看看
    rm: remove regular empty file `attrtest'? y
    rm: cannot remove `attrtest': Operation not permitted
    # 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设定!
    范例:请将该文件的 i 属性取消!
    [root@study tmp]# chattr -i attrtest
  • lsattr(显示文件隐藏属性)

    1
    lsattr [-adR] 文件或目录
    1
    2
    3
    4
    5
    6
    7
    选项与参数:
    -a :将隐藏文件的属性也秀出来;
    -d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
    -R :连同子目录的数据也一并列出来!
    [root@study tmp]# chattr +aiS attrtest
    [root@study tmp]# lsattr attrtest
    --S-ia---------- attrtest
  • 文件特殊权限

    • SUID,SGID,SBIT
  • 观察文件类型:file

5、指令与文件搜索

  • 脚本文件名的搜寻
1
which [-a] command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
范例一:搜寻 ifconfig 这个指令的完整文件名
[root@study ~]# which ifconfig
/sbin/ifconfig
范例二:用 which 去找出 which 的档名为何?
[root@study ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/bin/alias
/usr/bin/which
# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?
# 那就是所谓的『命令别名』,意思是输入 which 会等于后面接的那串指令啦!
# 更多的数据我们会在 bash 章节中再来谈的!
范例三:请找出 history 这个指令的完整文件名
[root@study ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin)
[root@study ~]# history --help
-bash: history: --: invalid option
history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg
  • 文件档名的搜寻
1
whereis [-bmsu] 文件或目录名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文件 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
范例一:请找出 ifconfig 这个档名
[root@study ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
范例二:只找出跟 passwd 有关的『说明文件』档名(man page)
[root@study ~]# whereis passwd # 全部的档名通通列出来!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz
[root@study ~]# whereis -m passwd # 只有在 man 里面的档名才抓出来!
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.g
  • locate/updatedb
    • updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库
      文件;
    • locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。
1
2
3
4
5
6
7
[root@study ~]# locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出档名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正规表示法的显示方式
  • find
1
find [PATH] [option] [action]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
选项与参数:
1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
[root@study ~]# find / -mtime 0
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
# find / -mtime 3 有变动过的文件都被列出的意思!
范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
[root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系是很有用的!
1
2
3
4
5
6
7
8
范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
[root@study ~]# find / -mtime 0
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
# find / -mtime 3 有变动过的文件都被列出的意思!
范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
[root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系是很有用的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
选项与参数:
3. 与文件权限及名称有关的参数:
-name filename:搜寻文件名为 filename 的文件;
-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:
c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB
还要大的文件,就是『 -size +50k 』
-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c),
目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。
-perm mode :搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod
的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
-perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,
当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,
因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm /mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻
-rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------
也会被列出来,因为他有 -rw.... 的属性存在!
范例五:找出档名为 passwd 这个文件
[root@study ~]# find / -name passwd
范例五-1:找出文件名包含了 passwd 这个关键词的文件
[root@study ~]# find / -name "*passwd*"
# 利用这个 -name 可以搜寻档名啊!默认是完整文件名,如果想要找关键词,
# 可以使用类似 * 的任意字符来处理
范例六:找出 /run 目录下,文件类型为 Socket 的檔名有哪些?
[root@study ~]# find /run -type s
# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
# 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!
范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
[root@study ~]# find / -perm /7000
# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
# 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000 ~瞭乎?

6、复习

  • 特殊目录有:., .., -, ~, ~account 需要注意;
  • rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』指令;
  • cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同
  • 文件具有 SUID 的特殊权限时,代表当用户执行此一 binary 程序时,在执行过程中用户会暂时具有程序拥有者的权限
  • 目录具有 SGID 的特殊权限时,代表用户在这个目录底下新建的文件之群组都会与该目录的组名相同。
  • 目录具有 SBIT 的特殊权限时,代表在该目录下用户建立的文件只有自己与 root 能够删除!
  • 观察文件的类型可以使用 file 指令来观察;
    • 搜寻指令的完整文件名可用 which 或 type ,这两个指令都是透过 PATH 变量来搜寻文件名;
       搜寻文件的完整档名可以使用 whereis 找特定目录或 locate 到数据库去搜寻,而不实际搜寻文件系统;
       利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。

六、Linux磁盘与文件系统

6.1、认识Linux系统

  • EXT2:是使用inode/block/superblock这种inode为基础的文件系统
  • 我们在Linux下的文件系统建立一个目录时,文件就会分配一个inode与至少一块block给该目录。
  • EXT3,4是EXT2的升级版本,新增了日志等功能,推荐直接用EXT4
  • 挂载点:每个filesystem 都有独立的inode/block/superblock 。挂载点一定是目录,该目录为进入该文件系统的入口。
1
2
3
4
[root@study ~]# ls -lid / /boot /home
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /
128 dr-xr-xr-x. 4 root root 4096 May 4 17:59 /boot
128 drwxr-xr-x. 5 root root 41 Jun 17 00:20 /home
  • inode号为128 filesystem为17,4,5则它们为不同的目录
1
2
3
4
[root@study ~]# ls -ild / /. /..
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /.
128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /..
  • inode号为128 filesystem为17则它们为相同的目录

  • 查看Linux支持的文件系统

1
ls -l /lib/modules/$(uname -r)/kernel/fs
  • XFS:Centos 7 已经由原本的EXT4变成了XFS文件系统。

    • Ext家族当前较伤脑筋的地方:支持度最广,但格式化超级慢
    • xfs是一个日志式的文件系统,主要用在高容量磁盘以及高性能文件系统只用。
      • 一个资料区(data section)
      • 一个文件系统活动登录区(log section)
      • 一个实时运作区(realtime section)
  • 范例一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
找出系统 /boot 这个挂载点底下的文件系统的 superblock 纪录
[root@study ~]# df -T /boot
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/vda2 xfs 1038336 133704 904632 13% /boot
# 没错!可以看得出来是 xfs 文件系统的!来观察一下内容吧!
[root@study ~]# xfs_info /dev/vda2
1 meta-data=/dev/vda2 isize=256 agcount=4, agsize=65536 blks
2 = sectsz=512 attr=2, projid32bit=1
3 = crc=0 finobt=0
4 data = bsize=4096 blocks=262144, imaxpct=25
5 = sunit=0 swidth=0 blks
6 naming =version 2 bsize=4096 ascii-ci=0 ftype=0
7 log =internal bsize=4096 blocks=2560, version=2
8 = sectsz=512 sunit=0 blks, lazy-count=1
9 realtime =none extsz=4096 blocks=0, rtextents=0
  • 说明:
    • 第 1 行里面的 isize 指的是 inode 的容量,每个有 256bytes 这么大。至于 agcount 则是前面谈到的储存区群组 (allocation group) 的个数,共有 4 个, agsize 则是指每个储存区群组具有 65536 个 block 。配合第 4 行的 block 设定为 4K,因此整个文件系统的容量应该就是 4655364K 这么大!
    • 第 2 行里面 sectsz 指的是逻辑扇区 (sector) 的容量设定为 512bytes 这么大的意思。
    • 第 4 行里面的 bsize 指的是 block 的容量,每个 block 为 4K 的意思,共有 262144 个 block 在这个文件系统内。
    • 第 5 行里面的 sunit 与 swidth 与磁盘阵列的 stripe 相关性较高。这部份我们底下格式化的时候会举一个例子来说明。
    • 第 7 行里面的 internal 指的是这个登录区的位置在文件系统内,而不是外部设备的意思。且占用了 4K *2560 个 block,总共约 10M 的容量。
    • 第 9 行里面的 realtime 区域,里面的 extent 容量为 4K。不过目前没有使用。

6.2、文件系统的简单操作

6.2.1 磁盘与目录的容量

  • df:列出文件的整体磁盘使用量
    • -h 会以G/M等容量格式显示出来
    • -aT 系统内的所有特殊文件格式及名称都列出来
1
2
3
4
将 /etc 底下的可用的磁盘容量以易读的容量格式显示
[root@study ~]# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 10G 3.3G 6.8G 33% /
1
2
3
4
5
6
7
8
范例五:将目前各个 partition 当中可用的 inode 数量列出
[root@study ~]# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 10M 108K 9.9M 2% /
devtmpfs 154K 397 153K 1% /dev
tmpfs 156K 5 156K 1% /dev/shm
tmpfs 156K 497 156K 1% /run
tmpfs 156K 13 156K 1% /sys/fs/cgroup
  • du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
1
2
3
4
5
6
7
选项与参数:
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
    • 直接输入du没有任何选项时,则默认分析当前目录
    • du分析的是当前目录下的所有数据的总和,如果想减少此目录的加总则要加上-S

6.2.2 实体链接与符号链接 ln

在Linux底下的连接档有两种,一种是类似的Windows的快捷方式,可以快速的链接到目标文件,另一种则是透过文件系统的inode链接来产生新的文档名,这种链接称为实体链接。

1
2
3
4
5
6
[root@study ~]# ll -i /etc/crontab
34474855 -rw-r--r--. 1 root root 451 Jun 10 2014 /etc/crontab
[root@study ~]# ln /etc/crontab . <==建立实体链接的指令
[root@study ~]# ll -i /etc/crontab crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
  • 如果将任何一个档名删除,其实inode和block都还是存在的,不论在哪个档名修改,结果都会写入相同的inode与block中。
  • hard link限制:
    • 不能跨Filesytem
    • 不能link目录

Symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的文件会『开不了』 。

1
2
3
4
[root@study ~]# ln -s /etc/crontab crontab2
[root@study ~]# ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
  • 选项
    • -s:如果不加任何参数就进行链接则是hand link ,至于-s就是symbolic link
    • -f:如果目标文件存在时,就主动将目标文件直接移除后再建立

6.3、磁盘的分区、格式化、检验、挂载

6.3.1 观察磁盘分区状态

  • lsblk:列出磁盘上所有列表
  • blkid:找出装置的UUID
  • parted:列出磁盘分区表类型与分区信息

6.3.2 磁盘分区:gdisk/fdisk

【MBR 分区表用fdisk,GPT分区表用gdisk】

  • partprobe 更新Linux核心的分区表信息
  • gdisk 删除分区
1
2
3
gdisk /dev/vda
p
w #使指令生效

6.3.3 磁盘格式化(建置文件系统)

  • XFS文件系统 mkfs.xfs
1
mkfs.xfs -f /dev/sdb
  • XFS文件系统for RAID(磁盘阵列) 效能优化(Optional)
1
[root@study ~]# mkfs.xfs -f -d agcount=2,sunit=512,swidth=3584 -r extsize=1792k /dev/vda4
  • EXT4文件系统 mkfs.ext4
1
2
3
4
5
6
[root@study ~]# mkfs.ext4 [-b size] [-L label] 装置名称
选项与参数:
-b :设定 block 的大小,有 1K, 2K, 4K 的容量,
-L :后面接这个装置的标头名称。
范例:将 /dev/vda5 格式化为 ext4 文件系统
[root@study ~]
  • 其他文件系统 mkfs
    • mkfs 是综合指令使用mkfs -t xfs时就会找mkfs.xfs的相关参数给我们使用
1
2
3
[root@study ~]# mkfs[tab][tab]
mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4
mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs

6.3.4 文件系统检验

  • xfs_repair 处理XFS文件系统
1
2
3
4
5
xfs_repair [-find] 装置名称
选项与参数:
-f :后面的装置其实是个文件而不是实体装置
-n :单纯检查并不修改文件系统的任何数据 (检查而已)
-d :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用
  • fsck.ext4 处理EXT4文件系统
1
fsck.ext4 /dev/sdb

6.3.5 文件系统的挂载与卸除

  • mount
1
mount /dev/sdb /data/cdrom
1
mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs
  • 重新挂载根目录与挂载不特定目录
1
2
范例:将 / 重新挂载,并加入参数为 rw 与 auto
[root@study ~]# mount -o remount,rw,auto /
  • umount(将装置文件卸除)
1
umount -f /dev/sdb

6.3.6 磁盘/文件系统参数修订

  • mknod
  • xfs_admin 修改XFS文件系统UUID与Label name
1
2
3
4
5
6
7
8
9
10
11
范例:利用 uuidgen 产生新 UUID 来设定 /dev/vda4,并测试挂载
[root@study ~]# umount /dev/vda4 # 使用前,请先卸除!
[root@study ~]# uuidgen
e0fa7252-b374-4a06-987a-3cb14f415488 # 很有趣的指令!可以产生新的 UUID 喔!
[root@study ~]# xfs_admin -u /dev/vda4
UUID = e0a6af55-26e7-4cb7-a515-826a8bd29e90
[root@study ~]# xfs_admin -U e0fa7252-b374-4a06-987a-3cb14f415488 /dev/vda4
Clearing log and setting UUID
writing all SBs
new UUID = e0fa7252-b374-4a06-987a-3cb14f415488
[root@study ~]# mount UUID=e0fa7252-b374-4a06-987a-3cb14f415488 /data/xfs
  • tune2fs修改ext4的lable name 与 UUID
1
2
3
4
5
6
7
范例:列出 /dev/vda5 的 label name 之后,将它改成 vbird_ext4
[root@study ~]# dumpe2fs -h /dev/vda5 | grep name
dumpe2fs 1.42.9 (28-Dec-2013)Filesystem volume name: <none> # 果然是没有设定的!
[root@study ~]# tune2fs -L vbird_ext4 /dev/vda5
[root@study ~]# dumpe2fs -h /dev/vda5 | grep name
Filesystem volume name: vbird_ext4
[root@study ~]# mount LABEL=vbird_ext4 /data/ext4

6.4 设定开机挂载

6.4.1 开机挂载 /etc/fstab 及 /etc/mtab

  • /etc/fstab 是将我们利用mount指令进行挂载时将所有选项与参数写入到这个文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@bogon ~]# 
[root@bogon ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Mon Nov 2 16:02:43 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#[装置/UUID 等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
/dev/mapper/centos-root / xfs defaults 0 0
UUID=6a760021-6800-4ab7-9565-bd9abe459a0f /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
  • 参数说明:

    • 磁盘装置文件名/UUID/LABEL name:
      • 文件系统或磁盘的装置文件名,如 /dev/vda2 等
      • 文件系统的 UUID 名称,如 UUID=xxx
      • 文件系统的 LABEL 名称,例如 LABEL=xxx
    • 第二栏:挂载点 (mount point):
      • 一定是目录
    • 第三栏:磁盘分区槽的文件系统:
      • 在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须要手动写入文件系统才行!包括 xfs, ext4, vfat, reiserfs, nfs 等等。
    • 第四栏:文件系统参数:
      • defaults:同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上,预设情况使用 efaults 设定即可!
    • 第五栏:能否被 dump 备份指令作用:
      • dump 是一个用来做为备份的指令,由于备份方案有很多,所以这里写0就好了。
    • 第六栏:是否以 fsck 检验扇区:
      • 早期开机流程中会校验,主要是透过fsck去做的,现在由于xfs文件系统会自己进行校验,不需要额外校验,直接填写0
  • 如果/etc/fstab输入错误导致无法开机

    • 进入单人模式

      1
      [root@study ~]# mount -n -o remount,rw /

6.4.2 特殊装置loop挂载(映像档不刻录就挂载使用)

如果有光盘映像文件或者是使用文件作为磁盘的方式时,就用特殊的方式将他挂载起来-

  • 挂载光盘/DVD映像文件 通过loop文件来挂载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@study ~]# mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd
[root@study ~]# df /data/centos_dvd
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop0 4050860 4050860 0 100% /data/centos_dvd
# 就是这个项目! .iso 映象文件内的所有数据可以在 /data/centos_dvd 看到!
[root@study ~]# ll /data/centos_dvd
total 607
-rw-r--r--. 1 500 502 14 Jul 5 2014 CentOS_BuildTag <==瞧!就是 DVD 的内容啊!
drwxr-xr-x. 3 500 502 2048 Jul 4 2014 EFI
-rw-r--r--. 1 500 502 611 Jul 5 2014 EULA
-rw-r--r--. 1 500 502 18009 Jul 5 2014 GPL
drwxr-xr-x. 3 500 502 2048 Jul 4 2014 images
.....(底下省略).....
[root@study ~]# umount /data/centos_dvd/
# 测试完成!记得将数据给他卸除!
  • 建立大文件以制作loop装置文件

    • 建立大文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      #假设我要建立一个空的文件在 /srv/loopdev
      [root@study ~]# dd if=/dev/zero of=/srv/loopdev bs=1M count=512
      512+0 records in <==读入 512 笔资料
      512+0 records out <==输出 512 笔数据
      536870912 bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s
      # 这个指令的简单意义如下:
      # if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的装置!# of 是 output file ,将一堆零写入到后面接的文件中。
      # bs 是每个 block 大小,就像文件系统那样的 block 意义;
      # count 则是总共几个 bs 的意思。所以 bs*count 就是这个文件的容量了!
      [root@study ~]# ll -h /srv/loopdev
      -rw-r--r--. 1 root root 512M Jun 25 19:46 /srv/loopdev
  • 大型文件格式化

    1
    2
    3
    [root@study ~]# mkfs.xfs -f /srv/loopdev
    [root@study ~]# blkid /srv/loopdev
    /srv/loopdev: UUID="59615042-c25e-4ec8-acd2-5cf407f2b55e" TYPE="xfs
  • 挂载

    1
    2
    3
    4
    [root@study ~]# mount -o loop UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" /mnt
    [root@study ~]# df /mnt
    Filesystem 1K-blocks Used Available Use% Mounted on
    /dev/loop0 520876 26372 494504

6.5 内存置换空间(swap)之建制

6.5.1 使用实体分区槽建置swap

  • 先进行分区的行为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@study ~]# gdisk /dev/vda
Command (? for help): n
Partition number (6-128, default 6):
First sector (34-83886046, default = 69220352) or {+-}size{KMGTP}:
Last sector (69220352-83886046, default = 83886046) or {+-}size{KMGTP}: +512M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
6 69220352 70268927 512.0 MiB 8200 Linux swap # 重点就是产生这东西!
Command (? for help): w
Do you want to proceed? (Y/N): y
[root@study ~]# partprobe
[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
.....(中间省略).....
`-vda6 252:6 0 512M 0 part # 确定这里是存在的才行!
# 鸟哥有简化输出喔!结果可以看到我们多了一个 /dev/vda6 可以使用于 swap 喔
  • 开始建置 swap 格式
1
2
3
4
5
6
[root@study ~]# mkswap /dev/vda6
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=6b17e4ab-9bf9-43d6-88a0-73ab47855f9d
[root@study ~]# blkid /dev/vda6
/dev/vda6: UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d" TYPE="swap"
# 确定格式化成功!且使用 blkid 确实可以抓到这个装置了喔!
  • 开始观察与加载看看吧!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@study ~]# free
total used free shared buff/cache availableMem: 1275140 227244 330124 7804 717772 875536 # 物理内存
Swap: 1048572 101340 947232 # swap 相关
# 我有 1275140K 的物理内存,使用 227244K 剩余 330124K ,使用掉的内存有
# 717772K 用在缓冲/快取的用途中。至于 swap 已经有 1048572K 啰!这样会看了吧?!
[root@study ~]# swapon /dev/vda6
[root@study ~]# free
total used free shared buff/cache available
Mem: 1275140 227940 329256 7804 717944 874752
Swap: 1572856 101260 1471596 <==有看到增加了没?
[root@study ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1048572 101260 -1
/dev/vda6 partition 524284 0 -2
# 上面列出目前使用的 swap 装置有哪些的意思!
[root@study ~]# nano /etc/fstab
UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d" swap swap defaults 0 0
# 当然要写入配置文件,只不过不是文件系统,所以没有挂载点!第二个字段写入 swap 即可。

6.5.2 使用文件建置swap

  • 使用dd这个指令来新增一个128MB的文件在/tmp底下:
1
2
3
4
5
6
7
[root@study ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128 
128+0 records in
128+0 records out
134217728 bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s

[root@study ~]# ll -h /tmp/swap
-rw-r--r--. 1 root root 128M Jun 26 17:47 /tmp/swap
  • 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式:
  • 使用 swapon 来将 /tmp/swap 启动啰!
  • 使用 swapoff 关掉 swap file,并设定自动启用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@study ~]# nano /etc/fstab 
/tmp/swap swap swap defaults 0 0
# 为何这里不要使用 UUID 呢?这是因为系统仅会查询成组设备 (block device) 不会查询文件!
# 所以,这里千万不要使用 UUID,不然系统会查不到喔!

[root@study ~]# swapoff /tmp/swap /dev/vda6
[root@study ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1048572 100380 -1
# 确定已经回复到原本的状态了!然后准备来测试!!

[root@study ~]# swapon -a
[root@study ~]# swapon -s
# 最终你又会看正确的三个 swap 出现啰!这也才确定你的 /etc/fstab 设定无误!

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

6.6.1 磁盘空间之浪费问题

​ 一个 block 只能放置一个文件, 因此太多小文件将会浪费非常多的磁盘容量。

6.6.2 利用 GNU 的 parted 进行分区行为(Optional)

​ 如果你想要将原本的 MBR 改成 GPT 分区表,或原本的 GPT 分区表改成 MBR 分区表,也能使用 parted ! 但是请不要使用 vda 来测试!因为分区表格式不能转换!因此进行底下的测试后,在该磁盘的系统应该是会损毁的!

七、文件与文件系统的压缩,打包与备份

7.1压缩文件的用途与技术

​ 计算机工程师就利用一些复杂的计算方式, 将这些没有使用到的空间『丢』出来,以让文件占用的空间变小!这就是压缩的技术

7.2 Linux常见的压缩指令

7.2.1 gzip,zcat/zmore/zless/zgrep

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[dmtsai@study ~]$ gzip [-cdtv#] 檔名 
[dmtsai@study ~]$ zcat 檔名.gz.gz
选项与参数:
-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件案的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6

范例一:找出 /etc 底下 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
[dmtsai@study ~]$ ls -ldSr /etc/* # 忘记选项意义?请自行 man 啰!
.....(前面省略).....
-rw-r--r--. 1 root root 25213 Jun 10 2014 /etc/dnsmasq.conf
-rw-r--r--. 1 root root 69768 May 4 17:55 /etc/ld.so.cache
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services

[dmtsai@study ~]$ cd /tmp
[dmtsai@study tmp]$ cp /etc/services .
[dmtsai@study tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz
[dmtsai@study tmp]$ llll /etc/services /tmp/services*
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 dmtsai dmtsai 136088 Jun 30 18:40 /tmp/services.gz

当你使用 gzip 进行压缩时,在预设的状态下原本的文件会被压缩成为 .gz 的档名,源文件就不再存在了。

1
2
3
4
范例二:由于 services 是文本文件,请将范例一的压缩文件的内容读出来! 
[dmtsai@study tmp]$ zcat services.gz
# 由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 去读取!
# 此时屏幕上会显示 servcies.gz 解压缩之后的源文件内容!
1
2
3
4
5
6
7
8
9
10
11
12
13
范例三:将范例一的文件解压缩 
[dmtsai@study tmp]$ gzip -d services.gz
# 鸟哥不要使用 gunzip 这个指令,不好背!使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件。

范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
[dmtsai@study tmp]$ gzip -9 9 -c services > services.gz

范例五:由范例四再次建立的 services.gz 中,找出 http 这个关键词在哪几行?
[dmtsai@study tmp]$ zgrep -n 'http' services.gz
14:# http://www.iana.org/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
90:http 80/udp www www-http # HyperText Transfer Protocol

7.2.2 bzip2,bzcat/bzmore/bzless/bzgrep

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[dmtsai@study ~]$ bzip2 [-cdkzv#] 檔名 
[dmtsai@study ~]$ bzcat 檔名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留源文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件案的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

范例一:将刚刚 gzip 范例留下来的 /tmp/services 以 bzip2 压缩
[dmtsai@study tmp]$ bzip2 -v services
services: 5.409:1, 1.479 bits/byte, 81.51% saved, 670293 in, 123932 out.
[dmtsai@study tmp]$ ls -l services*
-rw-r--r--. 1 dmtsai dmtsai 123932 Jun 30 18:40 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
# 此时 services 会变成 services.bz2 之外,你也可以发现 bzip2 的压缩比要较 gzip 好喔!!
# 压缩率由 gzip 的 79% 提升到 bzip2 的 81% 哩!

范例二:将范例一的文件内容读出来!
[dmtsai@study tmp]$ bzcat services.bz2

范例三:将范例一的文件解压缩
[dmtsai@study tmp]$ bzip2 -d services.bz2

范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
[dmtsai@study tmp]$ bzip2 -9 9 -c services > services.bz2

使用和gzip一模一样,压缩率要更好一些,但是对于大文件需要的时间要长

7.2.3 xz, xzcat/xzmore/xzless/xzgrep

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[dmtsai@study ~]$ xz [-dtlkc#] 檔名 
[dmtsai@study ~]$ xcat 檔名.xz.xz
选项与参数:
-d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误

-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!

范例一:将刚刚由 bzip2 所遗留下来的 /tmp/services 透过 xz 来压缩!
[dmtsai@study tmp]$ xz -v services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149

[dmtsai@study tmp]$ ls -l services*
-rw-rw-r--. 1 dmtsai dmtsai 123932 Jun 30 19:09 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
-rw-r--r--. 1 dmtsai dmtsai 99608 Jun 30 18:40 services.xz
# 各位观众!看到没有啊!!容量又进一步下降的更多耶!好棒的压缩比!

范例二:列出这个压缩文件的信息,然后读出这个压缩文件的内容
[dmtsai@study tmp]$ xz -l services.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services.xz
# 竟然可以列出这个文件的压缩前后的容量,真是太人性化了!这样观察就方便多了!

[dmtsai@study tmp]$ xzcat services.xz

范例三:将他解压缩吧!
[dmtsai@study tmp]$ xz -d services.xz

范例四:保留原文件的档名,并且建立压缩文件!
[dmtsai@study tmp]$ xz -k services

7.3 打包指令:tar

  • 压缩:

    1
    2
    3
    tar -jcv -f filename.tar.bz2 要被压缩的
    tar -jtv -f filename.tar.bz2 查 询
    tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录 解压缩:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    选项与参数: 
    -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 打包

    如果加上 -P 选项,那么文件名内的根目录就会存在喔!不过,鸟哥个人建议,还是不要加上 -P 这个选项来备份! 毕竟很多时候,我们备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中! 所以拿掉根目录后,备份数据的应用会比较有弹性!也比较安全呢!

  • 查阅内容

    1
    [root@study ~]# tar -jtv -f /root/etc.tar.bz2
  • 解压缩

    1
    2
    3
    4
    [root@study ~]# tar -jxv -f /root/etc.tar.bz2 
    [root@study ~]# ll
    ....(前面省略)....
    drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc
    • 解压缩到指定文件 -C

      1
      2
      3
      4
      5
      # 解压缩到指定文件 -C
      [root@study ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
      [root@study ~]# ll /tmp
      ....(前面省略)....
      drwxr-xr-x. 131 root root
    • 解压缩单一文件的方法

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      # 1. 先找到我们要的档名,假设解开 shadow 文件好了: 
      [root@study ~]# tar -jtv jtv -f /root/etc.tar.bz2 | grep 'shadow'
      ---------- root/root 721 2015-06-17 00:20 etc/gshadow
      ---------- root/root 1183 2015-06-17 00:20 etc/shadow-
      ---------- root/root 1210 2015-06-17 00:20 etc/shadow <==这是我们要的!
      ---------- root/root 707 2015-06-17 00:20 etc/gshadow-
      # 先搜寻重要的档名!其中那个 grep 是『撷取』关键词的功能!我们会在第三篇说明!
      # 这里您先有个概念即可!那个管线 | 配合 grep 可以撷取关键词的意思!

      # 2. 将该文件解开!语法与实际作法如下:
      [root@study ~]# tar -jxv -f f 打包檔.tar.bz2 待解待解开档开档名
      [root@study ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
      etc/shadow
      [root@study ~]# ll etc
      total 4
      ----------. 1 root root 1210 Jun 17 00:20 shadow
      # 很有趣!此时只会解开一个文件而已!不过,重点是那个档名!你要找到正确的档名。
      # 在本例中,你不能写成 /etc/shadow !因为记录在 etc.tar.bz2 内的并没有 / 之故!
  • 打包某目录,但不包含目录下的某些文件之作法 –exclude

    1
    2
    [root@study ~]# tar -jcv  -f /root/system.tar.bz2 ----exclude=/root/etc* \ 
    > ----exclude=/root/system.tar.bz2 /etc /root

    上面的指令是一整列的~其实你可以打成:『tar -jcv -f /root/system.tar.bz2 –exclude=/root/etc* –exclude=/root/system.tar.bz2 /etc /root』,如果想要两行输入时,最后面加上反斜杠 () 并立刻按下 [enter] , 就能够到第二行继续输入了。

  • 仅备份比某个时刻还要新的文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 1. 先由 find 找出比 /etc/passwd 还要新的文件 
    [root@study ~]# find /etc -newer /etc/passwd
    ....(过程省略)....
    # 此时会显示出比 /etc/passwd 这个文件的 mtime 还要新的档名,
    # 这个结果在每部主机都不相同!您先自行查阅自己的主机即可,不会跟鸟哥一样!

    [root@study ~]# ll /etc/passwd
    -rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd

    # 2. 好了,那么使用 tar 来进行打包吧!日期为上面看到的 2015/06/17
    [root@study ~]# tar -jcv jcv -f /root/etc.newer.then.passwd.tar.bz2 \
    > --newer-mtime="2015/06/17" /etc/*
    tar: Option --newer-mtime: Treating date `2015/06/17' as 2015-06-17 00:00:00
    tar: Removing leading `/' from member names
    /etc/abrt/
    ....(中间省略)....
    /etc/alsa/
    /etc/yum.repos.d/
    ....(中间省略)....
    tar: /etc/yum.repos.d/CentOS-fasttrack.repo: file is unchanged; not dumped
    # 最后行显示的是『没有被备份的』,亦即 not dumped 的意思!

    # 3. 显示出文件即可
    [root@study ~]# tar -jtv jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'v '/$'
    # 透过这个指令可以呼叫出 tar.bz2 内的结尾非 / 的檔名!就是我们要的啦!
  • 基本名称:tarfile,tarball

    如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』时,我们就称呼为 tarball (tar 球?)!

  • 特殊应用:利用管线命令与数据流

    1
    2
    3
    4
    5
    6
    7
    8
    # 1. 将 /etc 整个目录一边打包一边在 /tmp 解开 
    [root@study ~]# cd /tmp
    [root@study tmp]# tar -cvf - /etc | tar -xvf xvf -
    # 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
    # 要注意的地方在于输出档变成 - 而输入档也变成 - ,又有一个 | 存在~
    # 这分别代表 standard output, standard input 与管线命令啦!
    # 简单的想法中,你可以将 - 想成是在内存中的一个装置(缓冲区)。
    # 更详细的数据流与管线命令,请翻到 bash 章节啰!
  • 解压缩后的SELlinux课题

    SELinux 的权限问题『可能会让你的系统无法存取某些配置文件内容,导致影响到系统的正常使用权』。

    • 透过各种可行的救援方式登入系统,然后修改 /etc/selinux/config 文件,将 SELinux 改成 permissive 模式,重新启动后系统就正常了;
    • 在第一次复原系统后,不要立即重新启动!先使用 restorecon -Rv /etc 自动修复一下 SELinux 的类型即可。
    • 透过各种可行的方式登入系统,建立 /.autorelabel 文件,重新启动后系统会自动修复 SELinux 的类型,并且又会再次重新启动,之后就正常了!

7.4 XFS文件系统的备份与还原

7.4.1 XFS 文件系统备份 xfsdump

1
2
3
4
5
6
7
8
9
[root@study ~]# xfsdump [-L S_label] [-M M_label] [-l #] [-f f 备份档] ] 待备份资料 
[root@study ~]# xfsdump -I

选项与参数:
-L :xfsdump 会纪录每次备份的 session 标头,这里可以填写针对此文件系统的简易说明
-M :xfsdump 可以纪录储存媒体的标头,这里可以填写此媒体的简易说明
-l :是 L 的小写,就是指定等级~有 0~9 共 10 个等级喔! (预设为 0,即完整备份)
-f :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 装置文件名或其他一般文件档名等
-I :从 /var/lib/xfsdump/inventory 列出目前备份的信息状态
  • 用xfsdump备份完整的文件系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 先确定 /boot 是独立的文件系统喔! 
[root@study ~]# df -h /boot
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 1014M 131M 884M 13% /boot # 挂载 /boot 的是 /dev/vda 装置!
# 看!确实是独立的文件系统喔! /boot 是挂载点!

# 2. 将完整备份的文件名记录成为 /srv/boot.dump :
[root@study ~]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
# 在指令的下达方面,你也可以不加 -L 及 -M 的,只是那就会进入互动模式,要求你 enter!
# 而执行 xfsdump 的过程中会出现如上的一些讯息,您可以自行仔细的观察!

[root@study ~]# ll /srv/boot.dump
-rw-r--r--. 1 root root 102872168 Jul 1 18:43 /srv/boot.dump

[root@study ~]# ll /var/lib/xfsdump/inventory
  • 用xfsdump进行累计备份(Incremental backups)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 0. 看一下有没有任何文件系统被 xfsdump 过的资料? 
[root@study ~]# xfsdump -I
# 我们可以看到目前仅有一个 session 0 的备份资料而已!而且是 level 0 喔!

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

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

[root@study ~]# ll /srv/boot*
-rw-r--r--. 1 root root 102872168 Jul 1 18:43 /srv/boot.dump
-rw-r--r--. 1 root root 10510952 Jul 1 18:46 /srv/boot.dump1
# 看看文件大小,岂不是就是刚刚我们所建立的那个大文件的容量吗? ^_^

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

session 1:
mount point: study.centos.vbird:/boot
device: study.centos.vbird:/dev/vda2
time: Wed Jul 1 18:46:21 2015
session label: "boot_2"
session id: c71d1d41-b3bb-48ee-bed6-d77c939c5ee8
level: 1
resumed: NO
....(中间省略)....

7.4.2 XFS 文件体统还原 xfsrestore

1
2
3
4
5
6
7
8
9
10
11
12
[root@study ~]# xfsrestore -I                                             <==用来察看备份文件资料 
[root@study ~]# xfsrestore [-f f 备份档] [] [-L S_label] [-s] s] 待复原目录 <==单一文件全系统复原
[root@study ~]# xfsrestore [-f f 备份文件] ] -r r 待复原目录 <==透过累积备份文件来复原系统
[root@study ~]# xfsrestore [-f f 备份文件] ] -i i 待复原目录 <==进入互动模式
选项与参数:
-I :跟 xfsdump 相同的输出!可查询备份数据,包括 Label 名称与备份时间等
-f :后面接的就是备份档!企业界很有可能会接 /dev/st0 等磁带机!我们这里接档名!
-L :就是 Session 的 Label name 喔!可用 -I 查询到的数据,在这个选项后输入!
-s :需要接某特定目录,亦即仅复原某一个文件或目录之意!
-r :如果是用文件来储存备份数据,那这个就不需要使用。如果是一个磁带内有多个文件,
需要这东西来达成累积复原
-i :进入互动模式,进阶管理员使用的!一般我们不太需要操作它!
  • 用xfsrestore观察xfsdump后的备份数据内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@study ~]# xfsrestore -I
file system 0:
fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c
session 0:
mount point: study.centos.vbird:/boot
device: study.centos.vbird:/dev/vda2
time: Wed Jul 1 18:43:04 2015
session label: "boot_all"
session id: 418b563f-26fa-4c9b-98b7-6f57ea
pathname: /srv/boot.dump
mfile size: 102872168
media label: "boot_all"
session 1:
mount point: study.centos.vbird:/boot
device: study.centos.vbird:/dev/vda2
time: Wed Jul 1 18:46:21 2015
session label: "boot_2"
session id: c71d1d41-b3bb-48ee-bed6-d77c939c5ee8
level: 1
pathname: /srv/boot.dump1
mfile size: 10510952
media label: "boot_2"
xfsrestore: Restore Status: SUCCESS
# 鸟哥已经将不重要的项目删除了,所以上面的输出是经过经简化的结果!
# 我们可以看到这个文件系统是 /boot 载点,然后有两个备份,一个 level 0 一个 level 1。
# 也看到这两个备份的资料他的内容大小!更重要的,就是那个 session label 喔!
  • 简单复原level 0的文件系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 直接将数据给它覆盖回去即可! 
[root@study ~]# xfsrestore -f /srv/boot.dump -L boot_all /boot
# 2. 将备份资料在 /tmp/boot 底下解开!

[root@study ~]# mkdir /tmp/boot
[root@study ~]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot
[root@study ~]# du -sm /boot /tmp/boot
109 /boot
99 /tmp/boot
# 咦!两者怎么大小不一致呢?没关系!我们来检查看看!

[root@study ~]# diff -r /boot /tmp/boot
Only in /boot: testing.img
# 看吧!原来是 /boot 我们有增加过一个文件啦!
# 3. 仅复原备份档内的 grub2 到 /tmp/boot2/ 里头去!
[root@study ~]# mkdir /tmp/boot2
[root@study ~]# xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2
  • 复原累积备份资料
1
2
# 继续复原 level 1 到 /tmp/boot 当中! 
[root@study ~]# xfsrestore -f /srv/boot.dump1 /tmp/boot
  • 仅还原部分文件的xfsrestore互动模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 1. 先进入备份文件内,准备找出需要备份的文件名数据,同时预计还原到 /tmp/boot3 当中! 
[root@study ~]# mkdir /tmp/boot3
[root@study ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot3
========================== subtree selection dialog ==========================


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

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

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

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

7.5 光盘写入工具

  • 先将所需要备份的数据建置成为一个映像档(iso),利用 mkisofs 指令来处理;
  • 将该映像文件刻录至光盘或 DVD 当中,利用 cdrecord 指令来处理。

7.5.1 mkisofs:建立映像档

  • 制作一般数据光盘映像文件 mkisofs
1
2
3
4
5
6
7
8
9
10
[root@study ~]# mkisofs [-o o 映像档] [] [-Jrv] [-V vol] [-m file] 待备份文件份文件... ... \ 
> -graft-point isodir=systemdir ...
选项与参数:
-o :后面接你想要产生的那个映像档档名。
-J :产生较兼容于 windows 机器的文件名结构,可增加文件名长度到 64 个 unicode 字符
-r :透过 Rock Ridge 产生支持 Unix/Linux 的文件数据,可记录较多的信息(如 UID/GID 等) ;
-v :显示建置 ISO 文件的过程
-V vol :建立 Volume,有点像 Windows 在文件总管内看到的 CD title 的东西
-m file :-m 为排除文件 (exclude) 的意思,后面的文件不备份到映像档中,也能使用 * 通配符喔
-graft-point:graft 有转嫁或移植的意思,相关资料在底下文章内说明。

​ 光盘的格式一般称为 iso9660 ,这种格式一般仅支持旧版的 DOS 檔名,亦即檔名只能以 8.3 (文件名 8 个字符,扩展名 3 个字符) 的方式存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@study ~]# ll -h /tmp/system.img 
-rw-r--r--. 1 root root 117M Jul 2 18:48 /tmp/system.img

[root@study ~]# mount -o loop /tmp/system.img /mnt
[root@study ~]# df -h /mnt
Filesystem Size Used Avail Use% Mounted on

/dev/loop0 117M 117M 0 100% /mnt

[root@study ~]# ls /mnt
abrt festival mail.rc rsyncd.conf
adjtime filesystems makedumpfile.conf.sample rsyslog.conf
alex firewalld man_db.conf rsyslog.d
# 看吧!一堆数据都放置在一起!包括有的没有的目录与文件等等!

[root@study ~]# umount /mnt
# 测试完毕要记得卸除!
  • -graft-point
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@study ~]# mkisofs -r r -V 'linux_file' -o /tmp/system.img \ 
> -m /root/etc -graft-point /root=/root /home=/home /etc=/etc
[root@study ~]# ll -h /tmp/system.img
-rw-r--r--. 1 root root 92M Jul 2 19:00 /tmp/system.img
# 上面的指令会建立一个大文件,其中 -graft-point 后面接的就是我们要备份的数据。
# 必须要注意的是那个等号的两边,等号左边是在映像文件内的目录,右侧则是实际的数据。

[root@study ~]# mount -o loop /tmp/system.img /mnt/mnt
[root@study ~]# ll /mnt
dr-xr-xr-x. 131 root root 34816 Jun 26 22:14 etc
dr-xr-xr-x. 5 root root 2048 Jun 17 00:20 home
dr-xr-xr-x. 8 root root 4096 Jul 2 18:48 root
# 瞧!数据是分门别类的在各个目录中喔这样了解乎?最后将数据卸除一下:

[root@study ~]# umount /mnt
  • 制作修改可开机光盘映像档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、先观察一下这片光盘里面有什么东西
[root@study ~]# isoinfo -d -i /home/CentOS-7-x86_64-Minimal-15031503-01.iso
2、开始挂载这片光盘到 /mnt 并将完整的数据复制到/srv/newcd中去
[root@study ~]# mount /home/CentOS-7-x86_64-Minimal-15031503-01.iso /mnt
[root@study ~]# mkdir /srv/newcd
[root@study ~]# rsync -a /mnt/ /srv/newcd
[root@study ~]# ll /srv/newcd/
-rw-r--r--. 1 root root 16 Apr 1 07:11 CentOS_BuildTag
# rsync 可以完整的复制所有的权限属性等数据,也能够进行镜像处理!相当好用的指令喔!
# 这里先了解一下即可。现在 newcd/ 目录内已经是完整的映像档内容!
# 3. 假设已经处理完毕你在 /srv/newcd 里面所要进行的各项修改行为,准备建立 ISO 檔!
[root@study ~]# ll /srv/newcd/isolinux/
[root@study ~]# cd /srv/newcd
[root@study newcd]# mkisofs -o /custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \
> -no-emul-boot -V 'CentOS 7 x86_64' -bootboot-loadload-size 4 -bootboot-infoinfo-table table -R R -J J -v v -T .

此时你就有一个 /custom.img 的文件存在,可以将该光盘刻录出来啰!就这么简单!

7.5.2 cdrecord:光盘刻录工具

Centos 7使用的是wodim文字界面来进行刻录行为的,不过为了兼容旧版依然可以使用cdrecord,建议使用wodim。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@study ~]# wodim ----devices dev=/dev/sr0...               <==查询刻录机的 BUS 位置 
[root@study ~]# wodim -v dev=/dev/sr0 blank=[fast|all] <==抹除重复读写片
[root@study ~]# wodim -v dev=/dev/sr0 -format <==格式化 DVD+RW
[root@study ~]# wodim -v dev=/dev/sr0 [可用可用选项选项功能功能] file.iso
选项与参数:
--devices :用在扫瞄磁盘总线并找出可用的刻录机,后续的装置为 ATA 接口
-v :在 cdrecord 运作的过程中,显示过程而已。
dev=/dev/sr0 :可以找出此光驱的 bus 地址,非常重要!
blank=[fast|all]:blank 为抹除可重复写入的 CD/DVD-RW,使用 fast 较快,all 较完整
-format :对光盘片进行格式化,但是仅针对 DVD+RW 这种格式的 DVD 而已;
[可用选项功能] 主要是写入 CD/DVD 时可使用的选项,常见的选项包括有:
-data :指定后面的文件以数据格式写入,不是以 CD 音轨(-audio)方式写入!
speed=X :指定刻录速度,例如 CD 可用 speed=40 为 40 倍数,DVD 则可用 speed=4 之类
-eject :指定刻录完毕后自动退出光盘
fs=Ym :指定多少缓冲存储器,可用在将映像档先暂存至缓冲存储器。预设为 4m,
一般建议可增加到 8m ,不过,还是得视你的刻录机而定。

针对 DVD 的选项功能:
driveropts=burnfree :打开 Buffer Underrun Free 模式的写入功能
-sao :支持 DVD-RW 的格式
  • 检测你刻录机所在位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@study ~]# ll /dev/sr0 
brw-rw----+ 1 root cdrom 11, 0 Jun 26 22:14 /dev/sr0 # 一般 Linux 光驱文件名!

[root@study ~]# wodim ----devices dev=/dev/sr0
-------------------------------------------------------------------------
0 dev='/dev/sr0' rwrw-- : 'QEMU' 'QEMU DVD-ROM'
-------------------------------------------------------------------------

[root@demo ~]# wodim ----devices dev=/dev/sr0
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
0 dev='/dev/sr0' rwrw-- : 'ASUS' 'DRW-24D1ST'
-------------------------------------------------------------------------
# 你可以发现到其实鸟哥做了两个测试!上面的那部主机系统是虚拟机,当然光驱也是仿真的,没法用。
# 因此在这里与底下的 wodim 用法,鸟哥只能使用另一部 Demo 机器测试给大家看了!
  • 进行CD/DVD的刻录动作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 0. 先抹除光盘的原始内容:(非可重复读写则可略过此步骤) 
[root@demo ~]# wodim -v dev=/dev/sr0 blank=fast
# 中间会跑出一堆讯息告诉你抹除的进度,而且会有 10 秒钟的时间等待你的取消!

# 1. 开始刻录:

[root@demo ~]# wodim -v v dev=/dev/sr0 speed=4 -dummy -eject /tmp/system.img

# 2. 刻录完毕后,测试挂载一下,检验内容:
[root@demo ~]# mount /dev/sr0/mnt
[root@demo ~]# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
Filesystem Size Used Avail Use% Mounted on
/dev/sr0 87M 87M 0 100% /mnt

[root@demo ~]# ll /mnt
dr-xr-xr-x. 135 root root 36864 Jun 30 04:00 etc
dr-xr-xr-x. 19 root root 8192 Jul 2 13:16 root

[root@demo ~]# umount /mnt <==不要忘了卸除

7.6 其他常见的压缩和备份工具

7.6.1 dd

​ dd最大功能是用来备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@study ~]# 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 当中
[root@study ~]# dd if=/etc/passwd of=/tmp/passwd.back
4+1 records in
4+1 records out
2092 bytes (2.1 kB) copied, 0.000111657 s, 18.7 MB/s
[root@study ~]# ll /etc/passwd /tmp/passwd.back
-rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd
-rw-r--r--. 1 root root 2092 Jul 2 23:27 /tmp/passwd.back
# 仔细的看一下,我的 /etc/passwd 文件大小为 2092 bytes,因为我没有设定 bs ,
# 所以默认是 512 bytes 为一个单位,因此,上面那个 4+1 表示有 4 个完整的 512 bytes,
# 以及未满 512 bytes 的另一个 block 的意思啦!事实上,感觉好像是 cp 这个指令啦~

范例二:将刚刚刻录的光驱的内容,再次的备份下来成为映像挡
[root@study ~]# dd if=/dev/sr0 of=/tmp/system.iso
177612+0 records in
177612+0 records out
90937344 bytes (91 MB) copied, 22.111 s, 4.1 MB/s
# 要将数据抓下来用这个方法,如果是要将映像文件写入 USB 磁盘,就会变如下一个范例啰!

范例三:假设你的 USB 是 /dev/sda 好了,请将刚刚范例二的 image 刻录到 USB 磁盘中
[root@study ~]# lsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 2G 0 disk # 确实是 disk 而且有 2GB 喔!

[root@study ~]# dd if=/tmp/system.iso of=/dev/sda
[root@study ~]# mount /dev/sda /mnt
[root@study ~]# ll /mnt
dr-xr-xr-x. 131 root root 34816 Jun 26 22:14 etc
dr-xr-xr-x. 5 root root 2048 Jun 17 00:20 home

dr-xr-xr-x. 8 root root 4096 Jul 2 18:48 root
# 如果你不想要使用 DVD 来作为开机媒体,那可以将映像档使用这个 dd 写入 USB 磁盘,
# 该磁盘就会变成跟可开机光盘一样的功能!可以让你用 USB 来安装 Linux 喔!速度快很多!

范例四:将你的 /boot 整个文件系统透过 dd 备份下来
[root@study ~]# df -h /boot
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 1014M 149M 866M 15% /boot # 请注意!备份的容量会到 1G 喔!
[root@study ~]# dd if=/dev/vda2 of=/tmp/vda2.img
[root@study ~]# ll -h /tmp/vda2.img
-rw-r--r--. 1 root root 1.0G Jul 2 23:39 /tmp/vda2.img
# 等于是将整个 /dev/vda2 通通捉下来的意思~所以,文件容量会跟整颗磁盘的最大量一样大!

CATALOG
  1. 1. 一、主机的规划与磁盘分区
    1. 1.1. 1、linux与硬件的搭配
    2. 1.2. 2、磁盘分区
  2. 2. 二、安装centos7
  3. 3. 三、首次登入与在线求助
  4. 4. 四、linux的文件权限与目录配置
    1. 4.1. (一)使用者与群组
      1. 4.1.1. 1、文件拥有者:
      2. 4.1.2. 2、群组概念:
      3. 4.1.3. 3、其他人的概念
      4. 4.1.4. 4、Linux用户身份与群组记录的文件
    2. 4.2. (二)linux文件权限概念
      1. 4.2.1. 1、linux文件按属性
        1. 4.2.1.1. 1)第一栏代表这个文件的类型与权限(permission)
        2. 4.2.1.2. 2)第二栏表示有多少档名连接到此节点(i-node)
        3. 4.2.1.3. 3)第三栏表示这个文件(或目录)的【拥有者账号】
        4. 4.2.1.4. 4)第四栏表示这个文件的所属群组
        5. 4.2.1.5. 5)第五栏为这个文件的容量大小,默认单位为bytes
        6. 4.2.1.6. 6)第六栏为这个文件的建档日期或者是最近的修改日期
        7. 4.2.1.7. 7)第七栏为这个文件的档名
      2. 4.2.2. 2、linux文件权限的重要性
      3. 4.2.3. 3、如何改变文件属性与权限
      4. 4.2.4. 4、目录与文件之权限意义
        1. 4.2.4.1. 1)权限对文件的重要性
        2. 4.2.4.2. 2)权限对目录的重要性
      5. 4.2.5. 5、Linux文件种类与扩展名
        1. 4.2.5.1. 1)文件种类
        2. 4.2.5.2. 2)Linux文件扩展名
        3. 4.2.5.3. 3)Linux文件长度的限制
        4. 4.2.5.4. 4)Linux文件名的限制
    3. 4.3. (三)Linux目录配置
      1. 4.3.1. 1、Linux的目录配置依据:FHS
        1. 4.3.1.1. 1)针对FHS,各家distributions 的异同,与 CentOS7 的变化
      2. 4.3.2. 2、目录树
      3. 4.3.3. 3、绝对路径和相对路径
      4. 4.3.4. 4、Centos 的观察
      5. 4.3.5. 5、重点
  5. 5. 五、Linux文件与目录管理
    1. 5.1. 1、目录与路径
    2. 5.2. 2、文件与目录管理
    3. 5.3. 3、文件内容查阅
    4. 5.4. 4、文件与目录的默认权限与隐藏权限
    5. 5.5. 5、指令与文件搜索
    6. 5.6. 6、复习
  6. 6. 六、Linux磁盘与文件系统
    1. 6.1. 6.1、认识Linux系统
    2. 6.2. 6.2、文件系统的简单操作
      1. 6.2.1. 6.2.1 磁盘与目录的容量
      2. 6.2.2. 6.2.2 实体链接与符号链接 ln
        1. 6.2.2.1. 1)建立实体链接 hard link
        2. 6.2.2.2. 2)Symbolic Link(符号链接,亦既是快捷方式)
    3. 6.3. 6.3、磁盘的分区、格式化、检验、挂载
      1. 6.3.1. 6.3.1 观察磁盘分区状态
      2. 6.3.2. 6.3.2 磁盘分区:gdisk/fdisk
      3. 6.3.3. 6.3.3 磁盘格式化(建置文件系统)
      4. 6.3.4. 6.3.4 文件系统检验
      5. 6.3.5. 6.3.5 文件系统的挂载与卸除
      6. 6.3.6. 6.3.6 磁盘/文件系统参数修订
    4. 6.4. 6.4 设定开机挂载
      1. 6.4.1. 6.4.1 开机挂载 /etc/fstab 及 /etc/mtab
      2. 6.4.2. 6.4.2 特殊装置loop挂载(映像档不刻录就挂载使用)
    5. 6.5. 6.5 内存置换空间(swap)之建制
      1. 6.5.1. 6.5.1 使用实体分区槽建置swap
      2. 6.5.2. 6.5.2 使用文件建置swap
    6. 6.6. 6.6 文件系统的特殊观察与操作
      1. 6.6.1. 6.6.1 磁盘空间之浪费问题
      2. 6.6.2. 6.6.2 利用 GNU 的 parted 进行分区行为(Optional)
  7. 7. 七、文件与文件系统的压缩,打包与备份
    1. 7.1. 7.1压缩文件的用途与技术
    2. 7.2. 7.2 Linux常见的压缩指令
      1. 7.2.1. 7.2.1 gzip,zcat/zmore/zless/zgrep
      2. 7.2.2. 7.2.2 bzip2,bzcat/bzmore/bzless/bzgrep
      3. 7.2.3. 7.2.3 xz, xzcat/xzmore/xzless/xzgrep
    3. 7.3. 7.3 打包指令:tar
    4. 7.4. 7.4 XFS文件系统的备份与还原
      1. 7.4.1. 7.4.1 XFS 文件系统备份 xfsdump
      2. 7.4.2. 7.4.2 XFS 文件体统还原 xfsrestore
    5. 7.5. 7.5 光盘写入工具
      1. 7.5.1. 7.5.1 mkisofs:建立映像档
      2. 7.5.2. 7.5.2 cdrecord:光盘刻录工具
    6. 7.6. 7.6 其他常见的压缩和备份工具
      1. 7.6.1. 7.6.1 dd