最近在看兄弟连2014年录制的Linux教学视频,沈超和李明这两个活宝讲得确实是精彩,顺着教学视频讲解的逻辑顺序做了一些笔记,教学视频链接https://www.bilibili.com/video/BV1mW411i7Qf,学的人挺多,每次看都有几十个人陪着一起在学。

笔者是用markdown做的笔记,不过水平太差,不是很会写markdown,格式很flat,有些地方markdown语法写得可能还有问题。管它呢,笔者能看懂就行了[汗]

兄弟连的视频教程主要是基于运维的需求进行的讲授,本文将更新至该视频教程完整16章的内容,争取一周之内更完,留作备份查询。

截至20200806,已经全部更新了10共计16章106节的教学视频笔记摘要


目录

第一章 Linux系统简介

  1. Linux与Unix的关系是son与father的关系, 学会Linux可以很容易的上手Unix

  2. Linux内核官网: www.kernel.org

  3. 主流的Linux发行版本

  • redhat系列
    • redhat: 企业版(稳定版,维护需付费)
    • CentOS: 本教程使用的版本(社区维护版本,完全免费,包括后期维护,国内互联网公司使用的最广泛的分支)
    • SuSE
    • fedora: 个人版(测试版,维护需付费)
    • gentoo linux
    • 红旗 linux
    • Mandriva
    • turbolinux
  • debian系列
    • debian
    • ubuntu: GUI界面很好
    • KNOPPIX: 无需安装, 只需要光盘或镜像就可以直接使用
  1. www.netcraft.com 好像需要翻墙
  • 可以输入域名得到该域名的网络情况和主机历史: 算是一个很好用的踩点网站
  • 发现腾讯门户和淘宝服务器都是用Linux
  • 事实上Microsoft也全部用的是Linux作为服务器, 没有用Windows
  • Linux的性能要远远优于Windows
  • andriod平台也是基于Linux的顶层设计
    • 可以在andriod手机上下载QuickSSHd, 连接到远程服务器
    • 服务器上使用SecureCRT就可以远程操控手机
  • 包括智能电器, 智能卡系统, 航空系统, 银行系统等都是用Linux完成
  1. Linux如果安装GUI会占用很大资源, 而且会增加出错的可能性

第二章 Linux系统安装

1. VMware虚拟机安装与使用

  1. 不建议装双系统, 因为容易造成数据丢失, 而且双系统实践中几乎不会涉及
  2. 很多安装教程里的截图就是在虚拟机中截屏实现的
  3. 在一台计算机上面模拟多个操作系统, 并且这些系统都可以与本机系统进行通信
  4. 安装VMware是很简单的: 安装包已经下载好在D盘了
  5. 打开VMware.exe点击新建虚拟机:
  • 进入VMware.exe后新建虚拟机选择标准
  • 选择以后安装操作系统(不要用安装盘或镜像文件)
  • 选择Linux: 选择2.6.x内核的任意一个版本都可以
    • 最好选择CentOS
  • 虚拟机名称: CentOS 6 test
  • 虚拟机位置: 准备放在F盘, 用于放置虚拟机文件
  • 虚拟机最大磁盘空间: 一般20G左右就足够了
  • 虚拟磁盘拆分成多个文件
  1. 新建虚拟机后在起始页后面出现一个新的标签页CentOS 6 test, 虚拟机新建
  2. 单击菜单中的虚拟机–>设置:
  • 内存不能超过真实内存的一半: 一般来说为了GUI不能少于628M, 一般来说1~2G基本足够
  • 虚拟机的处理机数量和核数都可以跟主机同样的配置: 当然1+1也可以
  • 硬盘: 可以继续添加硬盘
  • 光驱: ISO镜像, 注意勾上右上的"打开电源时连接"(相当于给光驱通电源), 然后选择ISO镜像
    • 然后去读取光驱就可以了
    • CenOS-6.3有两张DVD盘, 只要第一个盘就可以了, 相当于将光盘放入
  • 网络适配器: 后期再设置
  1. 到目前为止相当于分配个硬盘内存再把光盘放入光驱, 目前结束
  2. 小技巧:
  • 点击工具栏中的小钟表, 就可以将虚拟机快照保存下来, 下次直接读取快照就可以到启动后的状态, 相当于恢复备份
  • 点击工具栏中的小扳手, 就可以恢复快照, 但是真正的服务器是没有快照的功能的
  • 真正的Linux仍然需要备份, 而非快照;
  • 点击菜单中的虚拟机–>快照
  • 虚拟机–>管理–>克隆, 实际上克隆机并不会跟原始机有同样的大小, 会比原始机小很多
    • 如果删除了原始机, 克隆机就没用了, 克隆机只是原始机的一个镜像
  • 开始里可以挂起, 相当于睡眠的效果

2. 系统分区: 理论知识

  1. 磁盘分区:
  • 主分区最多4个
  • 扩展分区只能有1个
    • 不能写入分区, 只能包含逻辑分区(即这个分区只能用于包含很多子分区)
    • 主分区+扩展分区一共最多4个
  1. 格式化: (高级格式化, 逻辑格式化)
  • 指根据用户选定的文件系统(FAT16 FAT32 NTFS EXT2 EXT3 EXT4)在分区中写入固定的数据(如文件分配表等)
  1. 硬件设备文件名:
  • WINDOWS: 分区–>格式化–>分配盘符就可以使用了
  • LINUX: 多一步分配设备文件名, 即每个外接设备都用以文件形式管理
  • IDE硬盘: /dev/hd[a-d]
  • SCSI/SATA/USB硬盘: /dev/sd[a-p]
  • 光驱: /dev/cdrom或者sr0
  • 软盘: /dev/fd[0-1]
  • 打印机(25针): /dev/lp[0-2]
  • 打印机(USB): /dev/usb/lp[0-15]
  • 鼠标: /dev/mouse
  1. 分区设备文件名: 在硬盘后直接加分区号
  • /dev/hda[1-9]: IDE硬盘: 133MB/s
  • /dev/sda[1-9]: SCSI/SATA硬盘接口: 200~500MB/s
  • 注意逻辑分区永远从5开始标起, 即便主分区没有到4个, 因此是sda5是第一个逻辑分区
  1. 挂载: 理论上任何一个空的文件名都可以当作盘符, 给每个分区分配挂载点, 挂载点必须是一个空目录
  • 必须分区: 一定要存在的分区
    • / 根分区
    • swap分区: 交换分区, 内存2倍, 不超过2GB(这个好像是虚拟内存)
  • 推荐分区: 最好有的分区
    • /boot 启动分区, 200MB, 保存启动时需要使用的文件, 防止系统存储不够而无法启动

3. Linux系统安装

  1. 虚拟机设置:
  • CD/DVD(IDE)–>使用ISO镜像文件–>浏览(去CENTOS官网下载镜像,6.3的镜像有两个,4G+1G,装4G就可以了)
  • 此时相当于给导入光盘
  • 启动后按F2进入BIOS: 将硬盘启动改成光盘启动
    • 鼠标点进VMware界面就进去了, Ctrl+Alt就切换出到主机界面
    • 进入BOOT菜单里将CD-ROM按’+'号把它搞到最上面
    • 注意退出Exit时选择leave without change
      • 但是真实服务器不会有这种功能, 只能第一次安装时选择leave save
      • 第二次再来BIOS修改为硬盘启动
  1. 安装欢迎界面
  • Ctrl+Alt+回车
  • 安装语言: 简体中文/English
  • 键盘: 美国英语式键盘
  • 勾选’基本存储设备’, 而非’指定存储设备’
  • 主机名: 使用默认的主机名(localhost.localdomain)
    • Linux无所谓主机名, Windows在局域网内不能使用同样的主机名进行通讯
  • 时区: 亚洲/上海
  • 设置密码:
    • 复杂性: 八位字符以上, 大小写字母, 数字, 符号, 不能是英文单词, 不能是和用户相关的内容
    • 易记忆性
    • 时效性
  • 勾选’创建自定义布局’: 出于学习目的
    • 生成分区–>标准分区
    • 挂载点: /123也可以
      • sda1 ext4–>/boot–>固定大小(200MB): boot分区一定是sd1分区, 因为与启动相关的一定在硬盘的头部
      • sda2 swap–>没有盘符–>固定大小(1GB): swap分区对系统影响很小
      • sda3 ext4–>/home–>固定大小(2GB): 非必要分区, 一般用于下载的存储
      • ext4–> / -->自动计算根分区大小:
  • 下一步: 跳出格式化对话框, 确认
  • 下一步: 引导程序默认
  1. 软件包选择:
  • Desktop 桌面(个人用户)
  • Minimal Desktop 最小化桌面
  • Minimal 最小化安装(服务器一般都选择这个)
  • Basic Server 基本服务器
  • Database Server 数据库服务器
  • Web Server 网页服务器
  • Virtual Host 虚拟主机
  • software Development Workstation 软件开发模式
  • 学习时按照’Basic Server 基本服务器’安装
    • 很熟悉linux的可以用minimal安装
  • 可以自定义安装, 很难, 需要很熟悉, 勾选’以后自定义’
  • 下一步就安装好了, 点击重新引导(重启)
    • 如果是真实机需要F2进入BIOS改成硬盘启动而非CDROM光盘启动
  • root + 密码登录
  1. 安装日志: 根目录下的初始文件
  • /root/install.log 安装系统中的软件包及其版本信息
  • /root/install.log.syslog 安装过程中的事件记录
  • /root/anaconda-ks.cfg 以Kickstart配置文件的格式记录安装过程中设置的选项信息
    • 无人监管安装, 用这个文件可以实现自动安装

4. 远程登录管理工具

  1. 虚拟机设置–>网络适配器
  • 设备状态: 已连接+打开电源时连接
  • 网络连接:
    • 桥接: 使用真实网卡与主机进行通讯连接, 非常简单, 但是需要占用IP
    • NAT或HOST only: 虚拟网卡, 只能和主机通信, 但是NAT是可以连接互联网的
  • 没有联网的情况下用NAT或HOST only
    • ifconfig配置: 默认会有一块网卡lo, 网卡的命名是 eth0 eth1 以此类推
      • ifconfig 查看网络配置信息
      • ifconfig eth0 192.168.110.2
    • cmd --> ping 192.168.118.2
  • 在有网线的情况下一般都是用桥接: 不勾选复制到…
    • ifconfig eth0 192.168.1.156
    • cmd --> ping 192.168.1.156
  • ifconfig是临时修改, 永久修改要到配置文件中改
  • 注意桥接时是默认桥接, 如果你是有线有可能会桥接到无线上
    • 修改虚拟网络编辑器
  • ifconfig改IP地址后当然会在远程连接时断开连接
  1. SecureCRT远程连接管理工具: 应该putty也可以
  2. Winscp文件拷贝工具: 应该filezilla也可以

第三章 Linux初学者手册

1. 学习Linux的注意事项

  1. Linux命令与文件名称都是区分大小写的
  2. Linux系统中所有内容都是以文件形式存储, 包括硬件
  • 硬盘文件是/dev/sd[a-p]
  • 光盘文件是/dev/sr0等
  • 一切永久保存的配置都是用文件而非修改内存中的变量
  1. Linux系统中的文件一般都没有扩展名
  • 不靠扩展名区分文件类型, 而是权限
  • 一些约定俗成的扩展名:
    • 压缩包: .gz .bz2 .tar.bz2 .tgz
    • 二进制软件包: .rpm
    • 网页文件: .html .php
    • 脚本文件: .sh
    • 配置文件: .conf
  • 因此很多windows的病毒无法在linux中运行
    • 因为识别不出来用什么程序运行
  1. Linux所有的存储设备都必须挂载后用户才能使用, 包括硬盘, U盘, 光盘
  • Windows在分配盘符时就是挂载
  • Windows下的程序不能直接在Linux中安装和运行

2. 服务器管理和维护建议

  1. Linux各目录的作用:
  • /bin/: 存放系统命令的目录, 普通用户和超级用户都可以执行, 在单用户模式(类似WIN的安全模式)下也可以执行
  • /sbin/: 保护和系统环境设置相关的命令, 只有超级用户可以使用使用这些命令修改环境设置, 有些命令可以允许普通用户查看
  • /usr/bin/: 存放系统命令的目录, 普通用户和超级用户都可以执行, 在单用户模式下不可以执行
  • /usr/sbin/: 存放根目录系统不必要的系统管理命令, 例如多数服务程序, 只有超级用户可以使用
  • /boot/: 系统启动目录, 保存系统启动相关的文件, 如内核文件和启动引导程序(grub)文件
  • /dev/: 设备文件保存位置
  • /etc/: 配置文件保存位置, 如用户账户密码, 默认安装方式等
  • /home/: 普通用户的家目录, /home/user1类似
  • /lib/: 系统调用的函数库保存位置
  • /lost+found/: 系统意外崩溃关机而产生一些文件碎片放在此处, 系统启动时fsck工具会检查这里, 并修复已经损坏的文件系统, 每个分区中都会有一个这个目录如/boot/lost+found/
  • /media/: 挂载目录, 一般挂载媒体设备, 例如软盘和光盘
  • /mnt/: 挂载目录, 早期只有这一个, 可以/mnt/usb/ /mnt/media/ /mnt/cdrom/这样多挂载
  • /misc/: 挂载目录, 用于挂载NFS服务和共享目录
  • /opt/: 第三方安装的软件保存位置, 也可以安装在/usr/local中
  • /proc/: 虚拟文件系统, 此处的文件只保存在内存中而非硬盘
  • /sys/: 虚拟文件系统, 此处的文件只保存在内存中而非硬盘
  • /root/: 超级用户家目录
  • /srv/: 服务数据目录
  • /tmp/: 临时目录, 每次开机最好清空
  • /usr/: 系统软件资源目录(Unix Software Resource)
  • /var/: 动态数据保存位置, 一般保存缓存日志以及软件运行产生的文件
  1. 服务器注意事项
  • 远程服务器不允许关机(因为服务器可能离你很远), 只能重启
  • 重启时应该关闭服务
  • 不要在服务器访问高峰运行高负载命令
    • 如大数据的拷贝压缩以及全盘扫描查找等
  • 远程配置防火墙时不要把自己提踢出服务器
  • 指定合理的密码规范并定期更新
  • 合理分配权限: 越少越好, 够用就行
  • 定期备份重要数据和日志

第四章 Linux常用指令

1. 文件处理命令

1.1 命令格式与目录处理命令 ls

  1. 命令格式: 命令 [-选项] [参数]
  • ls -la /etc
  • 个别命令使用不遵循此格式
  • 当有多个选项时, 可以写在一起
  • 简化选项与完整选项
    • -a 等价于 --all
  1. ls: 列出路径下的内容
  • 路径: /bin/ls
  • 权限: 所有用户
  • 功能描述: 显示目录文件
  • 语法: ls [-ald] [文件或目录]
    • -a: 显示所有文件包括隐藏文件(以’.'开头的文件是隐藏文件,一般是系统文件不让碰)
    • -l: 显示详细信息, 包括引用次数计数, 所有者(初始为创建者,可转让,永远只有1个), 所属组, 文件大小(默认单位是bit), 最后修改时间, 文件名
    • -d: 查看当前目录详细属性而非目录下的信息
    • -h: 一般是-lh, 可以使得-l显示的详细信息中的文件大小是K/M/G的单位
    • -i: 查看目录下文件的id, 唯一标识符
  • 文件类型: ls -l输出的开头是 '-'是文件 'd’是文件夹 'l’是软链接
  • ugo: 所有者 所属组 其他人
    • rw- r-- r-- 是权限信息: r读w写x执行

1.2 目录处理命令: mkdir, cd, pwd

  1. mkdir
  • 路径: /bin/mkdir
  • 权限: 所有用户
  • 语法: mkdir [-p] [目录路径1] [目录路径2] [目录路径3]…
    • -p: 递归创建, 好像这个dos命令里没有这个
    • 同样dos是没有一次性生成多个目录的命令的
  1. cd: 切换目录
  • shell内置命令
  • 权限: 所有用户
  • cd … 回到上级目录
  • cd [路径] 切换到指定目录
  1. pwd: 显示当前目录
  • 路径: /bin/pwd
  • 权限: 所有用户
  • 无需参数
  1. rmdir: 删除空目录(基本无用的命令)
  • 路径: /bin/rmdir
  • 权限: 所有用户
  • 语法: rmdir [路径]
  1. cp: 复制目录/文件
  • 路径: /bin/cp
  • 权限: 所有用户
  • 语法: cp [-rp] [文件或目录1] [文件或目录2] … [文件或目录n] [目标目录]
    • -r: 复制目录
    • -p: 保留文件属性, 如保持文件最后修改时间等
  • 可以同时复制多个文件或目录
  1. mv: 剪切/重命名
  • 路径: /bin/mv
  • 权限: 所有用户
  • 语法: mv [文件或目录] [目标目录]
    • mv /tmp/japan/cangjing /root # 复制文件夹cangjing到/root下
    • mv /tmp/japan/cangjing /root/nvshen # 把cangjing复制到/root下改名成nvshen
    • mv cangjing canglaoshi 把cangjing文件夹的文件名改成canglaoshi
  • 与cp一样可以同时移动多个
  1. rm: 删除目录/文件
  • 路径: /bin/mv
  • 权限: 所有用户
  • 语法: rm [-rfm] [文件或目录]
    • -rf: 强制删除
    • -m: 删除目录
    • rm -rf / # 删库跑路
    • rm -rf /etc #

1.3 文件处理命令

  1. touch: 创建空文件
  • 路径: /bin/touch
  • 权限: 所有用户
  • 语法: touch [文件名1] [文件名2] … [文件名3]
    • 不建议带空格的文件名以及目录名, 否则需要用双引号(同dos)
  1. cat: 显示文件内容
  • 路径: /bin/cat
  • 权限: 所有用户
  • 语法: cat [-n] [文件名]
    • -n: 显示行号
    • 不适合查看长文件, 只能查看最后一页
  1. tac: 显示文件内容(倒序显示)
  • 路径: /bin/tac
  • 权限: 所有用户
  • 用法同cat
  1. more: 分页显示文件内容
  • 路径: /bin/more
  • 权限: 所有用户
  • 用法: more [文件名]
    • 空格/f: 翻页
    • Enter: 换行
    • q: 退出
  1. less: 分页显示文件内容(可以返回上一页)
  • 路径: /usr/bin/less
  • 权限: 所有用户
  • 用法: less [文件名]
    • 空格/f: 翻页
    • Enter: 换行
    • q: 退出
    • pageup: 返回上一页
    • 方向键↑: 返回上一行
    • 搜索: 输入 /<关键词> 即可
      • 按n可以获取下一处匹配
  • less应该可以完全取代more
  1. head: 显示文件开头几行
  • 路径: /usr/bin/head
  • 权限: 所有用户
  • 用法: head -n [行数] [文件名]
    • 显示文件的前20行: head -n 20 /etc/services
    • 默认10行
  1. tail: 显示文件最后几行
  • 路径: /usr/bin/tail
  • 权限: 所有用户
  • 用法: tail [-nf] [行数] [文件名]
    • 显示文件的末尾20行: tail -n 20 /etc/services
    • -f: 动态显示文件末尾内容, 如果修改了文件内容会动态更新
      • 如监控日志

1.4 链接命令

  1. ln: 生成链接文件
  • 路径: /bin/ln
  • 权限: 所有用户
  • 语法: ln [-s] [原文件] [目标文件]
    • -s: 生成软链接, 不加选项是硬链接
  • 软链接就是快捷方式
    • ls -l 显示的是lrwxrwxrwx, 这意味着所有用户对该软链接文件有所有信息
    • 软链接很小, 本质上打开原文件
  • 硬链接
    • ls -l 显示的结果与原文件基本没有差别
    • 硬链接与原文件会同步更新, 类似是一个备份
    • echo “www.lampbrother.net” >> /etc/issue # 更新一个文件
  • 硬链接与软链接的区别:
    • 如果删除原文件, 软链接当然无效, 硬链接永远有效
    • 使用ls -i查看标识符(i节点), 硬链接的i节点与原文件相同, 软链接则不同
    • 其实硬链接用的非常的少, 类似git
    • 硬链接不能跨分区目录: 如/tmp下的文件不能在/boot里创建硬链接, 软链接则可以
    • 软链接文件的ls -l的开头是l, 硬链接与原文件相同

2. 权限管理命令

2.1 权限管理命令chmod

  1. chmod: 更改文件权限/目录权限
  • 路径: /bin/chmod
  • 权限: 所有者和root
  • 语法1: chmod [{ugoa}{±=}{rwx}] [-R] [文件或目录]
    • chmod u+x Janpanlovestory.list # 给所有者增加执行权限
    • chmod g+w,o-r Janpanlovestory.list # 给所有组增加写入权限, 给其他人去除读取权限
    • chmod g=rwx Janpanlovestory.list # 给所有组读取, 写入, 执行权限
  • 语法2: chmod [mode=421] [-R] [文件或目录]
    • 用整型数表示rwx: r:4,w:2,x:1
    • rwx:7,rw:6, 即求和
    • rwx-rw-x: 用761表示, 532表示rx-wx-x
    • chmod 640 Janpanlovestory.list
    • -R表示是递归修改: 将目录下所有的子容器都修改权限
  • rwx权限深入理解:
    • r: 读取权限, 可以查看文件内容 | 可以列出目录中的内容
    • w: 写入权限, 可以修改文件内容 | 可以在目录中创建删除文件
    • x: 执行权限, 可以执行文件 | 可以进入目录

2.2 其他权限管理命令

  1. chown: 改变文件或目录的所有者
  • 路径: /bin/chown
  • 权限: root, 即便是所有者也没有权限
  • 语法: chown [用户] [文件或目录]
    • chown shenchao fengjie # 将fengjie文件夹的所有者改为shenchao
  1. chgrp: 改变文件或目录的所属组
  • 路径: /bin/chgrp
  • 权限: root, 即便是所有者也没有权限
  • 语法: chown [用户组] [文件或目录]
    • chown lampbrother fengjie # 将fengjie文件夹的所属组改为lampbrother
  1. umask: 显示, 设置文件的缺省权限
  • 路径: shell内置命令
  • 权限: 所有用户
  • 语法: umask [-S]
    • -S: 以rwx形式显示新建文件缺省权限, umask -S即可
    • umask 077 # 则新建的文件是
  • linux中默认新建文件对任何用户不会有执行权限, 因此即便用umask设置了执行权限实际也不会有的

3. 文件搜索命令

3.1 find命令

  1. find: 文件搜索
  • 路径: /bin/find
  • 权限: 所有用户
  • 语法: find [搜索范围] [匹配条件]
    • find /etc -name init # 在目录/etc中查找文件init(必须精确的是init, 而非包含init)
    • find /etc -name init # 在目录/etc中查找文件init(包含init即可,*为通配符匹配任意数量字符)
    • find /etc -name init* # 在目录/etc中查找文件init(以init开头)
    • find /etc -name init??? # 在目录/etc中查找文件init(以init开头且后面是3个字母, ?为通配符匹配单个字符)
    • find /etc -iname init # 不区分大小写的查找init
    • find /etc -size +204800 # 查找大于100MB的文件: 注意linux系统每个数据块是0.5k, 因此100MB等于204800个数据块
      • +n: 大于
      • -n: 小于
      • n: 等于, 极少使用
    • find /etc -user shenchao # 查找所有者为shenchao的文件
    • find /etc -cmin -5 # 在/etc下查找5分钟内被修改过属性的文件和目录
    • find /etc -amin -5 # 在/etc下查找5分钟内被访问过的文件和目录
    • find /etc -mmin -5 # 在/etc下查找5分钟内被修改过内容的文件和目录
      • +5 -5 5 同 -size的意思
    • find /etc -size +163840 -a -size -204800 # 80MB~100MB的文件
      • -a: 表示and
      • -o: 表示or
    • find /etc -name inittab -exec ls -l {} ; # 在/etc下查找inittab文件并显示详细信息
      • -exec/-ok [命令] {}; 对搜索结果执行操作, {}是把之前的结果放进来, \是转义符, ;是结束
    • find /etc -type f # 只查找文件
    • find /etc -type d # 只查找目录
    • find /etc -type l # 只查找软链接
    • find . -inum 31531 -exec rm {} ; # 在当前目录下查找i节点是31531的文件并删除
      • 用inum可以查找当前文件的所有硬链接

3.2 其他文件搜索命令

  1. locate: 在文件资料库ntfs中查找文件, 比find要快得多
  • 路径: /usr/bin/locate
  • 权限: 所有用户
  • 语法: locate [-i] [文件名]
    • locate inittab # 查找文件名中包含inittab的
    • -i: 不区分大小写查找
  • 但是新建的文件不在文件资料库中就查找不到
    • 使用updatedb命令来更新文件资料库
    • 但是/tmp目录下的文件是不在文件资料库中
  1. which: 搜索命令所在目录及别名信息, 比find高效
  • 路径: /usr/bin/which
  • 权限: 所有用户
  • 语法: which [命令名称]
    • which ls # 查找ls命令所在的绝对路径
    • which rm # rm的别名是"rm -i", -i是询问确认的选项
  1. whereis: 搜索命令所在目录及帮助文档路径, 一般都在/usr/share/man目录下
  • 路径: usr/bin/whereis
  • 权限: 所有用户
  • 语法: whereis [命令名称]
    • whereis ls
  1. grep: 在文件中搜寻字串匹配的行并输出
  • 路径: /bin/grep
  • 权限: 所有用户
  • 语法: grep [-iv] [指定字串] [文件]
    • -i: 不区分大小写
    • -v: 排除指定字串, 支持正则
    • grep mysql /root/install.log # 在安装日志里查找mysql相关的记录行
    • grep -i multiuser /etc/inittab # 不区分大小写
    • grep -v ^# /etc/inittab # 将inittab中带有#开头的行(即注释信息)都去掉然后显示

4. 帮助命令

  1. man: 获得帮助信息
  • 路径: /usr/bin/man
  • 权限: 所有用户
  • 语法: man [命令名称/配置文件名称(不需要绝对路径)]
    • man ls
    • man services # 查看配置文件services的帮助信息(网络配置)
      • 等价于more /etc/services
    • man passwd # passwd很特殊, 它既是一个命令, 而且还是一个配置文件名称, 因此man后既会输出配置信息,
      • 1: 命令的帮助
      • 5: 配置文件的帮助
      • man 1 passwd
      • man 5 passwd
  • 与more的用法差不多, 可以换行翻页, 且"/{}".format可以查找内容
  1. whatis: 获取命令的简短信息
  • 语法: whatis [命令名称]
    • whatis ls
  1. apropos: 获取配置文件简短信息
  • 语法: apropos [配置文件名称]
    • apropos services
  1. [命令名称] --help
  • ls --help 查看ls的帮助信息
  1. info: 基本等价于man的用法, 在显示上稍有区别, 早期UNIX没有info

  2. help: 获得shell内置命令的帮助信息

  • 路径: shell内置命令
  • 权限: 所有用户
  • 语法: help [shell内置命令名称]
    • help cd # cd是不可以用man来查看帮助的
    • help umask

5. 用户管理命令

  1. useradd: 添加新用户
  • 路径: /usr/sbin/useradd
  • 权限: root
  • 语法: useradd [用户名]
    • useradd yangmi
  1. passwd: 设置/更新用户密码
  • 路径: /usr/sbin/passwd
  • 权限: root
  • 语法: passwd [用户名]
  • 注意非root用户使用passwd直接进入修改自己密码的环境
  1. who: 查看当前所有登录用户信息(简洁)
  • 路径: /usr/bin/who
  • 权限: 所有用户
  • 语法: who
  • 输出内容:
    • tty: 本地登录
    • pts: 远程终端登录
  1. w: 查看当前所有登录用户信息(详细)
  • 路径: /usr/bin/w
  • 权限: 所有用户
  • 语法: w

6. 压缩解压命令: 只有zip是linux和windows通用的

  1. gzip: 压缩文件(.gz)
  • 路径: /bin/gzip
  • 权限: 所有用户
  • 语法: gzip [-d] [文件]
    • -d: 相当于gunzip, 解压文件
  • gzip无法压缩目录, 且压缩完不会保留原文件
  1. gunzip: 解压文件(.gz)
  • 路径: /bin/gunzip
  • 权限: 所有用户
  • 语法: gunzip [文件]
  1. tar: 打包目录, 顺带压缩(.tar)
  • 路径: /bin/tar
  • 权限: 所有用户
  • 压缩语法: tar [-zcvf] [压缩后文件名] [目录]
    • -c: 打包
    • -v: 显示详细信息
    • -f: 指定文件名
    • -z: 打包同时压缩, 也可以变成.tar后再gzip
      • tar -zcf Japan.tar.gz Japan
  • 解压语法: tar [-zxvf] [压缩包名称]
    • -x: 解包
    • -v: 显示详细信息
    • -f: 指定解压文件名
    • -z: 解压缩
      • tar -zxf Japan.tar.gz
  1. zip: 压缩文件或目录(win和linux通用, .zip)
  • 路径: /usr/bin/zip
  • 权限: 所有用户
  • 语法: zip [-r] [压缩后文件名] [文件或目录]
    • -r: 压缩目录
    • zip boduo.zip boduo
  • 没有gzip压缩得多
  1. unzip: 解压缩文件或目录
  • 路径: /usr/bin/unzip
  • 权限: 所有用户
  • 语法: unzip [压缩文件名]
  1. bzip2: 压缩文件(.bz2)
  • 路径: /usr/bin/bzip2
  • 权限: 所有用户
  • 语法: bzip2 [-k] [文件名]
    • -k: 产生压缩文件后保留原文件
    • bzip2 -k boduo
  • 解压用bunzip2: bynzip2 -k boduo.bz2
    • 可以用tar来解压缩打包后压缩成bz2: tar -cjf Japan.tar.bz2 Japan
  • bzip2不能压缩目录

7. 网络命令

  1. write: 给用户发信息(用户必须处于登陆状态), 输入完(Ctrl+Backspace或delete退回), 以Ctrl+D保存结束
  • 路径: /usr/bin/write
  • 权限: 所有用户
  • 语法: write <用户名>
    • write shenchao
    • Ctrl + D
  1. wall: 发广播信息
  • 路径: /usr/bin/wall
  • 权限: 所有用户
  • 语法: wall [信息内容]
  • 广播者自己也会收到信息
  1. ping: 测试网络连通性
  • 路径: /bin/ping
  • 权限: 所有用户
  • 语法: ping [-c] [IP地址]
    • -c: 指定ping的次数
      • ping -c 3 192.168.1.156 # ping 3次就停下, 不用-c会无限ping
  1. ifconfig: 查看/设置网络配置信息
  • 路径: /sbin/ifconfig
  • 权限: root
  • 语法: ifconfig [网卡名称] [IP地址]
    • ifconfig # 显示所有网卡信息
    • ifconfig eth0 192.168.8.250 # 临时生效的更改IP地址
  • linux有两个网卡eth0(默认网卡)和io
  1. mail: 查看/发送电子邮件(无需用户在线)
  • 路径: /bin/mail
  • 权限: 所有用户
  • 语法: mail [用户名]
    • mail # 查看邮件
      • 输入help查看如何查看
      • 1: 第一封邮件
      • d 1: 删除第一封邮件
    • mail shenchao # 给用户shenchao发送邮件, Ctrl+D保存
  • 系统一般会自动给root发送一些日志以及统计信息
  1. last: 列出目前与过去登入系统的用户信息(包括服务器重启)
  • 路径: /usr/bin/last
  • 权限: 所有用户
  • 语法: last
  1. lastlog: 只显示每个用户最后一次登录的记录
  • 路径: /usr/bin/lastlog
  • 权限: 所有用户
  • 语法: lastlog [-u] [UID]
    • lastlog # 显示全部用户
    • lastlog -u 502 # 502是uid
  1. traceroute: 显示数据包到主机间的路径
  • 路径: /bin/traceroute
  • 权限: 所有用户
  • 语法: traceroute www.lampbrother.net
  • 访问一个站点不可能是直接到的, 一般是一个个路由到的
  1. netstat: 显示网络相关信息(常用)
  • 路径: /bin/netstat
  • 权限: 所有用户
  • 语法: netstat [选项]
    • -a: 所有信息
    • -t: 查看TCP协议
    • -u: 查看UDP协议
    • -l: 监听
    • -r: 路由
    • -n: 显示IP地址和端口号
    • netstat -tlun # 查看本机监听得到端口, 很多端口号是固定的, 比如apache是80, ftp是22, 可以等价于查看开放的服务
    • netstat -an # 查看本机所有的网络连接, .state==established是正在连接的
    • netstat -rn # 查看本机路由表
  1. setup: 配置网络(永久生效), 红帽系列专有的命令, 其他版本的linux发行是没有的
  • 路径: /usr/bin/setup
  • 权限: root
  • 语法: setup 进入交互界面进行配置
    • 网络配置–>使用DHCP: 设置为’*'即为自动获取IP地址
  • 配置完后service network restart才能生效
  1. mount: 挂载
  • 路径: /bin/mount
  • 权限: 所有用户
  • 语法: mount [-t 文件系统] [设备文件名] [挂载点(可以理解为盘符,一般是cdrom)]
    • mount -t ios9660 /dev/sr0/mnt/cdrom
  • VMware相关操作: 见"02_系统安装.txt"
  • umount /dev/sr0 # 卸除挂载

8. 关机重启命令

  1. shutdown: 关机命令
  • 语法: shutdown [-chr] [时间]
    • -c: 取消前一个关机命令
    • -h: 关机
    • -r: 重启
  • shutdown -h now # 立即关机
  • shutdown -h 20:30 # 下一个20:30关机
  • shutdown -c # 取消关机
  • 推荐使用shutdown, 因为早期的linux系统中shutdown可以正确的保存服务器里的一些文件和状态, 有的命令写得不好, 可能会伤及物理硬盘
  1. halt: 关机
  2. poweroff: 关机(相当于直接断电,这个很坏)
  3. init 0: 关机
  4. init 6: 重启
  5. reboot: 重启
  6. init [系统运行级别]
  • 0: 关机
  • 1: 单用户(安全模式), 无GUI
  • 2: 不完全多用户, 不含NFS(网络服务系统,是一个文件共享的服务,存在安全问题)服务, 无GUI
  • 3: 完全多用户, 无GUI
  • 4: 未分配
  • 5: 图形界面
  • 6: 重启
  • 在/etc/inittab中有关于系统运行级别的记录, 且可以设置默认的系统运行级别, 比如改成0或6, 就永远起不来了, 事实上linux会保护不让设成0或6, 一般是默认3
  • cat /etc/inittab # 更改系统运行级别
    • id:3:initdefault;
  • runlevel # 查看当前系统运行级别
  1. logout: 退出登录

第五章 Linux文本编辑器Vim

1. Vim常用操作

  1. Vim没有菜单, 只有命令, 是Linux/UNIX最常用的文本编辑器, 可以建立编辑和显示文本文件
  2. 一般用于写一些小脚本
  3. Vim工作模式
  • vi或vm <文件名> # 进入文件(命令模式)
  • 输入: wq # 退出文件
  • 输入: i/a/o # 进入插入模式
    • 按ESC: 从插入模式转为命令模式
  • 输入: 冒号 # 进入编辑模式, 命令以回车结束运行
    • :set nu # 添加行号
  1. 插入命令: 插入模式下使用, 切换插入命令都需要先ESC进入命令模式
  • a: 在光标所在字符后插入
  • A: 在光标所在行尾插入
  • i: 在光标所在字符前插入
  • I: 在光标所在行首插入
  • o: 在光标下插入新行
  • O: 在光标上插入新行
  1. 定位命令: 在命令模式下使用
  • :set nu # 设置行号
  • :set nonu # 取消行号
  • gg # 到第一行
  • G # 到最后一行
  • :n # 到第n行
  • $ # 移动到行尾
  • 0 # 移动到行首
  1. 删除命令
  • x: 删除光标所在处字符
  • nx: 删除光标所在处后n个字符
  • dd: 删除光标所在行
  • ndd: 删除光标所在后n行
  • dG: 删除光标所在行到文件末尾内容
  • D: 删除光标所在处到行尾内容
  • :n1,n2d 删除n1到n2行
  1. 复制/剪切命令:
  • yy: 复制当前行
  • nyy: 复制当前行以下n行
  • dd: 剪切当前行
  • ndd: 剪切当前行以下n行
  • p或P: 粘贴在当前光标所在行下或行上
  1. 替换和取消命令:
  • r: 取代光标所在处字符
  • R: 从光标所在处开始替换字符, 按Esc结束
  • u: 取消上一步操作
  1. 搜索和搜索替换命令:
  • /string: 搜索指定字符串string, 搜索时忽略大小写 编辑模式下输入":set ic", 取消则":set nic"
  • n: 搜索指定字符串的写一个出现位置
  • :%s/old/new/g: 全文替换指定字符串(old->new)
    • :%s/ftp/sftp/g
  • :n1,n2s/old/new/g: 在第n1行到n2行替换(old->new)
    • n1,n2都是包括在内的
  1. 保存/退出命令
  • :w 保存修改
  • :w new_filename 另存为new_filename
  • :wq 保存求改并退出
  • ZZ 快捷键, 保存修改并退出
  • :q! 不保存修改退出
  • :wq! 保存修改并退出(root与文件所有者可用)

2. Vim使用技巧

  1. 导入命令执行结果: ":r!"命令
  • :r /etc/issue # 将/etc/issue文件内容导入到光标处
  • :! <系统命令> # 在不退出vim的情况下使用linux命令
  • :r !date # 将date的执行结果导入到光标处
  1. 定义快捷键: “:map” 快捷键出发命令
  • :map ^P I# # 注意这里的P是蓝色的(要按Ctrl+V+P才能输入出来), 给当前行首添加#号的快捷键P
  • :map ^B 0x # 删除行首第一个字符的快捷键B
  • :map ^H <字符串> # 插入<字符串>的快捷键
  1. 连续行注释:
  • :n1,n2s/^/#/g
    • :1,4s/^/#/g # 1~4行首添加字符"#"
  • :n1,n2s/^#//g
    • :1,4s/^#//g # 1~4行中存在"#“的行删除”#"
  • :n1,n2s/^/g
    • :1,4s/^/g # 1~4行首添加字符"//"
  1. 替换:
  • :ab mymail samlee@lampbrother.net # 文件中输入任何mymail都会变成samlee@lampbrother.net
  1. 这些快捷键都是临时生效的, 重启就没有了, 除非写到/home下的配置文件中(编辑模式的命令不需要写:), 只要把"map ^P I#"写进去就行了

第六章 Linux软件包管理

1. 软件包管理简介

  1. 软件包分类:
  • 源码包: 脚本安装包(因为需要编译所以是安装是很慢的)
  • 二进制包(编译后): RPM包, 系统默认包
  1. 源码包:
  • 开源: 可以修改源
  • 可以自由选择所需内容
  • 软件是编译安装, 所以更加适合自己的系统, 更加稳定且效率高
  • 卸载方便
  • 安装步骤多(如LAMP环境搭建,容易出现拼写错误)
  • 编辑时间很长
  1. RPM包:
  • 包管理系统简单, 只需要几个命令可以实现包的安装, 升级, 查询和卸载
  • 安装速度比源码包安装快得多
  • 无法查看源
  • 功能选择不如源码包灵活

2. RPM包管理: rpm命令管理

2.1 RPM包的命名与依赖性

  1. RPM包的命名规则
  • httpd-2.2.15-15.el6.centos.l.i686.rpm
    • httpd: 软件包名(区别与包全名)
    • 2.2.15: 软件版本
    • 15: 软件发布的次数
    • el6.centos: 适合的linux平台, 缺省则所有linux平台都适合
    • i686: 适合的应建平台, 如过是x64就是64位系统, i686微机平台
    • rpm: RPM包扩展名
  1. RPM包的依赖性
  • 树形依赖: a->b->c
    • 安装顺序: c->b->a
    • 卸载顺序: a->b->c
  • 环形依赖: a->b->c->a
    • abc同时安装就好了
  • 模块依赖:
    • 依赖性查询: www.romfind.net
    • 库依赖: 类似.so.2结尾的文件是库, 它是一个模块的一个文件, 所以需要去找这个库所在的模块进行安装, 需要到www.romfind.net去查询
  • 因此出现了yum来解决这个坑爹的模块依赖问题

2.2 RPM包安装升级卸载

  1. 包全名与包名:
  • 包全名: 操作的包是没有安装的软件包, 且注意路径
  • 包名: 操作已经安装的包, 无需路径, 是搜索/var/lib/rpm/中的数据库
  1. RPM包安装:
  • 语法: rpm [-ivh] [包全名]
    • -i: 安装
    • -v: 显示详细信息
    • -h: 显示进度
    • –nodeps: 不检测依赖性(仅实验可用,实际操作必须检测依赖性)
  • rpm -ivh httpd-2.2.15-15.e16.centos.1.i686 # 会有很多依赖的包需要安装的, 要花费很长很长的时间, 其实很多时候安装一个主包就可以了, 以后缺什么再装就行了
  1. RPM包升级:
  • 语法: rpm [-Uvh] [包全名]
    • -U: 升级, 可以取代安装
  1. RPM包卸载:
  • rpm -e [包名]
    • -e: 卸载
    • –nodeps: 不检测依赖性
  • 卸载必须按照依赖性顺序来卸载

2.3 RPM包查询

  1. 查询包是否安装:
  • rpm -q [包名] # 查询包是否已经安装
  • rpm -qa # 查询所有已经安装的包
    • rpm -qa | grep httpd # 在查询结果提取包含"httpd"字符串的信息
  1. 查询包详细信息:
  • rpm -qi [包名]
  • rpm -qip [包全名] # 查询未安装的包的信息
  1. 查询包中文件安装位置:
  • rpm -ql [包名]
  • rpm -qlp [包全名] # 查询未安装的包的信息: 即在安装前可以看一下所有文件的安装位置
  1. 查询系统文件属于哪个RPM包
  • rpm -qf [系统文件路径]
    • 必须是通过RPM包安装得到的文件才能反向查出是哪个RPM包
  1. 查询包依赖性:
  • rpm -qR [包名] # 查询已安装包的依赖性
  • rpm -qRp [包全名] # 查询未安装包的依赖性

2.4 RPM包校验和文件提取

  1. RPM包校验: 判断系统文件是否缺失或被修改
  • rpm -V [包名]
    • 如果没有任何输出表示此包正常
    • 如果有输出, 则验证内容中的8个信息具体如下:
      • S: 文件大小是否改变
      • M: 文件的类型或文件的权限(rwx)是否改变
      • 5: MD5校验是否改变(可以视为文件内容是否改变)
      • D: 设备的中从代码是否改变
      • L: 文件路径是否改变
      • U: 文件的所有者是否改变
      • G: 文件的所属组是否改变
      • T: 文件的修改时间是否改变
      • 文件类型:
        • c: 配置文件
        • d: 普通文档
        • g: 鬼(ghost)文件, 很少见, 就是这个文件不应该被该RPM包包含
        • l: 授权文件
        • r: 描述文件
  1. RPM包文件提取: 一般用于修复被修改或缺失的RPM文件
  • rpm2cpio [包全名] | cpio -idv .[文件绝对路径]
  • 应用实例: 如果误删除/bin/ls
    • 百度查询rpm -qf /bin/ls 的执行结果: 即找到ls属于哪个rpm包
    • rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls
    • cp /root/bin/ls /bin/ # 复制回原处即可

3. RPM包管理: yum在线管理

  1. yum会自动安装依赖的包, 但是有些linux发行版本里yum是售后服务, 要付费的
  2. yum必须联网才能使用, 配置好IP地址并可以连接到网络yum源即可
  3. 使用光盘镜像的yum源则无需联网, 比网络yum源下载要快得多

3.1 IP地址配置与网络yum源

  1. ifconfig eth0 [IP地址]
  2. setup
  • 进入GUI界面的网络配置
    • 使用DHCP: 取消"", ""表示自动获取IP地址
    • 静态IP: 192.168.1.156
    • 子网掩码: 255.255.255.0
    • 默认网关IP: 192.168.1.1
    • 主DNS服务器: 202.106.0.20
    • 第二DNS服务器: 缺省
  • 手动把网卡启动设置为yes:
    • vi /etc/sysconfig/network-scripts/ifcfg-eth0
    • 把ONBOOT="no"改为ONBOOT=“yes”
  • 保存退出后重启网络服务: service network restart
  1. 网络yum源:
  • 查看网络yum源: vi /etc/yum.repos.d/CentOS-Base.repo
  • /etc/yum.repos.d/CentOS-Base.repo文件内容说明
    • [base]: 容器名称, 一定要放在[]中
    • name: 容器说明, 可以自己随便写
    • mirrorlist: 镜像站点, 这个可以注释掉
    • baseurl: 我们的yum源服务器的地址, 默认是CentOS官方的yum源服务器, 如果慢可以改成国内的镜像地址
    • enabled: 此容器是否生效, 如果不写或写成enable=1都是生效, enable=0不生效
    • gpgcheck: 指RPM的数字证书是否生效, 1是0否
    • gpgkey: RPM数字证书的公钥文件保存位置, 无需修改

3.2 yum命令: 只有包名, 没有包全名

  1. 常用yum命令:
  • yum list # 查询所有可用软件包列表
  • yum search [关键字] # 搜索服务器上所有和关键字相关的包
  • yum [-y] install [包名] # 安装
    • -y: 自动安装, 即所有地方都回答yes不会暂停
    • yum -y install gcc
  • yum [-y] update [包名] # 升级
    • -y: 自动升级
    • 不加[包名]即升级整个linux系统中所有的包, 包括linux内核, 会导致服务器崩溃
  • yum [-y] remove [包名] # 卸载
    • -y: 自动卸载
    • 注意这个命令是很危险, 因为会把所有依赖的它的包都卸载了, 然后可能会删除一大堆, 很容易系统崩溃, 因此一般不会卸载
  1. YUM软件组管理命令:
  • yum grouplist # 列出所有可用的软件组列表
  • yum groupinstall [软件组名] # 安装指定软件组, 由上面的命令查询得到
  • yum groupremove [软件组名] # 卸载指定软件组
  • 注意[软件组名]有空格则需要""引起来

3.3 光盘yum源

  1. 光盘yum源搭建步骤
  • 挂载光盘: mount /dev/cdrom /mnt/cdrom
  • 让网络yum源文件失效:
    • cd /etc/yum.repos.d/ # 进入网络yum源的目录
    • mv CentOS-Base.repo CentOS-Base.repo.bak # 重命名使得原文件失效
    • mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak # 重命名使得原文件失效
    • mv CentOS-Vault.repo CentOS-Vault.repo.bak # 重命名使得原文件失效
  • 修改光盘yum源配置文件:
    • vim CentOS-Media.repo # 打开配置文件
    • [c6-media]
    • name=CentOS-$releasever - Media
    • baseurl=file:///mnt/cdrom # 地址为你自己的光盘挂载地址
    • 注释掉这两个不存在的地址:
      • # file:///media/cdrom/
      • # file:///media/cdrecorder/
    • gpgcheck=1
    • enabled=1 # 把0改成1使得生效
    • gpgkey="…" # 无需修改

4. 源码包管理

4.1 源码包与RPM包的区别

  1. 区别:
  • 安装之前的区别: 概念上的区别
  • 安装之后的区别: 安装位置不同, 后续管理不同
  1. RPM包安装位置:
  • /etc/ 配置文件安装目录
  • /usr/bin/ 可执行的命令安装目录
  • /usr/lib/ 程序所使用的函数库保存位置
  • /usr/share/doc/ 基本的软件使用手册保存位置
  • /usr/share/man/ 帮助文档保存位置
  1. 源码包安装位置: 安装在指定位置当中, 一般是/usr/local/软件名/
  2. 安装位置不同带来的影响:
  • RPM包安装的服务可以使用系统管理服务命令(service)来管理
    • 如RPM包安装的apache的启动方法是:
      • /etc/rc.d/init.d/httpd start
      • service httpd start # 这条命令是红帽系列linux专用, 其他版本linux未必有, 且start可以替换成stop, restart
  • 源码包安装的服务则不能被服务管理命令(service)来管理, 因为没有安装到默认路径中, 只能用绝对路径进行服务的管理
    • /usr/local/apache2/bin/apachectl start

4.2 源码包安装过程

  1. 安装准备:
  • 安装C语言编译器: gcc包
  • 下载源码包: http://mirror.bit.edu.cn/apache/httpd
    • 事实上即便系统已经安装了httpd的RPM包也不影响再安装一次源码包, 虽然这很蠢
  1. 安装注意事项:
  • 源码包保存位置: /usr/local/src/
  • 软件安装位置: /usr/local/
  • 如何确定安装过程报错:
    • 安装过程停止
    • 并出现error, warning, no的提示
  1. 源码包的安装过程:
  • 下载源码包
  • 解压缩下载的源码包
  • 进入解压缩目录
    • 注意INSTALL和README文件, 包含了安装步骤与安装说明
  • ./configure 软件配置与检查
    • 定义需要的功能选项
    • 检测系统环境是否符合安装要求
    • 把定义好的功能选项和检测系统环境的信息都写入Makefile文件, 用于后续的编辑
    • 总结:
      • ./configure --help 查看所有功能选项
      • ./configure --prefix=/usr/local/apache2 # 定义安装目录, 其他都可以不定义, 安装目录一定要定义, 运行这条命令即刻安装, 将会生成Makefile文件
  • make # 编译: 需要占用很长的时间
    • 可以编译后执行"make clean"命令: 清空编译数据
  • make install # 编译后运行即可
  • 查看INSTALL文件可知: /usr/local/apache2/bin/apachectl start # 启动apache
    • 注意apache一般默认占用80端口, 如果已经用RPM包安装了apache启动, 则无法启动源码包的apache, 可以使用service httpd stop来停止RPM包的apache
  1. 源码包的卸载:
  • rm -rf /usr/local/apache2/
  • Linux比Windows优越的地方在于安装不会有垃圾文件零散在各处, 所有源码包安装的文件都在安装目录下

5. 脚本安装包与软件包选择

  1. 脚本安装包
  • 脚本安装包不是独立的软件包类型, 常见安装的是源码包
  • 人为把安装过程写成了自动安装的脚本, 只要执行脚本, 定义简单的参数, 就可以完成安装
  • 类似于Windows下软件的安装方式, 下一步, 确认即可
  • 以Webmin的脚本安装过程为例说明
  1. Webmin的作用
  • Webmin是一个基于Web和Linux系统管理界面, 就可以通过GUI设置用户账号, Apache, DNS, 文件共享等服务
  1. Webmin安装过程
  • 下载软件: http://sourceforge.net/projects/webadmin/files/webmin
  • 解压缩并进入压缩目录
  • 执行安装脚本: 一般是setup.sh

第七章 Linux用户和用户组管理

1. 用户配置文件

1.1 用户信息文件: /etc/passwd

  1. Linux中主要是通过用户配置文件来查看和修改用户信息的
  2. 使用"man 5 passwd"命令来查看帮助信息:
  • 分隔符: “:”
  • 每行一个用户
  • 数据字典:
    • 第1字段: 用户名
    • 第2字段: 密码标志(一般为x, 表明密码在shadow中, 空表示无密码)
      • 早期Linux是直接放密码在passwd密码中, 现在放到shadow文件中
      • shadow文件的权限是000, 即除root外任何用户不能读取写入与执行
      • shadow中的密码是加密成512位的
    • 第3字段: UID(用户ID)
      • 0: 超级用户/管理员(一般为root)
      • 1-499: 系统用户(伪用户), 不可删除, 用于启动系统命令, 否则会崩溃
      • 500-65535: 普通用户, 可以将普通用户的UID改成0, 就变成管理员了
    • 第4字段: GID(用户初始组ID)
      • 初始组: 用户一登陆就立刻拥有这个用户组的相关权限, 每个用户的初始组只能有一个, 一般就是和这个用户的用户名相同的组名作为这个哦那个胡的初始组, 不建议修改
      • 附加组: 指用户可以加入多个其他的用户组, 并拥有这些组的权限, 附加组可以有多个
    • 第5字段: 用户说明
    • 第6字段: 家目录
      • 普通用户: /home/用户名/
      • 超级用户: /root/
    • 第7字段: 登录之后的Shell
      • Shell是Linux的命令解释器
      • 在/etc/passwd中, 除了标准Shell是/bin/bash外, 还可以写如/sbin/nologin, 就相当于禁止该用户登录

1.2 影子文件: /etc/shadow

  1. 是passwd文件的影子, 且权限是000
  2. 数据字典:
  • 第1字段: 用户名
  • 第2字段: 加密密码
    • 加密算法升级为SHA512散列加密算法
    • 如果密码位是"!!“或”*"代码没有密码, 不能登录
    • 可以在一个用户的密码位首位添加"!"即可禁用这个用户登录
  • 第3字段: 密码最后一次修改日期的时间戳(从19700101向后的第x天)
  • 第4字段: 两次密码的修改间隔时间(相对于第3字段)
  • 第5字段: 密码有效期(一般为无限期有效, 可以修改为)
  • 第6字段: 密码修改到期前的警告天数(相对于第5字段)
  • 第7字段: 密码过期后的宽限天数(相对于第5字段)
    • 0或缺省: 代表密码过期后立即失效
    • -1: 代码密码永不失效
  • 第8字段: 账号失效时间
    • 时间戳表示
  • 第9字段: 保留字段, 暂时没有意义
  1. 时间戳换算:
  • 时间戳换算为日期: date -d “1970-01-01 16066 days”
  • 日期换算为时间戳: echo $(($(date --date=“2014/01/06” +%s)/86400+1))

1.3 组信息文件: /etc/group

  1. 数据字典:
  • 第1字段: 组名(默认与用户名相同)
  • 第2字段: 组密码标志
    • 与用户密码一样, 真实的密码在组密码文件/etc/gshadow中
    • 一般root会给每个组设置一个组管理员, 由组管理员来设置组密码
    • 但是并不推荐, 因为linux希望只有root一个人就可以管理一切, 设置组管理员可能会导致安全问题
  • 第3字段: GID(编号规则与UID是一样的)
  • 第4字段: 组中附加用户

2. 用户管理相关文件

  1. 用户的家目录
  • 普通用户: /home/用户名/ 所有者和所属组都是此用户, 权限700
  • 超级用户: /root/ 所有者和所属组都是root用户, 权限550
    • 其实550的权限对于root是没有用处的, root拥有linux系统中的一切权限
  • 如果将普通用户改成超级用户(通过修改普通用户的所属组即可或将UID改为0), 但是它的家目录是不会改变的
  1. 用户的邮箱: /var/spool/mail/用户名/
  2. 用户的模板目录: /etc/skel/
  • 比如添加一个用户后默认执行的一系列操作:
    • 生成家目录
    • 家目录下生成一些默认文件(这个事可以修改的)

3. 用户管理命令

3.1 useradd

  1. 语法: useradd [选项1] [选项参数] [选项2] [选项参数] … [选项n] [选项参数] [用户名]
  • 选项:
    • -u [UID]: 手工指定用户的UID号, 一般不建议修改
    • -d [家目录]: 手工指定用户的家目录, 一般不建议修改
    • -c [用户说明]: 手工指定用户的说明, 说明带空格需要""
    • -g [组名]: 手工指定用户的初始组, 一定是已经存在的组
    • -G [组名]: 指定用户的附加组, 一定是已经存在的组
    • -s [shell]: 手工指定用户的登录shell
  • useradd shenchao # 建立一个用户shenchao
  • useradd -u 550 -G root,bin -d /home/lamp1 -c “test user” -s /bin/bash shenchao
  1. 用户默认值文件:
  • /etc/default/useradd
    • GROUP=100 # 用户默认组
    • HOME=/home # 用户家目录
    • INACTIVE=-1 # 密码过期宽限天数
    • EXPIRE= # 密码失效时间
    • SHELL=/bin/bash # 默认shell
    • SKEL=/etc/skel # 模板目录
    • CREATE_MAIL_SPOOL=yes # 是否建立邮箱
  • /etc/login.defs
    • PASS_MAX_DAYS 99999 # 密码有效期
    • PASS_MIN_DAYS 0 # 密码修改间隔
    • PASS_MIN_LEN 5 # 密码最小位数
    • PASS_WARN_AGE 7 # 密码到期警告天数
    • UID_MIN 500 # 最小UID范围
    • GID_MAX 60000 # 最大GID范围
    • ENCRYPT_METHOD SHA512 # 加密模式

3.2 passwd

  1. 语法: passwd [选项] [用户名] --> 进入交互修改密码
  • 选项:
    • -S # 查询用户密码的密码状态, 仅root可用4
      • passwd -S shenchao # 将输出shenchao用户在/etc/passwd及相关文件中的信息
    • -l # 暂时锁定用户, 仅root可用
      • passwd -l shenchao # 本质是修改shadow中密码位的字符串: 首位添加1个"!"
    • -u # 解锁用户, 仅root可用
      • passwd -u shenchao # 本质是修改shadow中密码位的字符串
    • –stdin # 可以通过管道符输出的数据作为用户的密码
      • echo “123” | passwd --stdin shenchao # 设为123的密码

3.3 usermod和chage

  1. usermod: 修改用户信息
  • 语法: usermod [选项1] [选项参数] [选项2] [选项参数] … [选项n] [选项参数] [用户名]
    • -u [UID]: 手工指定用户的UID号, 一般不建议修改
    • -c [用户说明]: 手工指定用户的说明, 说明带空格需要""
    • -G [组名]: 指定用户的附加组, 一定是已经存在的组
      • usermod -G root shenchao # shenchao就变成管理员了
    • -L: 临时锁定用户, 本质上在shadow密码位开头加了一个"!"
    • -U: 解锁用户
  1. chage: 修改用户密码状态
  • 语法: chage [选项1] [选项参数] [选项2] [选项参数] … [选项n] [选项参数] [用户名]
    • -l: 列出用户的详细密码状态
    • -d [日期]: 修改密码最后一次更改日期
      • chage -d 0 shenchao # shenchao # 一登陆就需要修改密码, 用于给新用户的操作
    • -m [天数]: 两次密码修改间隔
    • -M [天数]: 密码有效期
    • -W [天数]: 密码过期前警告天数
    • -I [天数]: 密码过后宽限天数
    • -E [日期]: 账号失效时间

3.4 userdel和su

  1. userdel: 删除用户
  • 语法: userdel [-r] [用户名]
    • -r: 连带删除家目录
  • 手工删除用户:
    • vi /etc/passwd 并删除相关记录
    • vi /etc/shadow 并删除相关记录
    • vi /etc/group 并删除相关记录
    • vi /etc/gshadow 并删除相关记录
    • rm -rf /var/spool/mail/shenchao
    • rm -rf /home/shenchao
  1. su: 用户切换身份命令
  • 语法: su [选项] [用户名]
    • -: 选项只使用"-"代表连带用户的环境变量一起切换, 通常必然要加的一个选项
      • 不加此选项会导致虽然whoami显示已经切换, 但是环境变量中还是原先的用户
    • -c [命令]: 仅执行一次命令, 而不切换用户身份
      • su -root -c “useradd user3” # 借用root身份执行一个命令
      • 只有有管理员权限才能使用su命令

4. 用户组管理命令

  1. groupadd: 添加用户组
  • 语法: groupadd [选项] [组名]
    • -g [GID]: 指定组ID, 一般不指定
  1. groupmod: 修改用户组
  • 语法: groupmod [选项] [组名]
    • -g [GID]: 修改组ID
    • -n [新组名]: 修改组名
  • groupmod -n testgrp group1 # 把组名group1修改为testgrp
  1. groupdel: 删除用户组
  • 语法: groupdel [组名]
  • 如果该组中存在初始用户(有用户的初始组是该组), 则该组不能被删除, 否则该用户就没有初始组了
  1. gpasswd: 把用户添加入组或从组中删除
  • 语法: gpasswd [选项] [组名]
    • -a [用户名]: 把用户加入组
      • 注意这个命令与useradd -g是一个效果
    • -d [用户名]: 把用户从组中删除

第八章 Linux权限管理

1. ACL权限

1.1 简介与开启

  1. ACL权限简介
  • ugo的身份权限划分在一些场景下可能是不够用的, 需要更多的身份, 这就是ACL权限
  • windows中可以直接对单个用户进行权限分配
  1. 查看分区ACL权限是否开启
  • dumpe2fs -h [分区盘符]
    • dumpe2fs命令是查询指定分区详细文件系统信息的命令
    • -h: 仅显示超级块中信息, 而不是显示磁盘块组的详细信息
    • dumpe2fs -h /dev/sda3
      • 查看输出结果的default mount options字段的结果
  1. 临时开启分区ACL权限:
  • mount -o remount,alc [分区盘符]
    • mount -o remount,alc /
  • 重启将失效, 但是linux默认都是开启的
  1. 永久开启分区ACL权限:
  • vi /etc/fstab # 打开配置文件fstab
    • 修改前: UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 default l l
    • 修改后: UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 default,acl l l
    • 默认default都是开启的
  • mount -o remount [分区盘符] # 重新挂载文件系统或重启动系统使得修改生效

1.2 查看与设定

  1. getfacle: 查看ACL命令
  • 语法: getfacle [文件名]
  • ls -l查看详细信息时如果权限位的末尾有"+"说明有ACL权限
  1. setfacl: 设定ACL权限命令
  • 语法: setfacl [选项] [文件名/目录名]
    • -m: 设定ACL权限
      • setfacl -m u:st:rx /project/ # 给用户st赋予rx权限, 使用"u:用户名:权限"的格式
      • setfacl -m g:tgroup2:rwx /project/ # 给用户组tgroup2分配ACL权限, 使用"g:组名:权限"格式
    • -x: 删除指定的ACL权限
    • -b: 删除所有的ACL权限
    • -d: 设定默认ACL权限
    • -k: 删除默认ACL权限
    • -R: 递归设定ACL权限

1.3 最大有效权限与删除

  1. 最大有效权限: mask
  • mask是用来指定最大有效权限的, 如果我给用户赋予了ACL权限, 是需要和mask权限"相与"才能得到用户的真正权限的(即设定的权限不能超过mask权限)
  1. 修改最大有效权限:
  • setfacl -m m:rx [文件名] # 设定mask权限为r-x, 格式"m:权限"
  1. 删除ACL权限:
  • setfacl -x u:用户名 [文件名]
  • setfacl -x g:组名 [文件名]
  • setfacl -b [文件名] # 全部删除, ls -l的权限位末尾的"+"消失

1.4 默认与递归ACL权限

  1. 递归ACL权限: 子文件与子目录拥有相同的ACL权限
  • setfacl -m u:用户名:权限 -R [目录名]
  • 如果在递归设定后又在目录下新建了一个文件, 将不再遵守ACL权限
  • 只能针对目录
  1. 默认ACL权限:
  • 如果给父目录设定了默认ACL权限, 那么父目录中所有新建的子文件都会继承父目录的ACL权限
  • setfacl -m d:u:用户名:权限 [目录名]
  • 默认ACL权限对于已经存在的文件不生效
  • 只能针对目录

2. 文件特殊权限

2.1 SetUID: 所有者的权限x修改为s

  1. SetUID功能:
  • 只有可执行的二进制程序才能设定SUID权限
    • 普通文件和目录是不能设置, 或者说设置了也没有意义
  • 普通用户要对该程序拥有执行权限(x)
  • 普通用户在执行该程序时获得该程序文件所有者的身份
  • SetUID权限只在该程序执行过程中有效, 也就是说身份改变只在程序执行过程中有效
    • 程序终止则身份失效
  • SetUID权限实际应用:
    • passwd命令拥有SetUID权限, 所以普通用户可以修改自己的密码
      • ll /usr/bin/passwd 显示权限: -rwsr-xr-x
    • cat命令没有SetUID权限, 所以普通用户不能查看/etc/shadow文件内容
      • ll /bin/cat 显示权限: -rwxr-xr-x
  1. 设定SetUID的方法:
  • chmod 4755 [文件名] # 4代表SUID权限, 755是普通权限
    • 4代表SUID, 2代表SGID, 1代表SBIT
  • chmod u+s # 给u添加s权限
  • 如果设置完发现是rwS, 即是大写的S说明出错, 因为命令执行者对该程序不拥有执行权限
  1. 删除SetUID的方法:
  • chmod 755 [文件名] # 恢复到755权限
  • chmod u-s # 给u去除s权限
  1. 危险的SetUID: 会有红色标注出该文件
  • 关键目录应严格控制写权限, 比如"/“和”/usr"等
  • 用户的密码设置要严格遵守密码三原则
  • 对系统中默认应该具有SetUID权限的文件作一列表, 定时检查有没有这些之外的文件被设置了SetUID权限
  • 比如将vim设定了SUID权限, 将会使得普通用户可以直接用vim进入shadow文件直接修改密码, 修改UID成超级用户

2.2 SetGID: 所属组的权限x修改为s

  1. SetGID针对目录的作用: 相对安全
  • 普通用户必须对次目录拥有rx权限, 才能进入此目录
  • 普通用户在此目录中的有效组会变成此目录的所属组
  • 若普通用户对此目录拥有w权限时, 新建的文件的默认所属组是这个目录的所属组
  1. SetGID针对文件的作用: 相对危险
  • 只有可执行的二进制程序才能设置SGID权限
  • 普通用户要对该程序拥有执行权限(x)
  • 普通用户在执行该程序时的组身份升级为该程序文件所属组
  • SGID权限同样只在该程序执行过程中有效
  • SGID实际应用:
    • ls -l /usr/bin/locate 命令具有SGID权限 # rwx–s--x
    • ls -l /var/lib/mlocate/mlocate.db # rw-r-----
    • /usr/bin/locate是可执行二进制程序, 可以赋予SGID
    • 普通用户对/usr/bin/locate命令拥有执行权限
    • 执行locate命令时组身份会升级为slocate组, 而slocate组对/var/lib/mlocate/mlocate.db拥有r权限, 则普通用户可以使用locate命令查询该数据库
    • 命令结束普通用户的组身份复原
  1. 设定SetGID的方法:
  • chmod 2755 [文件名/目录名]
  • chmod g+s [文件名/目录名]
  1. 删除SetGID的方法:
  • chmod 755 [文件名/目录名]
  • chmod g-s [文件名/目录名]

2.3 Sticky BIT: 其他人的权限x修改为s

  1. SBIT粘着位作用:
  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有wx权限, 即普通用户可以在此目录拥有写入权限
  • 如果没有粘着位, 因为普通用户拥有w权限, 所以可以删除此目录下所有文件, 包括其他用户建立的文件, 所以赋予粘着位, 除了root可以删除所有文件, 普通用户即使拥有w权限, 也只能删除自己建立的文件, 无法删除其他用户建立的文件
  • SBIT权限实际应用: /tmp/目录是具有SBIT权限的目录
  1. 设置与取消粘着位:
  • 设置粘着位:
    • chmod 1755 [目录名]
    • chmod o+t [目录名]
  • 取消粘着位:
    • chmod 755 [目录名]
    • chmod o-t [目录名]

3. chattr权限: 文件系统属性

  1. chattr命令格式:
  • chattr [±=] [选项] [文件名/目录名] # ±=分别对应增加, 删除和设置
    • i:
      • 如果对文件设置i属性, 则不允许对文件进行删除改名, 也不能添加和修改数据
      • 如果对目录设置i属性, 那么只能修改目录下文件的数据, 但不允许建立和删除文件
      • i属性对超级用户root同样有限制效果
    • a:
      • 如果对文件设置a属性, 那么只能在文件中增加数据, 但是不能删除与修改数据
      • 如果对目录设置a属性, 那么只允许在目录中建立和修改文件, 但不允许删除文件
  • char +i test.txt
  • char +a test.txt
  1. lsattr: 查看文件特殊属性
  • 普通ls无法查看i属性和a属性, 需要使用lsattr
  • 语法: lsattr [选项] [文件/目录名]
    • -a: 显示所有文件和目录
    • -d: 若目标是目录, 仅列出目录本身的属性, 而非子文件

4. sudo权限: 系统命令

  1. sudo权限:
  • root把本来只能超级用户执行的命令赋予普通用户执行, 需要root先授予权限
  • sudo的操作对象是系统命令(文件), 如/sbin/下的命令
  • 一般不应该授予vim的命令权限, 因为如果授予vim的权限, 普通用户就可以任意修改各种文件了
  1. sudo使用:
  • visudo # 进入交互界面
    • root执行该命令授予sudo权限, 本质是修改/etc/sudoers文件
    • 修改格式: [用户名/组名] [被管理主机的地址]=([可使用的身份]) [授权命令]
      • 如果是组名需要添加前缀"%"来标注
      • 被管理主机的地址一般取ALL或本机地址, 而非来源IP
      • 可使用的身份一般是root
      • 授权命令应当是命令的绝对地址
    • root ALL=(ALL) ALL # 授予root用户所有权限, ALL是一个全局变量
  1. 授权sc用户可以重启服务器:
  • 执行visudo进入编辑界面
  • 编辑文件: sc ALL=/sbin/shutdown -r now
  1. 普通用户执行sudo赋予的命令
  • sudo -l # 查看可用的sudo命令
  • sudo /sbin/shutdown -r now # 执行命令时需要绝对路径

第九章 Linux文件管理系统

1. 回顾分区与文件系统

  1. 分区类型:
  • 主分区: 总共最多只能分4个
  • 扩展分区: 只能有1个, 也算作主分区的一种, 也就是说主分区加扩展分区最多4个, 但是扩展分区不能存储数据和格式化, 必须再划分成逻辑分区才能使用
  • 逻辑分区: 逻辑分区是在扩展分区中划分的, 如果是IDE硬盘, Linux最多支持59个逻辑分区, 如果是SCSI硬盘则为11个
  1. 分区表示方法: [[主分区1],[主分区2],[扩展分区:[逻辑分区1],[逻辑分区2]]]
  • 主分区1: /dev/sda1
  • 主分区2: /dev/sda2
  • 扩展分区: /dev/sda3
  • 逻辑分区1: /dev/sda5 # 逻辑分区只能从5开始, 哪怕前面没有4个主分区
  • 逻辑分区2: /dev/sda6
  1. 文件系统: 格式化即写入文件系统
  • Linux默认支持的文件系统是ext, ext2, ext3, ext4
    • ext2和ext3都是16TB单分区上限与2TB单文件上线
    • ext3比ext2添加了日志系统
    • ext4: 最大1EB文件系统和单文件16TB上限

2. 文件系统常用命令

2.1 df, du, fsdk, dumpe2fs

  1. df: 文件系统查看命令
  • 语法: df [选项] [挂载点]
    • -a: 显示所有的文件系统信息, 包括特殊文件系统, 如/proc /sysfs
    • -h: 使用KB, GB, MB显示容量
    • -T: 显示文件系统类型
    • -m: 以MB为单位显示容量
    • -k: 以KB为单位显示容量, 默认就是KB
  • df 或 df -a # 查看所有分区的情况
  1. du: 统计目录或文件大小
  • 一般用ls来查看文件大小, 而非du
  • 但是ls统计目录大小时只会统计目录下的一级目录的大小情况, 而非递归搜索所有文件的大小
  • 语法: du [选项] [文件名/目录名]
    • -a: 显示每个子文件的磁盘占用量, 默认只统计子目录的磁盘占用量
    • -h: 使用KB, GB, MB显示容量
    • -s: 统计总占用量, 而不列出子目录和子文件的占用量
  • 一般使用du -sh [文件名/目录名]
  • du命令和df命令的区别:
    • df命令是从文件系统考虑的, 不光要考虑文件占用的空间, 还要统计被命令或程序占用的空间(如文件已删除但仍未释放空间)
    • du命令是面向文件的, 累和所有文件大小
  1. fsdk: 文件系统修复命令fsck
  • 语法: fsck [选项] [分区设备文件名]
    • -a: 不用显示用户提示, 全自动
    • -y: 与-a相同, 有些文件系统只支持-y
  • 一般不需要, 因为太底层, 容易出问题
  1. dumpe2fs: 显示磁盘状态
  • 语法: dumpe2fs [分区设备文件名]

2.2 挂载命令

  1. 查询与自动挂载:
  • mount [-l] # 直接mount即可查询系统中已经挂载的设备, -l会显示卷标名称
  • mount -a # 依据配置文件/etc/fstab的内容, 自动挂载
    • 光盘U盘不可能是自动挂载, 因为它们不可能总是接在服务器上
  1. 挂载命令格式:
  • mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] [设备文件名] [挂载点]
    • -t 文件系统: 加入文件系统类型来指定挂载的类型, 可以ext3, ext4, iso9660等文件系统
    • -L 卷标名: 挂载指定卷标的分区, 而非安装设备文件名挂载
    • -o 特殊选项: 可以指定挂载的额外选项, 常用特殊选项如下所示
      • atime/noatime: 更新/不更新访问时间, 发个文分区文件时, 是否更新文件的访问时间, 默认更新
      • async/sync: 默认异步
      • auto/noauto: mount -a命令执行时, 是否会自动安装/etc/fstab文件内容挂载, 默认自动
      • defaults: 定义默认值, 相当于rw,suid,dev,exec,auto,nouser,async这七个选项
      • exec/noexec: 设定是否允许在文件系统中执行可执行文件, 默认允许执行
      • remount: 重新挂载已经挂载的文件系统, 一般用于指定修改特殊权限
      • rw/ro: 读写/只读, 文件系统挂载时, 是否具有读写权限, 默认具有读写权限rw
      • suid/nosuid: 设定文件系统是否具有SUID和SGID权限, 默认具有
      • user/nouser: 设定文件系统是否允许普通用户挂载, 默认不允许, 只能root
      • usrquota: 写入代表文件系统支持用户磁盘配额, 默认不支持
      • grpquota: 写入代表文件系统支持组磁盘配额, 默认不支持
  • mount -o remount,noexec /home/ # 重新挂载home分区, 且不允许在其中执行可执行文件

2.3 挂载光盘与U盘

  1. 挂载光盘: 任何空目录都可以用于挂载, 但是有一些默认的习惯
  • mkdir /mnt/cdrom/ # 建立挂载点: 一般是默认存在的, 一般cdrom挂载光盘, usb挂载U盘
  • mount -t iso9660 /dev/cdrom /mnt/cdrom # 挂载光盘
  • mount /dev/sr0/ /mnt/cdrom # 将设备文件名与挂载点连接起来, 设备文件名是系统自动检测得到
  1. 卸载命令:
  • umount [设备文件名/挂载点] # 随便写哪个都行
  • umount /mnt/cdrom/
  1. 挂载U盘:
  • fdisk -l # 查看U盘的设备文件名
  • mount -t vfat /dev/sdb1 /mnt/usb/ # U盘的设备文件名与硬盘命名规则是一样的, 未必一定是sdb1
    • Linux将fat16分区识别为fat, fat32分区识别为vfat, 这里写的是vfat的U盘
  • 注意: Linux默认不支持NTFS文件系统, 因此NTFS的U盘或硬盘是不会被Linux识别的
  • 注意: 虚拟机操作时一定要在处于虚拟机环境下时插入U盘才能由虚拟机识别到U盘
  • 卸载U盘与卸载光盘是一样的

2.4 支持NTFS文件系统

  1. Linux默认不支持NTFS文件系统
  2. Linux将常见的硬件驱动写在了内核中, 这不同于Windows需要手动安装驱动
  3. 安装NTFS驱动的方法:
  • 内核编译: 将NTFS的驱动添加进来, 这个方法几乎不会被使用
  • 第三方软件
  1. 下载NTFS-3G插件: http://www.tuxera.com/community/ntfs-3g-download/
  2. 安装NTFS-3G:
  • tar -zxvf ntfs-3g_ntfsprogs-2013.1.13.tgz # 解压
  • cd ntfs-3g_ntfsprogs-2013.1.13 # 进入解压目录
  • ./configure # 编译器准备, 没有指定安装目录, 安装到默认位置中
  • make # 编译: 需要安装gcc
  • make install # 编译安装
  1. 使用NTFS-3G:
  • mount -t ntfs-3g [分区设备文件名] [挂载点]
  • 事实上Linux上NTFS的硬盘只能读取, 不能写入

3. fdisk分区

3.1 分区过程

dos中也是fdisk命令进行分区, 但是用法差别很大

  1. 添加新硬盘:
  • 虚拟机断电后然后点击菜单栏中的"虚拟机"–>“设置”–>“添加硬盘”–>“下一步” 即可
  1. 查看新硬盘:
  • fdisk -l # 这与查看U盘也是一样的, 本质上U盘也是硬盘
    • 扩展分区的id是5
    • swap分区的id是82
    • 普通分区的id是83
  1. 使用fdisk命令分区:
  • fdisk /dev/sdb # 此时还没有分区, 所以sdb没有编号
  • 进入fdisk交互界面
  • fdisk交互指令说明:
    • a: 设置可引导标记
    • b: 编辑bsd磁盘标签
    • c: 设置DOS操作系统兼容标记
    • d: 删除一个分区
    • l: 显示已知的文件系统类型, 82为Linux swap分区, 83为Linux分区
    • m: 显示帮助菜单
    • n: 新建分区 --> 123依次编号 --> +2G(分配2G空间) -->
    • o: 建立空白DOS分区表
    • p: 显示分区列表
    • q: 不保存退出
    • s: 新建空白SUN磁盘标签
    • t: 改变一个分区的系统ID
    • u: 改变显示记录单位
    • v: 验证分区表
    • w: 保存退出
    • x: 附加功能(仅专家)
  1. 重新读取分区表信息: partprobe # 避免重启
  2. 格式化分区: mkfs -t ext4 /dev/sdb1 # 注意不能格式化扩展分区
  3. 建立挂载点并挂载:
  • mkdir /disk1
  • mount /dev/sdb1 /disk1/
  1. 注意手动挂载只能临时生效, 重启将消失

3.2 自动挂载与fstab文件修复

自动挂载即将挂载写入配置文件/etc/fstab, 永久生效

  1. /etc/fstab文件说明
  • 第1字段: 分区设备文件名或UUID(硬盘通用唯一识别码, 避免分区顺序改变给系统造成错误)
    • dumpe2fs -h /dev/sdb1 # 查看指定硬盘的UUID
  • 第2字段: 挂载点
  • 第3字段: 文件系统名称
  • 第4字段: 挂载参数
  • 第5字段: 指定分区是否被dump备份, 0表示不备份, 1表示每天备份, 2表示不定期备份
  • 第6字段: 指定分区是否被fsck检测, 0表示不检测, 其他数字表示检测的优先级, 数字越小优先级越高
  1. 分区自动挂载:
  • vi /etc/fstab
  • 将"/dev/sdb1 /disk1 ext4 defaults 1 2"写在里面
  • 注意/etc/fstab是系统启动时将检查的文件, 如果写错系统可能会崩溃
    • 一般来说如果报错需要root权限进入系统, 并做/etc/fstab文件的修复
      • mount -o remount,rw / # 不执行该命令会发现即使是root也无法修改/etc/fstab文件
  • mount -a # 如果这条命令不报错说明没有写错

第十章 Linux_Shell基础

1. 概述

Shell是解释执行的脚本语言, 在Shell中可以直接调用Linux系统命令

  1. Shell的分类:
  • Bourne Shell: 从1979起UNIX开始使用, B Shell的主文件名是sh
  • C Shell: 主要在BSD版的UNIX系统中使用, 语法与C相类似
  • 两者语法结构完全不兼容
    • B Shell包括sh, ksh, Bash, pshm, zsh
    • C Shell包括csh, tcsh
  • Bash: Bash与sh兼容, 现在的Linux中基本都是Bash
  1. Linux支持的Shells
  • 查看配置文件/etc/shells
  • 输入sh进入Shell编程界面
  • 特殊Shell: /nologin # 禁用Shell

2. 脚本执行方式

  1. echo: 输出指令:
  • echo ‘Hello world!’ # 注意如果是双引号则’!‘需要转义, 因为Shell中的’!'有特殊含义
  • echo -e ‘Hello world\nshenchao’ # -e: 支持反斜杠转义字符输出
  • 转义字符:
    • \\: 输出反斜杠
    • \a: 输出警告音
    • \b: 退格键, 也就是向左删除键
    • \c: 取消输出行末的换行符, 与-n选项一致
    • \e: ESC键
    • \f: 换页符
    • \n: 换行符
    • \r: 回车键
    • \t: 制表符
    • \v: 垂直制表符
    • \0nnn: 按照八进制ASCII码输出字符, 其中0为数字零, nnn是三位八进制数
    • \xhh: 十六进制的ASCII码输出字符
  • echo -e “ab\bc” # 输出ac
  • echo -e “\e[1;31m] abcd \e[0m” # 输出abcd且带颜色, \e[1;<颜色代码>]表示开始颜色输出, \e[0m是结束颜色输出
    • 30m: 黑色
    • 31m: 红色
    • 32m: 绿色
    • 33m: 黄色
    • 34m: 蓝色
    • 35m: 洋红
    • 36m: 青色
    • 37m: 白色
  1. 脚本编写与执行:
  • vi hello.sh # 进入编辑界面
  • 首行先写一个标识这是Shell脚本的标记语言(非注释,不可缺省): #!/bin/Bash
  • 脚本执行:
    • 赋予执行权限直接运行: chmod 755 hello.sh 后直接输入 hello.sh
    • 通过Bash调用: Bash hello.sh # 无需赋予执行权限
  1. 注意点:
  • Windows的回车符和Linux的回车符是不同的, 所以Windows中编写的Shell脚本是不能直接在Linux中运行的
    • dos2unix hello.sh # 直接用dos2unix就可以转换

3. Bash基本功能

3.1 历史命令与补全

  1. 历史命令查询:
  • history [选项] [历史命令保存文件]
    • 直接执行history即可查看所有历史命令
    • history -c: 清空历史命令
    • history -w: 把缓存中的历史命令写入历史明林给保存文件, 家目录下的.bash_history文件
  • 历史命令默认保存最近1000条, 可以在/etc/profile中修改默认值 # HISTSIZE=1000
  1. 历史命令的调用:
  • 上下箭头调用历史命令
  • 使用"!n"重复执行第n条历史命令: history输出有序号
  • 使用"!!"重复执行上一条命令
  • 使用"!<字串>"重复执行最后一条以该字串开头的命令
  1. 命令与文件补全: tab键可以补全命令与文件名或目录名

3.2 别名与快捷键

  1. 命令别名:
  • alias # 查看所有命令别名
    • cp=“cp -i”
    • l.=“ls -d .* --color=auto”
    • ll=“ls -l --color=auto”
    • ls=“ls --color=auto”
    • mv=“mv -i”
    • rm=“rm -i”
  • alias vi=“vim” # 令vi是vim的一个别名, vim比vi的功能更强大
  • 命令执行时顺序:
    • 第一顺位执行用绝对路径或相对路径执行的命令
    • 第二顺位执行别名
    • 第二顺位执行Bash的内部命令 # 如cd在环境变量中还是会找到的, 但优先Bash内部命令
    • 第二顺位执行按照$PATH环境变量中查询得到的第一个命令 # 常用命令都在环境变量里
  • 定义别名切忌与现有命令名相同
  • 设置别名永久生效: vi /root/.bashrc
    • 这里就想起来安装anaconda后conda和py3,py的别名问题
    • 将alias vi="vim"写入家目录下的.bashrc文件
  1. Bash常用快捷键
  • Ctrl+A: 把光标移动到命令行开头
  • Ctrl+E: 把光标移动到命令行末尾
  • Ctrl+C: 强制终止当前的命令
  • Ctrl+L: 清屏, 相当于clear
  • Ctrl+U: 删除或剪切光标前的命令
  • Ctrl+K: 删除或剪切光标后的命令
  • Ctrl+Y: 粘贴Ctrl+U/K剪切的内容
  • Ctrl+R: 在历史命令中搜索
  • Ctrl+D: 退出当前终端
  • Ctrl+Z: 暂停, 并放入后台
  • Ctrl+S: 暂停屏幕输出
  • Ctrl+Q: 恢复屏幕输出

3.3 输入输出重定向

  1. 标准输入输出
  • 键盘: 设备文件名(/dev/stdin), 文件描述符(0), 标准输入
  • 显示器: 设备文件名(/dev/stdout), 文件描述符(1), 标准输出
  • 显示器: 设备文件名(/dev/stderr), 文件描述符(2), 标准错误输出
  1. 输出重定向:
  • 标准输出重定向:
    • [命令] > [文件名] # 覆盖写入
    • [命令] >> [文件名] # 追加写入
  • 标准错误输出重定向:
    • [错误命令] 2> [文件名] # 覆盖写入
    • [错误命令] 2>> [文件名] # 追加写入
  • 正确输出和错误输出同时保存:
    • [命令] > [文件名] 2>&1 # 覆盖写入, 正确与错误都写入
    • [命令] > [文件名] 2>&1 # 追加写入, 正确与错误都写入
    • [命令] &> [文件名] # 覆盖写入, 正确与错误都写入
    • [命令] &>> [文件名] # 追加写入, 正确与错误都写入
    • [命令] >> [文件1] 2>>[文件2] # 正确的写到文件1, 错误的写到文件2
  1. 输入重定向: 用的不多, 一般在打补丁时用
  • wc [选项] < [文件名]
    • -c: 统计字节数
    • -w: 统计单词数
    • -l: 统计行数
  • wc进入输入界面, 输入一段内容后Ctrl+d, 会统计你输入的字节数, 单词书, 行数
  • wc < anaconda-ks.cfg # 统计文件内容

3.4 多命令顺序执行与管道符

  1. 多命令顺序执行:
  • 多命令执行符号:
    • [命令1];[命令2] # 执行完命令1后执行命令2
    • [命令1]&&[命令2] # 只有命令1正确执行才会执行命令2
    • [命令1]||[命令2] # 只有命令1执行错误才会执行命令2
  • 实际应用: dd命令(磁盘复制指令, 可以复制设备)
    • dd if=[输入文件] of=[输出文件] bs=[字节数] count=[个数]
      • if: 指定源文件或源设备
      • of: 指定目标文件或目标设备
      • bs: 指定一次输入/输出多少字节, 即一个数据块的大小
      • count: 指定输入/输出多少个数据块
    • date; dd if=/dev/zero of=/root/test/file bs=1k count=100000; date
    • [命令] && echo yes || echo no
    • make && make install
  1. 管道符:
  • 命令格式: [命令1] | [命令2] # 若命令1正确执行, 则将命令1的输出作为命令2的参数执行
  • ll -a /etc/ | more # 将/etc/下所偶文件与目录作为more的参数执行(可翻页换行)
  • netstat -an | grep “ESTABLISHED” # 查询所有已经连接的服务
  1. grep [选项] [“搜索内容”/文件名]
  • -i: 忽略大小写
  • -n: 输出行号
  • -v: 反向查找
  • –color=auto: 搜索出的关键字用颜色显示

3.5 通配符和其他特殊符号

  1. 通配符:
  • “?”: 匹配一个任意字符
  • “*”: 匹配0个或任意多个任意字符, 也就是可以匹配任何内容
  • “[]”: 匹配中括号中任意一个字符, 同正则
  • “[^]”: 匹配不是中括号内的任意一个字符
  • 示例: rm -rf * # 删除当前目录下所有文件和目录
  1. Bash中其他特殊符号:
  • 单引号: 单引号括起来的内容中特殊符号都是视为普通符号, 没有特殊含义(如美元符号和反引号都没有特殊含义)
  • 双引号: 双引号括起来的内容中特殊符号没有特殊含义, 但是美元符号, 反引号和反斜杠是例外, 分别表示"调用变量的值", “引用命令"和"转义符”
  • 反引号: 反引号括起来的内容是系统命令, Bash会优先执行, 和"$()"作用相同, 不过推荐不使用反引号, 因为容易看错
  • 其他特殊符号: #(注释); $(用于调用变量值, 如$name); $()用于调用系统命令的执行结果; 转义符
  • 示例:
    • name=sc # 定义变量name
    • echo ‘$name’ # 输出$name
    • echo “$name” # 输出sc
    • echo ‘$(date)’ # 输出$(date)
    • echo “$(date)” # 输出今天的日期

4. Bash变量

4.1 用户自定义变量

  1. Shell变量命名规则:
  • 字母数字下划线, 但不能以数字开头
  • 变量的默认类型都是字符串, 如果需要进行数值运算, 必须指定变量类型为数值型
  • 变量用等号赋值, 且等号两侧不能有空格
  • 变量值如果有空格需要用引号括起
  • 如果需要增加变量的值, 可以进行变量值的叠加, 不过变量需要用双引号或花括号包含: "$变量名"或${变量名}包含
  • 如果是把命令的结果作为变量值赋予变量, 需要用反引号或$()包含命令, 如$(date)
  • 环境变量一般大写
  1. 变量分类:
  • 用户自定义变量
  • 环境变量: 与系统操作环境相关的数据
  • 位置参数变量: 用于向脚本当中传递参数或数据的, 变量名不能自定义, 变量作用是固定的
  • 预定义变量: Bash中已经定义好的变量, 变量名和作用都无法自定义
  1. 本地变量:
  • 变量定义: name=“shen chao”
  • 变量叠加(字符串拼接):
    • aa=123 ## aa值为123
    • aa="$aa"456 # aa值为123456
    • aa=${aa}789 # aa值为123456789
  • 变量调用: echo $name
  • 变量查看: set
  • 变量删除: unset name

4.2 环境变量

环境变量会在当前Shell和这个Shell的所有子Shell中生效, 如果将环境变量写入相应的配置文件, 将会在所有的Shell中生效

  1. 设置环境变量:
  • export [变量名]=[变量值] # 定义环境变量
  • env # 查询变量
  • unset [变量名] # 删除变量
  • export [变量名] # 将已经存在的普通变量声明为环境变量
  1. 定义子Shell: 在父Shell里可以创建子Shell
  • 使用pstree可以查看进程树: 进程之间是有父子关系的
  • name=sc
  1. 常见的环境变量:
  • PATH: 系统查找命令的路径(同Windows, 但是Windows用";“分割, Linux用”:"分割)
    • PATH = “$PATH”:/root/bin/ # 添加一个新的环境变量/root/bin/, 临时生效, 重启失效
  • PS1: 定义系统提示符的变量, 即命令行每行开始那一串东西(下面写得都是双斜杠是为了输出为单斜杠)
    • \d: 显示日期, 格式为"星期 月 日"
    • \h: 显示简写主机名, 如默认主机名为localhost
    • \t: 显示24小时制时间HH:MM:SS
    • \T: 显示12小时制时间HH:MM:SS
    • \A: 显示24小时制时间HH:MM
    • \u: 显示当前用户名
    • \w: 显示当前所在目录的完整名称
    • \W: 显示当前所在目录的最后一个目录
    • \#: 执行的第几个命令
    • \$: 提示符, root显示为"#", 普通用户显示为"$"
    • PS1=’\u@\t \w]$’
    • PS1=’\u@@\h # \W]$’
    • PS1=’[\u@\h \W]$’

4.3 位置参数变量

  1. 位置参数变量:
  • “$n”: n为数字, $0表示命令本身, $1-$9代表第一到第九个参数, 10以上应当写成${10}
    • 类似python里面的一个sys.args, 即允许在运行脚本时传入参数, $0就是命令本身的字符串
    • 如可以执行hello.sh 1 2 3 # hello.sh中的$1就是1, hello.sh中的$2就是2, hello.sh中的$3就是3
    • 应用: sum=$(($1+$2)) # 相当于是一个加法运算器
  • “$*”: 表示命令行中所有的参数, 将它们看成一个整体, 即不可迭代, 就是一个以单空格拼接的字符串
    • hello.sh 1 2 3 则 $*是 1 2 3
  • “$@”: 表示命令行中的所有参数, 但是将每个参数区分对待, 即可迭代, 类似list
    • hello.sh 1 2 3 则 $@是 1 2 3
  • “$#”: 表示命令行中参数个数
      • hello.sh 1 2 3 则 $#是 3

4.4 预定义变量

可以认为位置参数变量是预定义变量的一个类型

  1. 预定义变量:
  • “$?”: 最后一次执行命令的返回状态(与dos中的errorlevel类似), 0表示正确执行, 非零则未正确执行
  • “$$”: 当前进程的进程号(PID), 即该脚本执行的进程号
  • “$!”: 后台运行(类似Windows中的最小化)的最后一个进程的进程号(PID)
  1. read: 接收键盘输入
  • read [选项] [变量名]
    • -p [“提示信息”]: 在等待read输入时, 输出提示信息
    • -t [秒数]: 等待时间
    • -n [字符数]: read命令只接受指定的字符数, 就会直接执行(无需回车)
    • -s: 隐藏输入的数据, 如密码输入

5. Bash运算符

5.1 数值运算与运算符

aa=11;bb=22;cc=$aa+$bb 输出结果是11+22

  1. declare: 声明变量类型
  • 语法: declare [+/-] [选项] [变量名]
    • “-”: 给变量设定类型属性
    • “+”: 取消变量的类型属性
    • -i: 将变量生命为整型
    • -x: 将变量声明为环境变量(等价于export)
    • -p: 显示指定变量的被声明的类型
  1. 数值运算:
  • 方法1(declare): aa=11;bb=22;declare -i cc=$aa+$bb;
  • 方法2(expr/let): aa=11;bb=22;dd=$(expr $aa + $bb); # expr可以替换为let, 注意"+"两侧必须有空格
  • 方法3($((运算式))或$[运算式]): aa=11;bb=22;ff=$(($aa+$$bb));gg=$[$aa+$bb]
  1. 运算符: 优先级从高到低排列
  • 13级: 单目负("-"), 单目正("+")
  • 12级: 逻辑非("!"), 按位取反或补码("~")
  • 11级: 乘("*"), 除("/"), 取模("%")
  • 10级: 加("+"), 减("-")
  • 9级: 按位左移("<<"), 按位右移(">>")
  • 8级: 小于等于("<="), 大于等于(">="), 小于("<"), 大于(">")
  • 7级: 等于("=="), 不等于("!=")
  • 6级: 按位与("&")
  • 5级: 按位抑或("^")
  • 4级: 按位或("|")
  • 3级: 逻辑与("&&")
  • 2级: 逻辑或("||")
  • 1级: 赋值("=" “+=” “-=” “*=” “/=” “%=” “&=” “^=” “|=” “<<=” “>>=”)

5.2 变量测试与内容替换

  1. 变量置换方式:
  • x=${y-新值} # 变量y没有设置:(x=新值), 变量y为空值(x为空), 变量y设置值(x=$y)
  • x=${y:-新值} # 变量y没有设置:(x=新值), 变量y为空值(x=新值), 变量y设置值(x=$y)
  • x=${y+新值} # 变量y没有设置:(x为空), 变量y为空值(x=新值), 变量y设置值(x=新值)
  • x=${y:+新值} # 变量y没有设置:(x为空), 变量y为空值(x为空), 变量y设置值(x=新值)
  • x=${y=新值} # 变量y没有设置:(x=新值,y=新值), 变量y为空值(x为空,y值不变), 变量y设置值(x=$y,y值不变)
  • x=${y:=新值} # 变量y没有设置:(x=新值,y=新值), 变量y为空值(x=新值,y=新值), 变量y设置值(x=$y,y值不变)
  • x=${y?新值} # 变量y没有设置:(新值输出到标准输出,即屏幕), 变量y为空值(x为空), 变量y设置值(x=$y)
  • x=${y:?新值} # 变量y没有设置:(新值输出到标准输出,即屏幕), 变量y为空值(新值输出到标准输出,即屏幕), 变量y设置值(x=$y)

6. 环境变量配置文件

6.1 简介

  1. source: 使得配置文件内容生效
  • 语法: source [配置文件名] 或 . [配置文件名] # .是source的别名
  1. 常用环境变量: PATH, HISTSIZE, PS1, HOSTNAME
  2. 环境变量配置文件:
  • /etc/profile
  • /etc/bashrc
  • /etc/profile.d/*.sh
  • ~/.bash_profile
  • ~/.bashrc

6.2 作用

  1. 环境变量配置文件调用拓扑顺序: 拓扑顺序靠后的环境变量的优先级更高
  • /etc/profile
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc
  • /etc/profile.d/*.sh
  • /etc/profile.d/lang.sh
  • /etc/sysc.config/i18n
  • 命令提示符
  1. /etc/profile的作用:
  • 定义USER
  • 定义LOGNAME
  • 定义MAIL
  • 定义PATH
  • 定义HOSTNAME
  • 定义HISTSIZE
  • 定义umask
  • 调用/etc/profile.d/*.sh文件

6.3 其他配置文件与登录信息

  1. 注销时生效的环境变量配置文件: ~/.bash_logout
  2. 其他配置文件: ~/.bash_history # 保存历史命令, 不建议清空该文件, 除非是
  3. Shell登录信息:
  • 本地终端欢迎信息: /etc/issue
    • \d: 显示当前系统日期
    • \s: 显示操作系统名称
    • \l: 显示登录的终端号
    • \m: 显示硬件体系结构, 如i386, i686
    • \n: 显示主机名
    • \o: 显示域名
    • \r: 显示内核版本
    • \t: 显示当前系统时间
    • \u: 显示当前登录用户的序列号
  • 远程终端欢迎信息: /etc/issue.net
    • 转义符在该文件中不能使用
    • 是否显示此欢迎信息, 由ssh的配置文件/etc/ssh/sshd_config决定, 加入"Banner /etc/issue.net"行才能显示, 且需要重启SSH服务
  • 登录后欢迎信息: /etc/motd
    • 不管本地或远程都生效的欢迎信息

第十一章 Linux_Shell编程

1. 正则表达式

  1. 正则与通配符:
  • 正则是包含匹配, grep, awk, sed等命令可以支持正则
    • 如grep会将包含正则的整行记录全部输出
  • 通配符用于匹配符合条件的文件名, 是完全匹配,ls, find, cp这些命令不支持正则表达式, 所以只能使用Shell自己的通配符来进行匹配
    • 如ls只会将完全相同的结果输出
  • 注意这个区别只限于Linux的Shell, 一些语言中通配符与正则是不区分的
  1. 基础正则表达式:
  • *: 前一个字符匹配零或任意次
  • .: 匹配除换行符外任意字符
  • ^: 匹配行首
  • $: 匹配行尾
  • []: 匹配中括号中任意一个字符
  • [^]: 匹配中除括号中外的任意一个字符
  • {n}: 前一个字符出现n次
  • {n,}: 前一个字符出现不小于n次
  • {n,m}: 前一个字符至少出现n次, 最多出现m次
  1. 正则语法举例:
  • grep [正则表达式] [文件名] # 在文件名中匹配正则输出结果
  • 正则表达式需要用""引起来, 而非//
  • grep “aa*” test.txt # 从test.txt中找出包含"aa*"的行

2. 字符截取命令

grep是截取行, cut和awk用于截取列

2.1 cut命令

  1. cut [选项] [文件名] # cut只能对csv格式的文件进行截取
  • -f [列号]: 提取第几列
  • -d [分隔符]: 默认分隔符是制表符
  1. 应用示例:
  • df -h | grep “sda5” | cut -f 5
    • df -h # 输出磁盘使用情况
    • grep “sda5” # 取与sda5相关的记录行
    • cut -f 5 # 取第5列的信息: 磁盘使用率

2.2 printf命令

  1. printf [‘输出类型输出格式’] [输出内容]
  • 输出类型: 需要单引号括起
    • %ns: 输出字符串, n是数字指代输出几个字符
    • %ni: 输出整数, n是数字指代输出几个数字
    • %m.nf: 输出浮点数, m和n是数字, 指代输出的整数位数和小数位数, 如%8.2f代表输出8位数, 其中2位小数, 6位整数
  • 输出格式: 需要单引号括起
    • \a: 输出警告声音
    • \b: 输出退格键, 即Backspace键
    • \f: 清除屏幕
    • \n: 换行
    • \r: 回车, 即Enter键
    • \t: 水平输出退格键, 即Tab键
    • \v: 垂直输出退格键
  • printf %s 1 2 3 4 5 6 # 输出: 123456
  • printf %s %s %s 1 2 3 4 5 6 # 输出: %s%s123456
  • printf ‘%s %s %s’ 1 2 3 4 5 6 # 输出: 1 2 34 5 6
  • printf ‘%s %s %s\n’ 1 2 3 4 5 6 # 输出: 1 2 3\n4 5 6
  • printf ‘%s’ $(cat test.txt) # 输出文件内容
  • printf ‘%s\t %s\t %s\t %s\t %s\t \n’ $(cat test.txt) # 调整输出文件内容(csv格式)

2.3 awk命令

awk命令中输出支持print和printf命令, print与python一样输出换行, printf是标准格式输出命令, 不会自动加入换行符

  1. awk ‘条件1{动作1} 条件2{动作2}…’ [文件名] # awk是很复杂的, awk编程
  • 条件(Pattern): 一般使用关系表达式作为条件, 如x>10, x>=10, x<=10等
  • 动作(Action): 格式化输出, 流程控制语句
  • 示例:
    • awk ‘{printf $2 “\t” $6 “\n”}’ test.txt # 制表符分割的csv文件, 取第2列和第6列
    • df -h | awk ‘{print $1 “\t” $3}’ # 输出df -h结果的第1列与第3列
    • awk ‘BEGIN{printf “This is a transcript\n”} {printf $2 “\t” $6 “\n”}’ # BEGIN就是一个条件, 表示在所有动作执行之前, 因为默认awk先读取文件第一行然后再执行其他东西
    • awk ‘BEGIN{FS=":"} {printf $2 “\t” $6 “\n”}’ # 指定分隔符为冒号
    • awk ‘END{printf “This is an end\n”} {printf $2 “\t” $6 “\n”}’ # END也是一个条件
  • FS内置变量:
    • cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN{FS=":"} {printf $2 “\t” $6 “\n”}’
  • 关系运算符:
    • cat test.txt | grep -v Name | awk ‘$6 >= 87 {print $2 “\n”}’ # 读取test.txt并找出列名不是Name的列, 并且只当第6列不小于87时输出第2列

2.4 sed命令

sed是一种几乎包括在所有UNIX平台的轻量级刘编辑器, 主要用于数据的选取, 删除, 替换, 增加

sed区别于vim, sed可以接收管道符输出, 更适合用于编程

  1. sed [选项] -’[动作]’ [文件名]
  • -n: 一般sed命令会把所有数据都输出到屏幕, 如果加入此选项, 则只会把经过sed命令处理的行输出到屏幕
  • -e: 允许对输入数据应用多条sed命令编辑
  • -i: 用sed的修改结果直接修改读取数据的文件, 而非屏幕输出
  • 动作:
    • a \ # 追加, 在当前杭后添加一行或多行, 添加多行时, 除最后一行外, 每行末尾需要用反斜杠表示数据未完结
    • c \ # 行替换, 用c后面的字符串替换原数据行, 替换多行时, 除最后一行外, 每行末尾需要用反斜杠表示数据未完结
    • i \ # 插入, 在当前行前插入一行或多行, 插入多行时, 除最后一行外, 每行末尾需要用反斜杠表示数据未完结
    • d # 删除, 删除指定的行
    • p # 打印, 输出指定的行
    • s # 字串替换, 用一个字符串替换另一个字符串, 格式为"行范围s/旧字串/新字串/g", 类似vim的语法
  • 示例:
    • sed ‘2p’ student.txt # 输出文件第2行后, 再输出整个文件
    • sed -n ‘2p’ student.txt # 只输出文件第2行
    • sed ‘2a hello’ student.txt # 在第二行后追加hello
    • sed ‘2i hello \ world student.txt’ # 在第二行前插入两行数据(反斜杠后应该换行或回车, 表示追加未结束)
    • sed ‘2c No such person’ student.txt # 数据替换, 第二行替换成查无此人
    • sed -i ‘3s/74/99/g’ student.txt # 在第三行把74换成99, 并更新到student.txt中
    • sed -e ‘s/Liming//g;s/Gao//g’ student.txt # 同时把Liming和Gao替换成空, s前不加数字范围表示所有行

3. 字符处理命令

  1. sort: 字符排序
  • 语法: sort [选项] [文件名]
    • -f: 忽略大小写
    • -n: 以数值型进行排序, 默认是字符串
    • -r: 反向排序
    • -t: 指定分隔符, 默认制表符
    • -k n[,m]: 按照指定的字段范围排序, 从第n个字段到第m个字段, 不加m即到最后一个字段
  • sort /etc/passwd
  • sort -t “;” -k 3,3 /etc/passwd # 指定分隔符";"且按照第三个字段排序
  • sort -n -t “;” -k 3,3 /etc/passwd # 指定分隔符";"且按照第三个字段排序(当作数值型)
  1. wc: 统计命令
  • wc [选项] [文件名]
    • -l: 只统计行数
    • -w: 只统计单词数
    • -m: 只统计字符数

4. 条件判断: test

  1. 按照文件类型进行判断:
  • -b [文件]: 判断该文件是否存在, 并且是否为块设备文件
  • -c [文件]: 判断该文件是否存在, 并且是否为字符设备文件
  • -d [文件]: 判断该文件是否存在, 并且是否为目录文件
  • -e [文件]: 判断该文件是否存在
  • -f [文件]: 判断该文件是否存在, 并且是否为普通文件
  • -L [文件]: 判断该文件是否存在, 并且是否为符号链接文件
  • -p [文件]: 判断该文件是否存在, 并且是否为管道文件
  • -s [文件]: 判断该文件是否存在, 并且是否为非空
  • -S [文件]: 判断该文件是否存在, 并且是否为套接字文件
  • 用法: test -e [文件名/目录名] 或 [-e [文件名/目录名]]
    • [-d /root] && echo “yes” || echo “no”
  1. 按照文件权限进行判断
  • -r 文件: 判断该文件是否存在, 并且是否文件拥有读取权限
  • -w 文件: 判断该文件是否存在, 并且是否文件拥有写入权限
  • -x 文件: 判断该文件是否存在, 并且是否文件拥有执行权限
  • -u 文件: 判断该文件是否存在, 并且是否文件拥有SUID权限
  • -g 文件: 判断该文件是否存在, 并且是否文件拥有SGID权限
  • -k 文件: 判断该文件是否存在, 并且是否文件拥有SBIT权限
  • 用法: test -r [文件名/目录名] 或 [-r [文件名/目录名]]
  1. 两个文件之间进行比较:
  • [文件1] -nt [文件2]: 判断文件1的修改时间是否比文件2新
  • [文件1] -ot [文件2]: 判断文件1的修改时间是否比文件2旧
  • [文件1] -et [文件2]: 判断文件1与文件2的inode号是否一直, 即是否为同一个文件或硬链接
  • 用法: [[文件1] -nt [文件2]]
  1. 两个整数之间比较:
  • [整数1] -eq [整数2]: 相等
  • [整数1] -ne [整数2]: 不相等
  • [整数1] -gt [整数2]: 大于
  • [整数1] -lt [整数2]: 小于
  • [整数1] -ge [整数2]: 大于等于
  • [整数1] -le [整数2]: 小于等于
  1. 字符串的判断:
  • -z [字符串]: 判断字符串是否为空
  • -n [字符串]: 判断字符串是否非空
  • [字符串1] == [字符串2]: 字符串是否相等
  • [字符串1] != [字符串2]: 字符串是否不相等
  1. 多重条件判断:
  • [判断1] -a [判断2]: 与
  • [判断1] -o [判断2]: 或
  • ! [判断]: 非

5. 流程控制

5.1 if语句

  1. 单分支if条件语句: 注意条件判断式的中括号内一定要两端有空格
if [ 条件判断式 ]; then
	...
fi

if [ 条件判断式 ]
	then 
		...
	fi

# !/bin/bash
rate=$(df -h | grep "/dev/sda3" | awk 'print $5' | cut -d "%" -f1) # 把根分区使用率作为变量值赋予rate
if [ $rate -ge 80]
	then 
		echo "Warning!"
fi
  1. 双分支if条件语句:
if [ 条件判断式 ]
	then
		...
	else
		...
fi

# 备份mysql数据库
# !/bin/bash
ntpdate asia.pool.ntp.org &> /dev/null  # 同步系统时间
date = $(date +%y%m%d) # 只输出年月日
size = $(du -sh /var/lib/mysql) # 统计mysql数据库大小
if [ -d /tmp/dbbak ]
	then
		echo "Data : $date!" > /tmp/dbbak/dbinfo.txt
		echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
		cd /tmp/dbbak
		tar -zcf mysql*lib-$date.tar.gz /var/lib/mysql dbinfo.txt &> /dev/null
		rm -rf /tmp/dbbak/dbinfo.txt
	else
		mkdir /tmp/dbbak
		echo "Data : $date!" > /tmp/dbbak/dbinfo.txt
		echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
		cd /tmp/dbbak
		tar -zcf mysql*lib-$date.tar.gz /var/lib/mysql dbinfo.txt &> /dev/null
		rm -rf /tmp/dbbak/dbinfo.txt

# 判断apache是否启动
# !/bin/bash
port = $(nmap -sT 192.168.1.156 | grep tcp | grep http |awk '{print $2}') # 使用nmap命令扫描服务器, 并截取apache服务的状态
if [ "$port" == "open" ]
	then ...
	else ...
fi
  1. 多分支if条件语句
if [ 条件判断式1 ]
	then ...
elif [ 条件判断式1 ]
	then ...
else 
	...
fi

5.2 case语句

  1. case语法
read -p "Please choose yes/no " -t 30 cho
case $cho in 
	"yes")
		echo "yes"
		;;
	"no")
		echo "no"
		;;
	*)
		echo "error"
		;;
esac

5.3 for循环

  1. 语法一:
for [变量] in [值1] [值2] ... [值n]
    do
	    ...
	done

# 示例1
for i in 1 2 3 4 5 6
	do
		echo $i
	done

# 批量解压缩脚本
# !/bin/bash
ls *.tar.gz > ls.log
for i in $(cat ls.log)
	do
		tar -zxf $i &>/dev/null
	done
rm -rf ls.log
  1. 语法二:
for (( 初始值;循环空值条件;变量变化 ))
	do
		...
	done

# 示例:
s=0
for ((i=1;i<=100;i=i+1))
	do
		s=$(($s+$1))
	done
echo $s

5.4 while循环until循环

  1. while循环语法:
while [ 条件判断式 ]
	do 
		...
	done

# 示例:
s=0
i=1
while [ $i -le 100 ]
	do 
		s = $(($s+$i))
		i = $(($i+1))
	done
  1. until循环语法:
until [ 条件判断式 ]
	do 
		...
	done

第十二章 Linux服务管理

1. 服务分类

  1. 服务的分类:
  • RPM包默认安装的服务: 默认
    • 独立的服务: 绝大多数服务是独立的, 位于内存中, 响应快, 耗费资源多(如httpd)
    • 基于xinetd服务: 后台管理其他服务的服务, 不占用内存, 响应慢
  • 源码包安装的服务: 外来
  1. 启动与自启动:
  • 服务启动
  • 自启动: 系统开机或重启后自动启动的服务
  • 手动: 通过其他执行程序执行开启
  1. 查询已安装的服务:
  • RPM包安装的服务:

    • chkconfig --list # 查看服务的自启动状态
  • 源码包安装的服务: 查看安装位置, 一般是/usr/local/下

  • 其他方法:

    • ps aux # 查看已经启动的服务(进程)
    • netstat -tlun # 查看已经启动的服务端口等信息
  • RPM安装服务和源码包安装服务的区别:

    • 安装位置不同, 源码包一般在/usr/local/, RPM包安装在默认位置
    • service可以启动RPM服务, 不能启动源码包服务

2. RPM服务的管理

2.1 独立服务管理

  1. RPM包安装文件的默认位置:
  • /etc/init.d/ # 启动脚本位置
  • /etc/sysconfig/ # 初始化环境配置文件位置
  • /etc/ # 配置文件位置
  • /etc/xinetd.conf # xinetd配置文件
  • /etc/xinetd.d/ # 基于xinetd服务的启动脚本
  • /var/lib/ # 服务产生的数据放在这里
  • /var/log/ # 日志
  1. 独立服务的启动:
  • /etc/init.d/独立服务名 start|stop|status|restart
  • service 独立服务名 start|stop|status|restart
    • service --status-all # 列出所有独立服务的状态
  1. 独立服务的自启动设置:
  • chkconfig [–level 运行级别] [独立服务名] [on|off]
    • chkconfig --level 2345 httpd on # 设置启动级别2|3|4|5下apache服务自启动
  • vim /etc/rc.d/rc.local 或 /etc/rc.local
    • 该文件是在系统开机后所有服务启动完后执行该文件
    • 因此只要将服务的启动命令写入该文件就可以实现自启动
    • 该文件不存在新建一个就可以了, 默认是个空文件
  • ntsysv 进入GUI设置界面手动设置, 红帽系列专有命令, 与setup类似

2.2 基于xinetd服务管理

  1. 安装xinetd和telnet:
  • yum -y install xinetd # 基于xinetd的服务现在越来越少了, 了解即可, 一般都是SSH
  • yum -y install telnet-server # telnet是少数几个基于xinetd的服务
  • 安装完后chkconfig --list将会显示基于xinetd管理的功能
    • 客户端访问xinetd里的服务是先请求xinetd, 然后由xinetd调用, xinetd是不安全的
  1. xinetd服务的启动:
  • 不能使用service telnet start
  • vim /etc/xinetd.d/telnet 后找到disable改成no即可(默认disable=yes)
  • 重启xinetd服务: service xinetd restart #
  • xinetd服务自启动: chkconfig telnet on 或 ntsysv手动设置
  • 注意: xinetd的启动有自启动的效果是完全一样的, 启动就默认会自启动, 停止自启动就会直接关闭

3. 源码包服务的管理

  1. 源码包启动方法:
  • 绝对路径启动: /usr/local/apache2/bin/apachectl start|stop
  • 启动方法一般在源码包的README里是会写的
  1. 源码包服务的自启动:
  • vim /etc/rc.d/rc.local 加入 /usr/local/apache2/bin/apachectl start
  1. 让源码包服务可以被service命令识别
  • ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache # 搞个软连接放到RPM的默认路径下即可
  1. 让源码包的apache服务能被chkconfig与ntsysv命令识别而自启动
  • vim /etc/init.d/apache 进行编辑
  • 指定httpd脚本可以被chkconfig管理: chkconfig 35 86 76 # 35 86 76分别表示运行级别, 启动顺序, 关闭顺序
  • /etc/rc.d/里的rc.n文件夹里存储启动级别为n的服务自启动脚本
  • chkconfig --add apache # 即可用chkconfig管理
    • chkconfig apache on # 即可用chkconfig管理

第十三章 Linux系统管理

1. 进程管理

1.1 进程查看

  1. 概念: 正在执行的一个程序或命令
  2. 作用:
  • 判断服务器状态
  • 查看所有进程
  • 杀死进程(最不常用的手段, 进程一般可以正常手段终止, 只有没有任何办法了才会kill)
  1. 查看系统中所有进程
  • ps aux # 使用BSD操作系统模式(UNIX)输出, 可能会有Warning
  • ps -le # 使用Linux标砖命令格式输出, -l是详细信息, -e是全部进程
  • ps aux 输出结果说明:
    • USER: 进程由哪个用户产生
    • PID: 进程ID, PID=1的进程永远是/sbin/init, 是系统调用的第一个进程, 是其余所有进程的父进程
    • %CPU: CPU占用率
    • %MEM: 物理内存占用率
    • VSZ: 占用虚拟内存大小, 单位KB
    • RSS: 占用实际物理内存大小, 单位KB
    • TTY: 进程在哪个终端运行, tty1-tty7代表本地控制台终端, tty7是GUI终端, 其他6个是字符界面终端, pts/0-256是虚拟终端, 不过大部分是无法识别的, 即"?"
    • STAT: 进程状态, 常见有R(运行), S(睡眠), T(停止), s(包含子进程), +(位于后台)
    • START: 进程启动时间
    • TIME: 占用CPU运算时间
    • COMMAND: 产生此进程的命令
  1. 查看系统健康状态:
  • top [选项]
    • -d [秒数]: 指定top命令每隔几秒更新, 默认三秒
  • 在top交互界面可以执行的命令:
    • h或?: 显示帮助
    • P: 以CPU使用率排序, 默认即为此项
    • M: 以内存使用率排序
    • N: 以PID排序
    • q: 退出top
  • top输出说明:
    • 第一行信息为任务队列信息:
      • 系统当前时间: 12:26:46
      • 系统已经连续运行的时间: up 1 day 13:32
      • 系统中登录的用户数: 2 users
      • 系统在前1/5/15分钟的平均负载: 一般小于1为较小负载, 大于1已经超出负载
    • 第二行为进程信息:
      • 系统中的进程总数: Tasks: 95 total
      • 正在运行的进程树: 1 running
      • 睡眠的进程: 94 sleeping
      • 正在停止的进程: 0 stopped
      • 僵尸进程: 0 zombie, 可能是在终止过程中发生错误, 需要手工检查并杀死
    • 第三行为CPU信息:
      • 用户模式占用的CPU百分比: 0.1%us
      • 系统模式占用的CPU百分比: 0.1%sy
      • 改变过优先级的用户进程占用的CPU百分比: 0.0%ni
      • 空闲CPU百分比: 99.7%id
      • 等待输入/输出的进程占用CPU百分比: 0.1%wa
      • 硬中断请求服务占用的CPU百分比: 0.0%hi
      • 软中断请求服务占用的CPU百分比: 0.1%si
      • st(Steal Time)虚拟时间百分比: 0.0%st, 就是当有虚拟机时, 虚拟CPU等待实际CPU的时间百分比
    • 第四行为物理内存信息:
      • 物理内存总量(KB): Mem: 625344k total
      • 已经使用的物理内存数量: 571504k used
      • 空闲的物理内存数量: 53840k free
      • 作为缓冲的内存数量: 65800k buffers
    • 第五行为交换分区(swap)信息:
      • 交换分区(虚拟内存)的总大小: Swap: 524280k total
      • 已经使用的交换分区大小: 0k used
      • 空闲交换分区的大小: 524280k free
      • 作为缓冲的交换分区的大小: 409280k cached
    • 以下为进程信息, 同ps aux
  • 查看进程树: pstree [-p]

1.2 终止进程

  1. kill: 杀死进程
  • 语法: kill [选项]
    • kill -l: 查看可用的进程信号, 一般有60多个, 以下列出常用的
      • 1(SIGHUP): 让进程立即关闭, 然后重新读取配置文件后重启
      • 2(SIGINT): 程序终止信号, 用于终止前台进程, 相当于Ctrl+C
      • 8(SIGFPE): 在发生致命的算数运算错误时发出, 不仅包括浮点运算错误, 还包括溢出及除数为0等其他所有的算数错误
      • 9(SIGKILL): 立即结束程序执行, 不能被阻塞, 处理和忽略, 用于强制杀死进程
      • 14(SIGALRM): 事重定时信号, 计算的是实际的时间或时钟时间, alarm函数使用该信号
      • 15(SIGTERM): 正常结束进程的信号, kill命令默认信号, 如果进程已经发生问题, 该信号无法正常终止, 才会使用SIGKILL信号
      • 18(SIGCONT): 恢复执行已经暂停的进程, 且不能被阻断
      • 19(SIGSTOP): 暂停前台进程, 相当于Ctrl+Z, 且不能被阻断
    • kill [信号ID] [PID]: 杀死进程, 默认信号为15
      • kill -1 22354 # 重启进程
      • kill -9 22368 # 强制杀死进程
      • kill 22358 # 默认是-15
  1. killall: 按照进程名杀死进程
  • 语法: killall [选项] [信号] [进程名]
    • -i: 交互式, 循环是否要杀死某个进程
    • -I: 忽略进程名的大小写
  • killall -9 httpd # 强制杀死apached进程
  1. pkill: 按照进程名杀死进程
  • 语法: pkill [选项] [信号] [进程名] # 与killall用法完全一样, 多个可以踢出用户
    • -t [终端号]: 按照终端号踢出用户
  • 实际应用:
    • w # 查询已经登录的用户
    • pkill -9 -t tty1 # 踢出中管好是tty1

2. 工作管理

  1. 把进程放入后台: 即windows中的最小化
  • tar -zcf etc.tar.gz /etc & # 在压缩命令后添加"&"即可: 放入后台, 继续运行
  • 按Ctrl+Z快捷键 # 放入后台, 停止运行
  1. 查看后台的工作:
  • jobs [-l]: -l表示显示工作的PID
  • 输出结果中, "+"号表示最近一个放入后台的工作, 也是工作恢复时默认恢复的工作; "-"号代表倒数第二个放入后台的工作
  1. 恢复暂停的工作(后台转前台):
  • fg %工作号 # "%工作号"的百分号可以忽略, 注意JID与PID是有区别的, JID就是jobs输出结果的第一列
  • fg 2 # 将JID为2的放入前台运行
  1. 恢复暂停的工作(前台到后台):
  • bg %工作好 # 同fg的使用
  • bg 2 # 将JID为2的放入后台运行
  • 注意某些任务是无法放入后台的, 如top命令是不能放入后台运行的, 因为这是没有意义的, top需要在前台与用户进行交互, 因此不能用bg, 同理vim

3. 系统资源查看

  1. vmstat: 监控系统资源
  • vmstat [刷新延时 刷新次数]
  • vmstat 2 3 # 即监听3次, 隔两秒一次
  1. dmesg: 开机时内核检测信息
  • dmesg | grep CPU # 查看CPU的检测信息
  1. free: 查看内存使用状态
  • free [-b|-k|-m|-g]
    • -b: 以字节为单位显示
    • -k: KB单位, 默认为KB
    • -m: MB单位
    • -g: GB单位
  • 缓存(cache)与缓冲(buffer)的区别:
    • 缓存是加速数据从硬盘中"读取"的
    • 缓冲是用来加速数据"写入"硬盘
  1. 查看CPU信息: /proc/cpuinfo文件
  2. uptime: 显示启动时间和平均负载, 即top和w命令的第一行
  3. 查看系统与内核相关信息:
  • uname [选项]
    • -a: 查看系统所有相关信息
    • -r: 查看内核版本
    • -s: 查看内核名称
  • 查看当前系统的位数: file /bin/ls # 任何一个命令的可执行文件里都有系统位数
  • 查询当前Linux系统的发行版本: lsb_release -a
  1. lsof: 列出进程打开或使用的文件
  • lsof -c [字符串] # 只列出以字符串开头的进程打开的文件
  • lsof -u [用户名] # 只列出某个用户的进程打开的文件
  • lsof -p [PID] # 列出某个进程打开的文件

4. 系统定时任务

  1. crond服务管理与访问控制:
  • service crond restart # 启动
  • chkconfig crond on # 设为自启动, 一般默认就是自启动
  • 必须crond服务启动才能执行系统定时任务
  1. 用户的crontab设置:
  • crontab [选项]
    • -e: 编辑crontab定时任务
    • -l: 查询crontab任务
    • -r: 删除当前用户所有的crontab任务, 一般是用vim语法编辑更便捷灵活
  • crontab -e # 打开了一个空文件, 默认是vim编辑, 写入标准格式
    • 标准定时任务格式: * * * * * [命令]
      • 第一个"*": 一小时中的第几分钟(0-59)
      • 第二个"*": 一天中的第几个小时(0-23)
      • 第三个"*": 一个月中的第几天(1-31)
      • 第四个"*": 一年中的第几月(1-12)
      • 第五个"*": 一周中的星期几(0-7, 0和7都是周日), 注意这个选项可能和第三个"*"竞合, 意思是两个同时满足, 即既每周运行一次, 又每月的那个日期也运行一次
    • 特殊符号:
      • “*”: 代表任何时间, 比如第一个"*"代表一小时中每分钟都执行一次
      • “,”: 代表不连续的时间, 比如0 8,12,16 * * * [命令] 代表在每天的8点0分, 12点0分, 16点0分执行一次命令
      • “-”: 代表连续的时间范围, 比如 0 5 * * 1-6 [命令] 代表在周一到周六的凌晨5点执行命令
      • “*/n”: 代表每隔多久执行一次, 比如 */10 * * * * [命令] 代表每隔10分钟执行一遍

第十四章 Linux日志管理

1. 简介

  1. 日期服务:
  • CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务, rsyslogd日志服务更加先进且功能多, 但格式与使用都与syslogd兼容, 学习起来基本和syslogd服务一致
  • rsyslogd的新特点:
    • 基于TCP网络协议传输日志信息
    • 更安全的网络传输方式
    • 有日志消息的即时分析框架
    • 后台数据库
    • 配置文件中可以写简单的逻辑判断
    • 与syslog配置文件兼容
  • 确定服务启动:
    • ps aux | grep rsyslogd
    • chkconfig --list | grep rsyslogd
  1. 常见日志的作用:
  • /var/log/cron # 记录系统定时任务相关的日志
  • /var/log/cups # 记录打印信息的日志
  • /var/log/dmesg # 记录系统在开机时内核自检的信息, dmesg命令显示内容
  • /var/log/btmp # 记录错误登录的日志, 二进制文件, 不能vim查看, 需要用lastb命令查看
  • /var/log/lastlog # 记录系统中所有用户最后一次的登陆时间的日志, 是二进制文件, 不能直接vim, 需要使用lastlog命令
  • /var/log/mailog # 记录邮件信息
  • /var/log/message # 记录系统重要信息的日志, 如果系统出现问题, 首先查看该文件
  • /var/log/secure # 记录验证和授权信息, 只要涉及账户密码的程序都会记录, 比如系统登录, ssh登录, su切换用户, sudo授权, 添加用户和修改用户密码都会在该日志文件
  • /var/log/wtmp # 永久记录所有用户的登录, 注销信息, 系统启动, 重启, 关机事件, 二进制文件, 使用last命令查询
  • /var/log/utmp # 记录当前已经登录用户的信息, 该文件随着用户的登录和注销不断变化, 只记录当前登录用户的信息, 不能直接vim, 使用w, who,users等命令查询
  1. 其他日志:
  • RPM安装的系统服务会默认把日志记录在/var/log/目录中
  • 源码包安装的服务日志在源码包指定目录中
  • 这些都不是由rsyslogd服务来记录和管理的
  • 示例:
    • /var/log/httpd
    • /var/log/mail
    • /var/log/samba/
    • /var/log/sssd/ # 守护进程安全服务目录

2. rsyslogd服务

  1. 日志文件格式
  • 基本日志格式包含以下四列:
    • 事件产生的时间
    • 发生事件的服务器主机名
    • 产生事件的服务名或程序名
    • 事件的具体信息
  1. /etc/rsyslog.conf配置文件: 配置所有日志记录规则及存储位置
  • 服务名称:
    • auth: 安全和认证相关消息(不推荐使用authpriv替代)
    • authpriv: 安全和认证相关消息(私有的)
    • cron: 系统定时任务cront和at产生的日志
    • daemon: 和各个守护进程相关的日志
    • ftp: ftp守护进程产生的日志
    • kern: 内核产生的日志(非用户进程)
    • local0-local7: 为本地使用预留的服务
    • lpr: 打印产生的日志
    • mail: 邮件收发消息
    • news: 与新闻服务器相关的日志
    • syslog: 有syslogd服务产生的日志信息, 虽然服务名改成了rsyslogd, 但是很多配置还是沿用了syslogd
    • user: 用户等级类别的日志信息
    • uucp: uucp子系统的日志信息, uucp早期数据传输协议
  • 连接符号:
    • “*”: 代表所有日志等级
    • “.”: 代表只要比后面的等级高的, 如cron.info表示cron服务产生的日志等级大于等于info级别的就记录
    • “.=”: 只记录特定级别的日志
    • “.!”: 代表不等于, 除该等级外都记录
  • 日志等级: 从低到高
    • debug
    • info
    • notice
    • warning
    • err
    • crit
    • alert
    • emerg
  • 日志记录位置:
    • 日志文件的绝对路径, 如/var/log/secure
    • 系统设备文件, 如/dev/lp0
    • 转发给远程主机, 如@192.168.0.210:514
    • 用户名, 如root(必须在线)
    • 忽略或丢弃, 如"~"
  • 示例:
    • authpriv.* /var/log/secure # 所有日志等级的认证相关服务都记录在/var/log/secure中
    • *.emerg root # 把紧急事件发给root

3. 日志轮替

日志很大, 不可能都永久保存, 需要轮替, 比如只保存最近30天的日志

  1. 日志文件的命名规则
  • 如果配置文件中拥有dateext参数, 那么日志会用日期作为日志文件的后缀, 例如secure-20160605, 这样不会重名, 轮替只要删除旧的日期文件即可
  • 如果配置文件中没有dateext参数, 那么日志文件就需要进行改名进行轮替, 目前一般都是有dateext参数的
  1. /etc/logrotate.conf配置文件:
  • 参数:
    • daily: 按日轮替
    • weekly: 按周轮替
    • monthly: 按月轮替
    • rotate [数字]: 保留的日志文件个数, 0指不备份
    • compress: 日志轮替时, 旧的日志进行压缩
    • create mode owner group: 建立新日志, 同时指定新日志额权限与所有者和所属组, 如create 0600 root utmp
    • mail address: 日志轮替时将内容发送到邮箱
    • missingok: 如果日志不存在则忽略该日志的警告信息
    • notifempty: 如果日志为空文件, 则不进行日志轮替
    • minsize [大小]: 日志轮替的最小值, 即日志达到最小值才会轮替, 否则就算时间到了也不轮替
    • size [大小]: 日志大于指定大小才轮替, 而非按照时间轮替, 如size 100k
    • dateext: 使用日期作为日志轮替文件的后缀名, 如secure-20130605
  • 注意该配置文件中有全局配置, 对于每个日志文件还有局部配置, 局部配置优先于全局配置
  1. 把apache日志加入轮替:
  • vim /etc/logrotate.conf
  • /usr/local/apache2/logs/access_log {daily create rotate30} # access_log是日志保存的路径

第十五章 Linux启动管理

1. 启动流程

1.1 运行级别

  1. 运行级别:
  • 0: 关机
  • 1: 单用户模式, 可以想象为windows的安全模式, 主要用于系统修复
  • 2: 不完全的命令行模式, 不包含NFS服务
  • 3: 完全的命令行模式, 就是标准字符界面
  • 4: 系统保留
  • 5: 图形模式
  • 6: 重启动
  1. 运行级别命令:
  • runlevel # 查看运行级别命令
  • init 运行级别 # 执行运行级别
  1. 系统默认运行级别: 修改/etc/inittab

1.2 启动过程: 以CentOS 6.x为例

  1. 启动流程图:
    启动流程图

2. 启动引导程序

2.1 Grub配置

  1. grub中分区表示
  • 第一块SCSI硬盘:
    • 第一个主分区: /dev/sda1(设备文件名), hd(0,0) --Grub中设备文件名
    • 第二个主分区: /dev/sda2(设备文件名), hd(0,1) --Grub中设备文件名
    • 扩展分区: /dev/sda3(设备文件名), hd(0,2) --Grub中设备文件名
    • 第一个逻辑分区: /dev/sda5(设备文件名), hd(0,4) --Grub中设备文件名
  • 第二块SCSI硬盘
    • 第一个主分区: /dev/sda1(设备文件名), hd(1,0) --Grub中设备文件名
    • 第二个主分区: /dev/sda2(设备文件名), hd(1,1) --Grub中设备文件名
    • 扩展分区: /dev/sda3(设备文件名), hd(1,2) --Grub中设备文件名
    • 第一个逻辑分区: /dev/sda5(设备文件名), hd(1,4) --Grub中设备文件名
  1. grub配置文件
  • vim /boot/grub/grub/conf
    • default=0 # 默认启动第一个系统
    • timeout=5 # 等待选择系统时间, 默认5秒, 超过5秒就默认启动第一个系统
    • splashimage=(hd0,0)/grub/splash.xpm.gz # 这里是指定grub启动时的背景图像文件的保存位置的
    • hiddenmenu # 隐藏菜单
      grub配置文件内容说明

第十六章 Linux备份与恢复

1. 概述

  1. Linux系统需要备份的数据目录
  • /root/ 目录
  • /home/ 目录
  • /var/spool/mail/ 目录
  • /etc/ 目录
  • 其他需要备份的目录
  1. 安装服务的数据
  • apache需要备份的数据
    • 配置文件
    • 网页主目录
    • 日志文件
  • mysql需要备份的数据
    • 源码包安装的mysql: /usr/local/mysql/data/
    • RPM包安装的mysql: /var/lib/mysql
  1. 备份策略:
  • 完全备份: 每次都全盘备份
  • 增量备份: 每次跟上一次备份进行对比后备份
  • 差异备份: 每次跟第一张备份进行对比后备份

2. 备份命令

完全备份直接tar就行了, 但是增量备份相对麻烦, Linux系统提供了增量备份的工具

  1. dump: 备份
  • 检查是否安装dump: rpm -qa | grep dump
  • 安装dump: yum -y install dump
  • 语法: dump [选项] [备份之后的文件名] [原文件或目录]
    • -0到-9: 即0-9十个备份级别
      • 0: 完全备份
      • 1: 增量备份
    • -f [文件名]: 指定备份之后的文件名
    • -u: 备份成功后, 把备份时间记录在/etc/dumpdates
    • -v: 显示备份过程中的详细信息
    • -j: 调用bzlib库压缩备份文件, 即把备份文件压缩成.bz2格式
    • -W: 显示允许被dump的分区的备份级别及备份时间
  • 备份分区:
    • dump -0uj -f /root/boot.bak.bz2 /boot/ # 备份命令: 先执行一次完全备份, 并压缩和更新备份时间
    • cat /etc/dumpdates # 查看备份时间文件
    • cp install.log /boot/ # 复制日志文件到boot分区
    • dump -1uj -f /root/boot.bak1.bz2/boot/ # 增量备份boot分区, 并压缩
    • dump -W # 查询分区的备份级别及备份时间
  • 备份文件或目录:
    • dump -0j -f /root/etc.dump.bz2 /etc/ # 完全备份/etc/目录, 注意只有对于分区来说才能增量备份, 目录的备份级别只能是0
  1. restore: 恢复
  • 语法: restore [模式选项] [选项]
    • 模式选项: restore命令常用的模式有以下四种, 不能混用
      • -C: 比较备份数据和实际数据的变化
      • -i: 进入交互模式, 手工选择需要恢复的文件
      • -t: 查看模式, 用于查看备份文件中拥有哪些数据
      • -r: 还原模式, 用于数据还原
    • 选项: -f # 指定备份文件的文件名
  • 比较备份数据和实际数据的变化:
    • mv /boot/vmlinuz-2.6.32-279.el6.i686 /boot/vmlinuz-2.6.32-279.el6.i686.bak # 改个内核镜像文件的名字, 就启动不了了
    • restore -C -f /root/boot.bak.bz2 # 恢复备份修改这个错误
  • 还原模式: 以还原boot.bak.bz2分区备份为例
    • mkdir boot.test # 新建一个目录用于实验
    • cd boot.test/ # 进入该目录
    • restore -r -f /root/boot.bak.bz2 # 解压缩: 完全备份, 先还原完全备份的数据 boot.bak.bz2
    • restore -r -f /root/boot.bak1.bz2 # 恢复增量备份数据 boot.bak1.bz2
  • 还原/etc/目录的备份etc.dump.bz2
    • restore -r -f etc.dump.bz2

END

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐