BIOS 搭配 MBR/GPT 的启动流程
按下开机键后,BIOS 也会跟着启动起来,它会分析计算机里有哪些存储设备,然后 BIOS 会依据用户的设置去取得能够启动的硬盘,并读取该硬盘第一个扇区 MBR ,扇区内存放着基本的启动引导程序,然后启动引导程序读取内核文件并执行相关程序,最后启动操作系统。
多重引导:启动引导程序(boot leader)可以提供选项让用户选择不同的启动选项,然后根据用户的选择还可以将启动启动管理功能交给其他启动引导程序。(原因:我们的硬盘不是第一扇区有启动引导程序,分区也可以安装在各自分区的启动扇区。
GTP 格式:BIOS 也能从 LBA0 的 MBR 兼容区块读取第一阶段的穷的那个引导程序代码(这里的引导程序有可能不支持 GPT)。另外,由于 LBA0 仅能提供第一阶段的启动引导程序代码,如果使用 grub 的启动引导程序,就需要额外分出一个 ”BIOS boot“ 的分区,这个分区放置其他开机过程所需的程序。
## 使用快捷键 alt + ctrl + 【F1~F6】 可以切换不同的终端
### 查看当前系统的字符集
locale
------------------------
LANG=en_US.UTF-8 # 表示是英文
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
------------------------
### 修改 /etc/locale.conf 文件
vim /etc/locale.conf
------------------------
LANG="zh_CN.UTF-8" jian
------------------------
### 通过以上操作即可解决中文乱码问题!
## 几点注意:
1. 系统默认没有 /etc/default/i18n 文件,若有可以先试试修改此文件。
2. 不建议对LC_ALL进行配置,确实没必要。
3. 调用文件顺序:profile--> /etc/profile.d/lang.sh--> locale.conf
date +"%Y/%m/%d %H:%M:%S"
2022/09/14 15:45:10
### 查看目前有多少个用户登录
who
root pts/0 2022-09-15 13:25 (192.168.222.1)
### 将内存中的数据读入硬盘
sync
### 关机命令
shutdown [-krhc] [time] [警告信息]
-r:在停掉所有服务之后就重启 相当于重启
-k:不是真的关机,只是将关机信号发出去
-h:将系统服务停掉后,立即关机 经常`shutdown -h now`来实现立即关机
-c:取消已经在进行的 shutdown 任务,比如`shutdown -h 20:15`表示将在 20:15 关机,此时执行`shutdown -c`就可以取消关机
[systemctl] poweroff # 进入系统关机模式,直接关机
[systemctl] halt # 进入系统停止模式,屏幕可能会保留一些信息,这与个人的电源管理模式有关。
init 0
### 重启命令
init 6
[systemctl] reboot
### 休眠命令
[systemctl] suspend # 进入休眠模式
pwd -P # 显示真正的路径,而非链接路径。
mkdir -m 711 test # 建立一个权限为 711 的目录文件
cp -u # 增量复制:即进行更新(update)复制。
cp -d # 有链接属性的复制链接属性,而不是复制文件本身。
cp -p # 复制时保留原文件的属性(比如文件的所有者,读写权限等)
### 文件查看
cat # 由第一行开始显示文件内容
-n # 显示行号
-b # 显示非空行行号
-A # 显示特殊字符(改 bug 的时候可能会用)
tac # 从最后一行开始显示
nl # 显示的时候输出行号
more # 一页一页得到显示文件内容
# 空格键:下翻一页
# enter键:下翻一行
# /string:向下查找 string
# :f :立刻显示出文件名以及目前显示的行数
# b:往回翻行
less # 与 more 相似,但是可以往前翻页
# 空格键:下翻一页
# enter键:下翻一行
# /string:向下查找 string
# ?string:向上查找 string
# n:重复前一个字正向找
# N:重复前一个字反向找
# g:回到文档首
# G:回到文档尾
tail # 只看后面几行
-n num # 显示 num 行
-f # 持续刷新后面接收到的内容
head # 只看前面几行
od # 二进制的方式读取文件内容
### 查看文件的类型
file 文件名
# 例如:
file a.txt
a.txt: ASCII text
### 文件和目录的默认权限
1. 文件默认最大的权限是 666,又因为 umask = 022,所以文件默认的权限就是 666-022 = 644
2. 目录默认最大的权限是 777,又因为 umask = 022,所以文件默认的权限就是 777-022 = 755
### 文件隐藏属性
chattr [+=-][ASacdistu] 文件或目录名称
+:增加某一个特殊参数,其他原本存在的参数不动
-:删除某一个特殊的参数,其他原本存在的参数不懂
=:直接设置参数,且仅有后面接的参数
A:当你读取文件时,存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的读写磁盘
S:修改文件时,同步写入磁盘
`a:文件只能增加数据,不能修改和删除数据`
c:文件存入磁盘时会自动压缩,读取时会自动解压
`i:文件不能被删除、改名、设置链接也无法写入数据`
s:如果该文件被删除,就是在磁盘里永久删除
u:与 s 相反
## 注意:
1. chattr 只能在 ext2、ext3、ext4 的传统的文件系统完全生效,而 xfs 文件系统只有 AadiS 生效
2. 可以使用 `lsattr [-adR] 文件或目录名称` 命令查看隐藏权限,`-a`将隐藏文件的属性也列出来,`-d`只显示该目录的隐藏权限。
### 查找命令专用
which 命令名字
which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/alias
/usr/bin/which
### 查找文件
whereis [-l] 文件名 # 主要是 /bin /sbin 下的执行文件和 /usr/share/man 下面的 man page 文件,where -l 可以列出查找那些目录。
# 下载 locate:yum install -y mlocate
# 更新 locate 数据库:updatedb
locate [-irc] 文件名
-i:忽略大小写
-r:后面可以接正则表达式
-c:仅输出找到的数量
find 目标目录下 -name 文件名 # 寻找目标目录下的文件
## 注意:whereis 是查找特定的目录,locate 是事先搜寻好了文件并记录到数据库中,然而 find 就是硬读取磁盘中的内容找,所以没事别用 find。
### 列出文件系统整体磁盘使用量
df [-aThi] [目录或文件名]
-a:列出所有的文件系统,包括系统特有的 /proc 等文件系统
-T:连同该硬盘分区的文件系统名称也列出
-h:人性化的显示容量
-i:不用磁盘用来,而已 inode 的数量来显示‘
df -h /opt/ # 查看 /opt 目录下有多少可用
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 36G 4.3G 32G 12% /
### 查看目录所占磁盘空间
du [-ahs] [目录或文件名]
-a:列出所有文件和目录的容量,默认仅列出文件下面的文件量
-h:人性化显示容量
-s:仅显示该目录下的总量
### 磁盘格式的分区、格式化、挂载
lsblk -f # 查看磁盘的文件系统
fdisk/gdisk 磁盘目录 # 根据上面所查找的文件系统选择不同的命令,其中 xfs 格式的使用 gdisk
mkfs.xfs 分区目录 # 格式化
mount -a # 依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
mount [-to] 分区目录 挂载点 # 实现挂载
-t:设置欲挂载类型,比如 xfs、ext4、nfs ...
-o:后面可以接一些其他参数:
auto,noauto:是否允许系统 mount -a 自动挂载
dev,nodev:是否允许建立设备文件
suid,nosuid:是否允许有 suid/sgind 的文件存在
exec,noexec:是否允许有二进制文件
ro,rw:为只读或可读写
remount:重新挂载,在系统出错时很有用
vim /etc/fstab # 设置自动挂载
# 设备/uuid 挂载点 文件系统 文件系统参数 dump fsck检验扇区
/dev/sdb1 /mnt xfs defaults 0 0
#### 注意:写完之后使用 mount -a 检验一下,别盲目重启
## 上面的文件系统参数和上面 mount -o 命令后面跟的参数相同。
当进入"单人维护模式"时,尝试此命令:`mount -n -o remount,rw /`,然后修改 `/etc/fstab` 即可。
### 挂载镜像
mount -o loop 镜像名 目录
1. 例如:
mount -o loop Centos-7.01406-x86-64-DVD.iso /data/centos_dvd
### 将可用空间再挂载
1. 建立空文件
dd if=/dev/zero of=/mnt/srv bs=1M count=2048 # if=input file of=output file bs=blocks ,创建1G的空文件。
2. 格式化空文件
mkfs.xfs -f /mnt/srv
3. 创建挂载目录
mkdir /srved
4. 进行挂载
mount -o loop UUID="4989f65a-fb83-4ff4-9f4a-421f6cd5ca54" /srved
### 使用磁盘物理分区
gdisk /dev/sdb
mkswap /dev/sdb2
blkid /dev/sdb2
swapon /dev/sdb2
swapon -s # 查看内存使用情况
### 使用文件创建内存交换空间
dd if=/dev/zero of=/tmp/swap bs=1M count=128
mkswap /tmp/swap # 这个步骤请特别小心,稍有不慎就会使文件系统挂掉
swapon /tmp/swap
swapon -s
### 卸载已挂载的内存
swapoff /tmp/swap /dev/sdb2
### 硬链接
ln 源文件 目标文件
1. 不能跨文件系统、不能链接目录
2. 目标文件直接链接源文件的 inode,这样当删除源文件时,对目标文件不影响
### 符号链接
ln -s 源文件 目标文件
1. 目标文件的数据区块记录的是源文件的文件名,打开目标文件相当于又打开了源文件,这样删除源文件时,目标文件就会打不开了
2. 当建立符号链接目录时,目标目录的删除方式不能删除文件,而是直接删除目录,不然源文件中的文件也会跟着删除。
### 移动光标
1. 数字+↓ : 向下移动多少行
2. 数字+G : 移动到哪一行
3. $G : 最后一行
### 查找和替换
:1,$s#hello#world#g 将1到最后一行的 hello 换为 world
:1,$s#hello#world#gc 加 c 进行确认
### 删除、复制、粘贴
d数字d 剪切多少行
y数字y 复制多少行
p 粘贴
u 撤销
. 重复上一个动作
光标移动到行头:ctrl + a
光标移动到行尾:ctrl + e
backspace:ctrl + u
delete:ctrl + k
### 环境变量和自定义变量
1. 子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量
### 环境变量的声明
export 变量名称
### 自定义变量声明
变量名称
### 显示环境变量
export
env
### 显示所有的变量
set
### 常见的环境变量的含义
?:关于上一个执行命令的返回值,若是零则上个命令执行正常,其他数字为不正常,既然是环境变量,则查看时为`echo $?`。
$:目前 shell 的 pid
PATH:执行文件查找的路径,目录与目录中间以冒号分割,查找命令时按照顺序查找
### 使用 declare
declare [-axir] 变量名[=变量值]
-a:定义数组
-i:定义整数(可以参与计算)
-x:定义环境变量
-r:定义只读变量(不能够删除)
### 定义数组
declare -a arr
arr[1]="linux"
arr[2]="windows"
echo ${arr[1]}
linux
### 定义交互式变量
read [-pt] 变量名
-p:后面可以跟提示字符
-t:后面可以接等待的秒数
### 在文件中编写环境变量
vim /etc/profile # 所有用户
vim ~/.bashrc # 当前用户
history [n]
history [-c]
history [-raw] hisfiles
n:数字,意思是“要列出最近的 n 条命令行表”
-c:将目前的 shell 中的所有 history 内容清空
-a:将目前新增的 history 命令新增入 histfiles 中,若没有加 histfiles 则默认写入 ~/.bash history
-r:将 histfiles 的内容督导目前这个 shell 的 history 记录中
-w:将目前的 history 记录内容写入 histfiles 中。
1. /etc/profile 是系统整体的设置,它还会调用并执行可以所有可以匹配 /etc/profile.d/*.sh 的文件
2. ~/。bash_profile 或 ~/.bash_login 或 ~/.profile 属于用户个人设置
3. bash 在读完系统整体文件后,就会继续读取用户个人设置文件(按照 上面的顺序依次读下去,读到一个就停止)
### ~/。bash_profile 中的内容
cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then ## 判断并读取 ~/.bashrc
. ~/.bashrc # 等同于 source ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
------------------------------------------------
4. 在 non-login shell 这种非登录情况取得 bash 操作界面的只会读取 ~/.bashrc 这个文件:
### 查看 ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i' # 使用者的个人设置
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then # 整体的环境设置
. /etc/bashrc
fi
5. /etc/bashrc 会帮我们根据不同 uid 设置 umask,根据不同的 uid 设置提示字符,调用 /etc/profile.d/*。sh 的文件
6. 若误删 ~/.bashrc 可以复制 /etc/skel/.bashrc 的内容
符号 | 意义 |
---|---|
***** | 代表“ 0 个到无穷多个”任意字符 |
? | 代表一定有一个任意字符 |
[] | 代表“一定有一个在括号内”的字符(非任意字符)。例如 [abc] 代表一定有一个字符,可能是 a 、b、c中的一个 |
[^] | 反向选择,例如 [^abc] ,代表一定有一个字符,只要是非 a b c 的其他字符就接受 |
[-] | 在编码顺序内所有的字符,例如 [0-9] 代表 0 和 9 之间的所有数字 |
标准输入:代码为 0,使用 < 或 <<
标准输出:代码为 1,使用 > 或 >>
标准错误输出:代码为 2,使用 2> 或 2>>
标准输出和标准错误输出写入不同文件:`echo "hello world" > list_right 2> list_err`
标准输出和标准错误输出写入同一文件:`echo "hello world" 2>&1 list` 或 `echo "hello world" &> list`
`2>&1`:将错误输出 2> 转到 & 标准输出 1>
`1>&2`:将标准输出 1> 转到 & 错误输出 2>
### 不打开新窗口输入信息
cat >> test.txt << EOF # 起始符
> hello world # 输入的内容
> EOF # 结束符
filename=/etc/sysconfig/network-scripts/ifcfg-ens33
echo ${filename:0:5} # 打印位置为零,步长为 5 的字符
/etc/
echo ${filename:5:5}
sysco
echo ${#filename} # 打印字符串长度
42
filename=${filename/sysconfig/etc} # 将 sysconfig 替换 为 /etc/
[root@localhost ~]# echo ${filename}
/etc/etc/network-scripts/ifcfg-ens33
${filename:-"my.filename.txt"}:假如$filename没有设定或为空值,则使用my.filename.txt作传回值。(非空值时不作处理)
测试的标志 | 代表意义 |
---|---|
1. 关于某个文件名的’文件类型’判断,如 test -e filename 表示存在否 | |
-e | 该’文件名’是否存在? (常用) |
-f | 该’文件名’是否存在且为文件(file)? (常用) |
-d | 该’文件名’是否存在且为目录(directory)? (常用) |
-b | 该’文件名’是否存在且为一个 block device 装置? |
-c | 该’文件名’是否存在且为一个 character device 装置? |
-S | 该’文件名’是否存在且为一个 Socket 档案? |
-p | 该’文件名’是否存在且为一个 FIFO (pipe) 文件? |
-L | 该’文件名’是否存在且为一个链接文件? |
2. 关于文件的权限检测,如 test -r filename 表示可读否 (但 root 权限常有例外) | |
-r | 侦测该文件名是否存在且具有’可读’的权限? |
-w | 侦测该文件名是否存在且具有’可写’的权限? |
-x | 侦测该文件名是否存在且具有’可执行’的权限? |
-u | 侦测该文件名是否存在且具有’SUID’的属性? |
-g | 侦测该文件名是否存在且具有’SGID’的属性? |
-k | 侦测该文件名是否存在且具有’Sticky bit’的属性? |
-s | 侦测该文件名是否存在且为’非空白档案’? |
3. 两个文件之间的比较,如: test file1 -nt file2 | |
-nt | (newer than)判断 file1 是否比 file2 新 |
-ot | (older than)判断 file1 是否比 file2 旧 |
-ef | 判断 file1 与 file2 是否为同一档案,可用在判断 hard link 的判定上。 主要意义在判定,两个档案是否均指向同一个 inode 哩! |
4. 关于两个整数之间的判定,例如test n1 -eq n2 | |
-eq | 两数值相等(equal) |
-ne | 两数值不等(not equal) |
-gt | n1 大於 n2 (greater than) |
-lt | n1 小於 n2 (less than) |
-ge | n1 大于等于 n2 (greater than or equal) |
-le | n1 小於等于 n2 (less than or equal) |
5. 判定字符串的数据 | |
test -z string | 判定字符串是否为 0 ? 若 string 为空字串,则为 true |
test -n string | 判定字符串是否非为 0 ? 若 string 为空字串,则为 false。 注: -n 亦可省略 |
test str1 == str2 | 判定 str1 是否等于 str2 ,若相等,则回传 true |
test str1 != str2 | 判定 str1 是否不等于 str2 ,若相等,则回传 false |
6. 多重条件判定,例如: test -r filename -a -x filename | |
-a | (and)两状况同时成立! 例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。 |
-o | (or)两状况任何一个成立! 例如test-rfile-o-x file,则file具有rax权限时,就可回传true。 |
! | 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true |
sh a.sh hello world
$1:hello
$2:world
$#:2
$0:a.sh
$@:hello world
$*:hello world
#!/bin/bash
function tests(){ # 函数定义的方式
echo "函数内\$0:"${0} # 函数内部的 $0 和 函数外部的 $0 相同
echo "函数内\$1:"${1} # 函数内部的 $1... 由调用函数时给定的参数确定
}
echo "\$0:"${0}
echo "\$1:"${1}
tests hello # 函数调用的方式
[root@localhost ~]# ./b.sh world
$0:./b.sh
$1:world
函数内$0:./b.sh
函数内$1:hello
su [-lm] [-c 命令] [username]
-:单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登陆系统;若使用者名称没有加上去,则代表切换为 root 的身份。
-l:与 - 类似,但后面需要加欲切换的使用者账号!也是 `login-shell(需要登录密码)` 的方式。
-m:-m 与 -p 是一样的,表示『使用目前的环境配置,而不读取新使用者的配置文件』
-c:仅进行一次命令,所以 -c 后面可以加上`命令`喔!
### 总结以上:
1. 若要`完整的切换到新使用者的环境`,必须要使用` su - username ` 才会连同 PATH、USER、MAIL 等变量都转成新用户的环境
2. 如果仅想要运行一次 root 的`命令`,可以利用`su - -c "命令串"`的方式来处理;
3. 使用 root 切换成为任何使用者时,并不需要输入新用户的口令;
sudo [-u username] command
-u:后面跟欲切换的使用者,若没有此项默认 root
示例:
## 使用 sshd 用户在 /tmp 下创建 test.txt 文件(由于 sshd 用户是虚拟用户,没法登录,所以我们只能使用 sudo)
sudo -u sshd sh -c "touch /tmp/test.txt" # 通过 [ sh -c “command” ] 的方式,可以执行多条语句,而且易性好
### 编写 /etc/sudoers ,授权 sudo 权限
visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
gx ALL=(mz) ALL
# 参数意义
# 使用者账号 登陆者的来源网络主机名=(可切换的身份) 可下达的命令(绝对路径)
# root ALL=(ALL) ALL <==这是默认值
# 不使用密码的 sudo
gx ALL=(mz) NOPASSWD: ALL # 就多个 【NOPASSWD:】 而已
# 有限制的 sudo
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd # 前面加上 ! 表示不能执行
myuser1 ALL=(root) /usr/bin/passwd # 只能用 root 身份执行 /usr/bin/passwd 命令
# 透过群组设置 sudo
%wheel ALL=(ALL) ALL # 前面加了【 % 】,表示所在 wheel 的用户都能使用 sudo
# sudo 和 visudo 配合,使普通用户在不知道 root 密码的情况下登录 root
User_Alias ADMINS = pro1, pro2, pro3, myuser1 # 起别名,批量管理
ADMINS ALL=(root) /bin/su - # 赋予 ADMINS 用户们 /bin/su/ - 权限
RAID-0(等量模式,stripe): 效能最佳,安全最低
`数据会等量的放置到各个磁盘上`,一旦有任何一颗磁盘损毁,在 raid 上面的所有的数据都会遗失而无法读取。磁盘利用率最大,利用率为 100%
RAID-1(映射模式,mirror)完整备份
`让同一份数据完整保存到两颗磁盘上`,磁盘利用率为 50%,如果两个磁盘的容量不相同,则整个阵列的容量为最小的那个磁盘。效能较低,但是相较安全,一颗毁了,数据照样使用。
RAID-5(效能与数据备份的均衡考量)
RAID-5 至少需要`三颗`以上的磁盘才能够组成,数据写入时还会添加一个`同位检查数据(parity)`,用于当有磁盘损毁时的救援。同位检查码每次都`记录到不同的磁盘`中,所以`任意一个磁盘的损坏都能恢复回来`,但是也只能损毁一个。读取效率还行,写入效率由于同位检查码的存在效率不是很高。
Spare Disk(预备磁盘)
在不停机的情况下恢复磁盘的正常使用
### 软件磁盘列阵的配置
1. 准备好预磁盘阵列的`磁盘`或`分区`
2. 创建磁盘阵列
mdadm --create --auto=yes /dev/md0 --raid-devices=4 --level=5 --spare-devices=1 /dev/sdb{2,3} /dev/sdb{5,6,7}
3. 格式化磁盘阵列
mkfs -t ext3 /dev/md0
4. 格式化磁盘阵列
mount /dev/md0 /mnt/raid
5. 实现自动挂载
mdadm --detail /dev/md0 | grep -i uuid
vi /etc/mdadm.conf
--------------------------------------
ARRAY /dev/md0 UUID=7c60c049:57d60814:bd9a77f1:57e49c5b
# RAID装置 识别码内容
--------------------------------------
vi /etc/fstab
--------------------------------------
/dev/md0 /mnt/raid ext3 defaults 1 2
--------------------------------------
### madam 的语法
mdadm --create --auto=yes /dev/md[0-9] --raid-devices=N \
> --level=[015] --spare-devices=N /dev/sdx /dev/hdx...
# 选项与参数:
--create:为创建 RAID 的选项;
--auto=yes:决定创建后面接的软件磁盘阵列装置,亦即 /dev/md0, /dev/md1...
--raid-devices=N:使用几个磁碟 (partition) 作为磁盘阵列的装置
--spare-devices=N:使用几个磁碟作为备用 (spare) 装置
--level=[015]:配置这组磁盘阵列的等级。支持很多,不过建议只要用 0, 1, 5 即可
mdadm --detail /dev/md0
--detail:后面所接的那个磁盘阵列装置的详细资讯
### 查看磁盘列阵的信息
mdadm --detail /dev/md0
/dev/md0: <==RAID 装置档名
Version : 00.90.03
Creation Time : Tue Mar 10 17:47:51 2009 <==RAID 被创建的时间
Raid Level : raid5 <==RAID 等级为 RAID 5
Array Size : 2963520 (2.83 GiB 3.03 GB) <==此 RAID 的可用磁碟容量
Used Dev Size : 987840 (964.85 MiB 1011.55 MB) <==每个装置的可用容量
Raid Devices : 4 <==用作 RAID 的装置数量
Total Devices : 5 <==全部的装置数量
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Mar 10 17:52:23 2009
State : clean
Active Devices : 4 <==启动的(active)装置数量
Working Devices : 5 <==可动作的装置数量
Failed Devices : 0 <==出现错误的装置数量
Spare Devices : 1 <==预备磁碟的数量
Layout : left-symmetric
Chunk Size : 64K <==就是图2.1.4内的小区块
UUID : 7c60c049:57d60814:bd9a77f1:57e49c5b <==此装置(RAID)识别码
Events : 0.2
Number Major Minor RaidDevice State
0 3 6 0 active sync /dev/hda6
1 3 7 1 active sync /dev/hda7
2 3 8 2 active sync /dev/hda8
3 3 9 3 active sync /dev/hda9
4 3 10 - spare /dev/hda10
# 最后五行就是这五个装置目前的情况,包括四个 active sync 一个 spare !
# 至於 RaidDevice 指的则是此 RAID 内的磁碟顺序
cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 hda9[3] hda10[4](S) hda8[2] hda7[1] hda6[0] <==第一行
2963520 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU] <==第二行
unused devices: <none>
# 第一行:指出 md0 为 raid5 ,且使用了 hda9, hda8, hda7, hda6 等四颗磁碟装置。每个装置后面的中括号 [] 内的数字为此磁碟在 RAID 中的顺序 (RaidDevice);至於 hda10 后面的 [S] 则代表 hda10 为 spare 之意。
# 第二行:此磁盘阵列拥有 2963520 个block(每个 block 单位为 1K),所以总容量约为 3GB, 使用 RAID 5 等级,写入磁碟的小区块 (chunk) 大小为 64K,使用 algorithm 2 磁盘阵列演算法。 [m/n] 代表此阵列需要 m 个装置,且 n 个装置正常运行。因此本 md0 需要 4 个装置且这 4 个装置均正常运行。 后面的 [UUUU] 代表的是四个所需的装置 (就是 [m/n] 里面的 m) 的启动情况,U 代表正常运行,若为 _ 则代表不正常。
### 模拟磁盘损坏并救援
1. 损坏磁盘
mdadm --manage /dev/md0 --fail /dev/hda8
2. 查看是否损坏
mdadm --detail /dev/md0
....(前面省略)....
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 1 <==出错的磁碟有一个!
Spare Devices : 1
3. 将出错的磁碟移除并加入新磁碟
mdadm --manage /dev/md0 --add /dev/hda11 --remove /dev/hda8
### 救援模式语法
mdadm --manage /dev/md[0-9] [--add 装置] [--remove 装置] \
> [--fail 装置]
选项与参数:
--add:会将后面的装置加入到这个 md 中!
--remove:会将后面的装置由这个 md 中移除
--fail:会将后面的装置配置成为出错的状态
### 关闭软件(重要!)
1. 取消挂载
umount /dev/md0
2. 将 /etc/fstab 中的去除
3. 关闭 /dev/md0
mdadm --stop /dev/md0
4. 检查是否成功
cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none> <==看吧!确实不存在任何阵列装置!
5. 去除 /etc/mdadm.conf 的内容
# 直接将命令丢到后台的运行的 &
command &
# 将目前的工作丢到后台暂停的 ctrl + z
当前台有正在运行的应用时,可以直接按 ctrl + z 放到后台
# 观看目前的背景工作状态 jobs
jobs [-lrs]
-l:除了列出 job number 与命令之外,同时列出 pid 号码
-r:仅列出正在运行的
-s:仅列出被暂停的
jobs
#job-number 新添加 状态 具体命令
[1] + 已杀死 ping www.baidu.com
# 将背景工作拿到前景处理 fg
fg %job-number
# 将前景工作变背景 bg
bg %job-number
# 将工作停止 kill
kill -l # 列出目前的 kill 能够使用的信号(sigal)
kill signal %job-number
signal:-1 # reload
-9 # 强制杀死
-15 # 正常停
### 查看进程
ps -ef | grep service # 获取指定的pid
ps aux # 获取进程的详细信息
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.7 0.1 193996 7132 ? Ss 13:40 0:0 [kthreadd]
%MEM:占用的物理内存是多少
VSZ:使用的虚拟内存量是多少
RSS:占用的固定内存里是多少
TTY:使用的终端
TIME:该进程实际使用 CPU 运作的时间
ps axjf # 以进程树的形式展现
### 动态的查看进程的信息
top [-d num]
-d:后跟秒数,就是整个进程画面更新的秒数,预设是 5 秒
top [-bnp]
-b:以批次的方式执行 top,通常会大批额数据流重导向来将批次的输出成文件
-n:与 b 搭配,意义是需要进行几次 top 的输出结果
-p:指定某些个 pid 来进行观察检测而已
在 top 使用过程中可以使用的按键指令:
?:显示在 top 中可以输入那些按键指令
P:以cpu 的使用资源排序显示
M:以 Memory (内存)的使用资源排序
N:以 pid 来排序
top - 14:29:24`[目前的时间]` up 48 min`[开机到当前的时间]`, 1 user`[已经登录的用户数]`, load average: 0.08, 0.03, 0.05 `[系统在 1,5,15 分钟的平均负载]`
Tasks: 154 total`[进程总量]`, 1 running, 153 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa`【特别注意:当系统变慢了可能就是它的问题】`, 0.0 hi, 0.0 si, 0.0 st
KiB Mem`[物理内存使用情况]` : 5925676 total, 4433992 free, 973540 used, 518144 buff/cache
KiB Swap`[虚拟内粗使用情况]`: 6160380 total, 6160380 free, 0 used. 4709012 avail Mem `[优先级]` `和PR有关`
PID USER PR`priority` NI`nice` %CPU %MEM TIME+ COMMAND
### 进程树
yum install -y psmisc
pstree [-puA]
-A:可能能解决乱码问题
-p:列出 pid
-u: 列出所属用户
### 进程优先级
priority 的值越低,其优先级就越高
用户无法直接调整 priority,但是可以通过调整 nice 的值来升高和降低优先级
最终的优先级就是 priority 加上 nice
nice 值的范围是 -2~19
# 新执行的指令用这个
nice [-n num] command
-n:后跟数字,范围 -20~19
# 已存在的进程 nice 重新调整
renice [-n num] pid
uname [-asrmpi]
-a:所有系统相关的信息都会列出来
-s:系统核心的名称
-r:核心版本
-m:本系统硬件的名称 x86
-p:CPU 的类型
-i:硬件的平台
uname -a
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
### 侦测系统资源变化
vmstat [-a] [延迟 [总计侦测次数]] # cpu 内存等信息
vmstat [-fs] # 内存相关
vmstat [-S 单位] # 设定显示数据单位
vmstat [-d] # 与磁盘相关
vmstat [-p 分区槽] # 与磁盘相关
-a:使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息
-r:开机到目前位置,系统复制(fork)的进程数
-s:将一些事情(开机至目前为止)导致的内存变化情况列表说明
-s:后面可以接单位,让显示的数据有单位,例如 K/M 取代 bytes 的容量
-d:累出磁盘的读写信息
-p:后面列出分区槽,可显示该分区操的读写信息总量
# 实例
vmstat 1 3 # 每秒一次,共计三次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 4357272 2128 578804 0 0 24 1 38 58 0 0 100 0 0
0 0 0 4357248 2128 578804 0 0 0 0 134 191 0 0 100 0 0
0 0 0 4357248 2128 578804 0 0 0 0 99 177 0 0 100 0 0
进程字段 (procs) 的项目分别为:
r :等待运作中的进程数量;
b:不可被唤醒的进程数量。这两个项目越多,代表系统越忙碌
内存字段 (memory) 项目分别为:
swpd:虚拟内存被使用的容量;
free:未被使用的内存容量;
buff:用于缓冲存储器;
cache:用于高速 缓存
内存置换空间 (swap) 的项目分别为:
si:由磁盘中将进程取出的量;
so:由于内存不足而将没用到的进程写入到磁盘的 swap 的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与主存储器之间传来传去,系统效能会很差!
磁盘读写 (io) 的项目分别为:
bi:由磁盘读入的区块数量;
bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常 忙碌!
系统 (system) 的项目分别为:
in:每秒被中断的进程次数;
cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与接口设备的 沟通非常频繁! 这些接口设备当然包括磁盘、网络卡、时间钟等。
CPU 的项目分别为:
us:非核心层的 CPU 使用状态;
sy:核心层所使用的 CPU 状态;
id:闲置的状态;
wa:等待 I/O 所耗费的 CPU 状态;
st:被虚拟机 (virtual machine) 所盗用的 CPU 使用状态 (2.6.11 以后才支持)。
### systemd 的好处
并行处理所有服务:多内核架构,可以让所有的服务同时启动
服务依赖的自我检查
依 daemon 功能分类:比如 socket sevice target等
将多个 daemon 集合成一个群组(target):执行某个 target 就是执行了好多个 daemon 的意思
向下部分兼容 init
### systemd 的配置文件放置目录
/etc/systemd/system 管理员根据主机系统的需求所建立的执行脚本 优先级最高
/run/systemd/system 系统执行过程中所产生的服务脚本 优先级第二
/usr/lib/systemd/system 每个服务最主要的启动脚本的设置
服务类型
扩展名 | 主要服务功能 |
---|---|
.service | 主要是系统服务,包括服务器本身所需要的本地服务以及网络服务都 是!比较经常被使用到的服务大多是这种类型! 所以,这也是最常见的类型了! |
.socket | 内部程序数据交换的插槽服务 (socket unit):主要是 IPC (Inter-process communication) 的传输讯息插槽文件 (socket file) 功能。 这种类型的服务通常在 监控讯息传递的插槽文件,当有透过此插槽文件传递讯息来说要链接服务时,就依据当 时的状态将该用户的要求传送到对应的 daemon, 若 daemon 尚未启动,则启动该 daemon 后再传送用户的要求。 使用 socket 类型的服务一般是比较不会被用到的服务,因此在开机时通常会稍微延迟 启动的时间 (因为比较没有这么常用嘛!)。一般用于本地服务比较多,例如我们的图 形界面很多的软件都是透过 socket 来进行本机程序数据交换的行为。 (这与早期的 xinetd 这个 super daemon 有部份的相似喔!) |
.target | 执行环境类型 (target unit):其实是一群 unit 的集合,例如上面表格中谈到的 multi-user.target 其实 就是一堆服务的集合~也就是说, 选择执行 multi-user.target 就是执行一堆其他 .service 或/ 及 .socket 之类的服务就是了! |
.mount | 文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络的自动挂载、NFS 文件系统 挂载等与文件系统相关性较高的程序管理。 |
.path | 侦测特定文件或目录类型 (path unit):某些服务需要侦测某些特定的目录来提供队列服务,例如最 常见的打印服务,就是透过侦测打印队列目录来启动打印功能! 这时就得要 .path 的服务类型支持 了! |
.timer | 循环执行的服务 (timer unit):这个东西有点类似 anacrontab 喔!不过是由 systemd 主动提供的, 比 anacrontab 更加有弹性! |
### rsyslog 的配置文件
cat /etc/rsyslog.conf
-----------------------------
# 服务名称[.=!]信息等级 日志位置
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
------------------------------------------------
## 信息等级
0~3 emerg、alert、crit、error # 出现这些信息,服务起不来
4~7 warning、notice、info、debug # 警告信息或提示信息,服务还能正常运行
## 链接符号
. 代表记录本身及本身以上的信息
= 仅记录本身信息
! 除本身以外的信息
## 实例
vim /etc/rsyslog.conf
--------------------------
*.info /var/log/admin.log
--------------------------
systemctl restart rsyslog
### 日志跨服务器收集
1. server 端
vim /etc/rsyslog.conf # 将下面以 $ 开头的去掉注释
-----------------------
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
--------------------------------
cat /etc/rsyslog.d/192.168.222.5.conf # 创建并编写 client 端的配置文件
-----------------
:fromhost-ip, isequal, "192.168.222.5" /var/log/client/192.168.222.5.log
------------------------
# 根据上面的配置创建相应文件
# 重启 rsyslog 服务
2. client 端
vim /etc/rsyslog.conf # 向 server 端传送日志
-----------------------
*.* @@192.168.222.4
-----------------------
# 重启服务即可
### 日志文件的轮询
cat /etc/logrotate.conf
# see "man logrotate" for details
# 默认每个星期对日志文件进行一次轮询的任务
weekly
# 默认保存四个日志文件
rotate 4
# 由于日志文件被更名,因此建立一个新的来继续存储
create
# 可以让被轮询的的文件名加上日期
dateext
# 被修改的日志文件是否被压缩,默认不压缩
#compress
include /etc/logrotate.d
# 仅针对 /var/log/wtmp/ 所设置的参数,且可以覆盖上面的整体参数
/var/log/wtmp {
monthly
create 0664 root utmp # 指定新文件的权限与所属账号/组;
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
### 实例
假设已有 /var/log/admin.log 并且已经加上了 +a这个隐藏标签,而且设定底下的相关信息:
登录档轮替一个月进行一次
该登录档若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限
保存五个备份文件;
备份文件需要压缩
# This configuration is from VBird 2009/04/08
/var/log/admin.log {
monthly <==每个月进行一次
size=10M <==文件容量大於 10M 则开始处置
rotate 5 <==保留五个!
compress <==进行压缩工作!
sharedscripts
prerotate
/usr/bin/chattr -a /var/log/admin.log
endscript
sharedscripts
postrotate
/usr/bin/killall -HUP syslogd
/usr/bin/chattr +a /var/log/admin.log
endscript
}
### 解释上文:
执行脚本:可呼叫外部指令来进行额外的命令下达,这个设定需与 sharedscripts .... endscript 设定合用才行。
至于可用的环境为:
prerotate:在启动 logrotate 之前进行的指令,例如修改登录文件的属性等动作;
postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
## 检测
logrotate -v /etc/logrotate.conf # 显示 logrotate 运行的过程
logrotate -vf /etc/logrotate.conf # -f 强制 logrotate 运行
### 设置时间与日期
timedatectl [command]
list-timezones:列出可用的时区
set-timezone:设置时区
set-time:设置时间
set-ntp:设置网络校时系统
## 设置时间同步
yum install -y ntpdate
echo '#time sync by lidao at 2017-03-08' >>/var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1' >>/var/spool/cron/root
crontab -l
### 使用 rmp 安装软件
rmp -ivh 软件名 # 安装并显示安装细节
可选选项:
--nodeps:无依赖安装
--force:强行安装
--test:检测依赖性安装
--prefix src:自定义安装路径
rpm -Uvh 软件名 # 升级软件:如果没有安装软件则直接安装
rpm -Fvh 软件名 # 升级软件:没有安装软件就不会安装
### 使用 rpm 进行查询
rpm -q 软件名 # 查询该软件有没有安装
rpm -qa # 列出所有已安装软件
rpm -qc 软件名 # 列出软件的配置文件
rpm -qd 软件名 # 列出软件的说明文件
rpm -qR 软件名 # 列出软件的依赖软件的所含文件(最终列出的是文件)
rpm -qf 文件名 # 列出该文件属于那个已经安装的软件
rpm -qi # 列出软件的相关信息
### 使用 yum provides 查找软件
在我们需要下载 netstat 命令时,会出现 not find ,此时我们只需
yum provides nestat
Loading mirror speeds from cached hostfile
* base: mirrors.bfsu.edu.cn
* extras: mirrors.bfsu.edu.cn
* updates: mirrors.bfsu.edu.cn
`下面这行就会显示要安装的软件集`
## net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
源 :@base
匹配来源:
文件名 :/usr/bin/netstat