常用命令
常用命令
awk
要保持原来的排列顺序删掉重复行
awk '!visited[$0]++' your_file > deduplicated_file
bmon 开源工具,用于监控实时带宽
bmon
cat
将stdin 和另外一个文件中的数据组合在一起
echo 'Text through stdin' | cat - file.txt
删除多余的空白行(两行之间只留一个空白行)
cat -s file
输出的内容显示行号
cat -n lines.txt
curl 在网络上通过各种协议传输数据
# 下载文件
curl -O [URL]
# 在下载大文件时显示进度条
curl -# -O [URL]
cut 按列切分文本
- 截取文件的第2列和第4列
cut -f2,4 filename
- 去文件除第3列的所有列
cut -f3 --complement filename
- -d 指定定界符
cut -f2 -d";" filename
cut -f 2,6 -d "," us_presidents.csv
- 获取范围
cut 取的范围
- N- 第N个字段到结尾
- -M 第1个字段为M
- N-M N到M个字段
cut 取的单位
- -b 以字节为单位
- -c 以字符为单位
- -f 以字段为单位(使用定界符)
cut -c1-5 file //打印第一到5个字符 cut -c-2 file //打印前2个字符 $echo string | cut -c5-7 cut -c 2-10,30-35,49- dir_content.txt cut -f 2,6 -d "," us_presidents.csv -d 指定分隔符
dmidecode
列出每根内存条和其容量
dmidecode -t memory | grep -i size
计算机可以安装的最大内存
dmidecode -t memory | grep -i max
dig 用于获取有关域名的所有必要信息
MAC-➜ ~ dig bihell.com
; <<>> DiG 9.10.6 <<>> bihell.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51975
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;bihell.com. IN A
;; ANSWER SECTION:
bihell.com. 1 IN A 114.92.207.166
;; Query time: 9 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Wed Sep 21 14:53:55 CST 2022
;; MSG SIZE rcvd: 44
du 磁盘使用情况
常用参数
-a - 包括文件夹和文件在内的存储信息
--apparent-size - 打印自身大小而不是占用磁盘量
-h - 人类可读的格式
-b - 以字节为单位
-c - 总计
-k - 以块为单位
-m - 以兆字节为单位的大小
查看文件的修改时间
du --separate-dirs --all --time
为文件大小设置一个阈值
du --separate-dirs --human-readable --all --time --threshold=1G ~/Footage/
显示当前目录下每个目录的大小并排序
du -sh */ |sort -rh
查询当前目录下空间使用情况
du -sh -h是人性化显示 s是递归整个目录的大小
查看该目录下所有文件夹的排序后的大小
for i in `ls`; do du -sh $i; done | sort
或者
du -sh `ls`
df
列出已挂载的文件系统和它们的挂载点,以及已用的空间和可用的空间(兆字节为单位):
df -m
查看磁盘空间利用情况
$df -h
ethtool 允许用户配置以太网设备
# 获取接口的详细信息
sudo ethtool <InterfaceName>
fdisk
fdisk -l
hdparm
获取任何指定的 SATA 磁盘详细信息
hdparm -i /dev/sda
fio 测试磁盘的读写性能
谷歌测试文档 https://cloud.google.com/compute/docs/disks/benchmarking-pd-performance
安装
# CentOS
sudo yum install -y fio
# Ubuntu
apt-get install fio
模拟 CrystalDiskMark 测试
sudo fio --loops=5 --size=1000m --filename=/mnt/fio/fiotest.tmp --stonewall --ioengine=libaio --direct=1 \
--name=Seqread --bs=1m --rw=read \
--name=Seqwrite --bs=1m --rw=write \
--name=512Kread --bs=512k --rw=randread \
--name=512Kwrite --bs=512k --rw=randwrite \
--name=4kQDread --bs=4k --iodepth=1 --rw=randread \
--name=4kQDwrite --bs=4k --iodepth=1 --rw=randwrite
--name=4kQD32read --bs=4k --iodepth=32 --rw=randread \
--name=4kQD32write --bs=4k --iodepth=32 --rw=randwrite
sudo rm -f /mnt/fio/fiotest.tmp
firewalld 配置防火墙规则的 CLI 工具
# 为公共区域永久地打开 80 端口
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
# 要删除最近添加的规则,你必须使用 -remove 选项
sudo firewall-cmd --zone=public --remove-port=80/tcp
grep
grep match_patten file // 默认访问匹配行
常用参数
- -o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
- -c 统计文件中包含文本的次数 grep -c "text" filename
- -n 打印匹配的行号
- -i 搜索时忽略大小写
- -l 只打印文件名
- 在多级目录中对文本递归搜索(程序员搜代码的最爱):
grep "class" . -R -n
- 匹配多个模式:
grep -e "class" -e "vitural" file
- grep输出以\0作为结尾符的文件名(-z):
grep "test" file* -lZ| xargs -0 rm
- 将日志中的所有带where条件的sql查找查找出来:
cat LOG.* | tr a-z A-Z | grep "FROM " | grep "WHERE" > b
- 查找中文示例
查找到它的utf-8编码和gb2312编码分别是E4B8ADE69687和D6D0CEC4
grep:grep -rnP "\xE4\xB8\xAD\xE6\x96\x87|\xD6\xD0\xCE\xC4"
汉字编码查询:http://bm.kdd.cc/
- 找到目录中包含查找字符串的文件
grep -inr "xxx" ./
- 只返回文件名
grep -l "xxx" ./
- 查找完整单词
grep -nw apple fruit.txt
- 找到不匹配的记录
grep -nv apple fruit.txt
- 查找匹配到的行数
grep -c apple fruit.txt
- 查找内容并输出第12列.
grep -i break-in auth.log | awk {'print $12'}
- 显示位于bytes from行的第四列,其中分隔符为=
ping -c 1 example.com | grep 'bytes from' | cut -d = -f 4
--invert-match
输出所有没有匹配到的行
grep --invert-match --ignore-case gnu gpl-3.0.txt
--only-matching
选项只打印出匹配到的字符串。
$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf
- 下载每一个文件,然后以各自的远程文件名命名保存在我的硬盘上。
$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name
- 查找文件内容,只返回目录
find dev -type f -print0 | \ # find all files
xargs -0 grep 'extends MY_Output' | \ # search for your string
cut -d/ -f2 | \ # extract web folder name
sort | uniq # eliminate duplicates
host
DNS查询,寻找域名domain对应的IP::
$host domain
反向DNS查询
host IP
hostname 主要用于输出和更改主机名
# 得到系统当前的主机名
hostname
inxi
inxi
命令能够列出包括 CPU、图形、音频、网络、驱动、分区、传感器等详细信息。当论坛里的人尝试帮助其他人解决问题的时候,他们常常询问此命令的输出。这是解决问题的标准诊断程序:
# 需要额外安装
# -F 参数意味着你将得到完整的输出,x 增加细节信息,z 参数隐藏像 MAC 和 IP 等私人身份信息。
inxi -Fxz
## ifconfig
### 显示指定网卡信息
```Bash
MAC-➜ ~ ifconfig utun3
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 10.8.0.2 --> 10.8.0.2 netmask 0xffffff00
设置ip地址和网关
# ifconfig eth0 192.168.50.5 netmask 255.255.255.0
设置MTU
ifconfig eth0 mtu XXXX
ifdown
禁用网卡
# ifdown eth0
ifplugstatus 检测本地以太网设备的链接状态
# 显示接口状态
ifplugstatus
iftop 监视与带宽有关的统计信息
sudo iftop
# 指定网口
sudo iftop -i eth0
ifup
启用网卡
ifup eth0
iostat
# Debian 安装
apt-get install sysstat
查看磁盘读写和占用
iostat -m -x 1
只显示CPU统计
Scale-➜ ~ iostat -c
Linux 5.10.70+truenas (truenas.local) 12/22/21 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.24 0.52 6.35 4.09 0.00 85.80
只显示磁盘统计
Scale-➜ ~ iostat -d
Linux 5.10.70+truenas (truenas.local) 12/22/21 _x86_64_ (4 CPU)
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 34.96 14.60 347.95 0.00 18604562 443304188 0
sdb 43.25 12.69 438.13 0.00 16173812 558200656 0
显示指定硬盘的统计信息
Scale-➜ ~ iostat -p sda
Linux 5.10.70+truenas (truenas.local) 12/22/21 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.24 0.52 6.35 4.09 0.00 85.80
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 34.96 14.60 347.94 0.00 18604918 443305448 0
sda1 0.00 0.00 0.00 0.00 2508 0 0
sda2 0.00 0.00 0.00 0.00 4556 0 0
sda3 34.91 14.60 347.94 0.00 18596114 443305448 0
只显示LVM统计信息
iostat -N
显示兆字节单位
iostat -p nvme0n1 -m 2 -d
iotop 查看磁盘IO读写
查看有io操作的程序
iotop -o
iptraf-ng 观察网络流量的工具
kill 终止进程
杀死指定PID的进程 (PID为Process ID)
$kill PID
杀死相关进程
kill -9 3434
杀死job工作 (job为job number)
$kill %job
杀死某用户的所有进城
# u后面跟用户id
pkill -u 512
lshw cpu信息
# 只查看 CPU 品牌和型号:
lshw -C cpu | grep -i product
# 仅查看 CPU 的速度(兆赫兹):
lscpu | grep -i mhz
# BogoMips 额定功率:
lscpu | grep -i bogo
lscpu cpu信息
lscpu
lftp
lftp同步文件夹(类似rsync工具)
lftp -u user:pass host
lftp user@host:~> mirror -n
lshw 显示整体信息
输出非常详细,但也有点难以阅读:
lshw -short
lsblk 列出所有磁盘及其分区和大小
lsblk
ls
按时间排序
ll --sort=time
lsblk 列出所有可用块设备的信息
[root@docker ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 32G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 15G 0 part
├─centos-root 253:0 0 13.4G 0 lvm /
└─centos-swap 253:1 0 1.6G 0 lvm
sr0 11:0 1 973M 0 rom
# 查看详细的设备挂载情况,显示文件系统信息
OMV-➜ ~ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda ext4 1.0 af3ba6f2-e72e-4b07-b963-ab1b53ec77ad 1.3T 86% /srv/dev-disk-by-uuid-af3ba6f2-e72e-4b07-b963-ab1b53ec77ad
sdb
├─sdb1 ext4 1.0 f6714985-83a1-4416-9773-5beeaa96d7a2 80.2G 12% /
├─sdb2
└─sdb5 swap 1 e2c979e4-a9d0-4096-9bd6-fefccc875af0 [SWAP]
sdc
└─sdc1 ext4 1.0 ea83417c-624a-4606-abef-ca66118d1c12 3.6T 0% /srv/dev-disk-by-uuid-ea83417c-624a-4606-abef-ca66118d1c12
sdd ext4 1.0 febb133b-8472-479e-b370-d4cb056c4572 1.9T 42% /srv/dev-disk-by-uuid-febb133b-8472-479e-b370-d4cb056c4572
sde ext4 1.0 fb5d1769-b4e8-4437-88e7-c9d18135010b 10.9G 95% /srv/dev-disk-by-uuid-fb5d1769-b4e8-4437-88e7-c9d18135010b
sdf ext4 1.0 b5ef8429-1571-4c98-836f-19d84c3f7f36 69.5G 92% /srv/dev-disk-by-uuid-b5ef8429-1571-4c98-836f-19d84c3f7f36
sdg ext4 1.0 b900b127-cee6-42f8-8f0c-0e18ca4c584d 177.5G 88% /srv/dev-disk-by-uuid-b900b127-cee6-42f8-8f0c-0e18ca4c584d
sdh ext4 1.0 e8cfef67-b801-4c0a-a912-e45d3ec6e3fa 11.8G 94% /srv/dev-disk-by-uuid-e8cfef67-b801-4c0a-a912-e45d3ec6e3fa
sdi ext4 1.0 31e039be-fac3-4696-b46b-c40099c9958c 274.3M 95% /srv/dev-disk-by-uuid-31e039be-fac3-4696-b46b-c40099c9958c
sdj ext4 1.0 f3c337e5-aa18-4330-85ed-f0830e4b3a9c 12.7G 94% /srv/dev-disk-by-uuid-f3c337e5-aa18-4330-85ed-f0830e4b3a9c
sdk ext4 1.0 056773fe-9581-4237-abd2-4842ee5abbf9 6.4T 51% /srv/dev-disk-by-uuid-056773fe-9581-4237-abd2-4842ee5abbf9
sdl ext4 1.0 23927213-8873-4223-b4e2-d3bae0bff633 34G 95% /srv/dev-disk-by-uuid-23927213-8873-4223-b4e2-d3bae0bff633
sdm ext4 1.0 77958aaf-7be4-4d89-b41c-da3ef6788ed6 2.3T 81% /srv/dev-disk-by-uuid-77958aaf-7be4-4d89-b41c-da3ef6788ed6
sdn
└─sdn1 ext4 1.0 3b527449-5321-46c8-a855-e6530b3e1e38 10.3T 37% /srv/dev-disk-by-uuid-3b527449-5321-46c8-a855-e6530b3e1e38
nvme1n1
└─nvme1n1p1 ext4 1.0 381feff2-db85-4c4f-b0ac-e6c1907e465a 393.6G 95% /srv/dev-disk-by-uuid-381feff2-db85-4c4f-b0ac-e6c1907e465a
nvme0n1
└─nvme0n1p1 ext4 1.0 7877816f-1190-49f4-bd64-cd3e24ab9971 2.1T 41% /srv/dev-disk-by-uuid-7877816f-1190-49f4-bd64-cd3e24ab9971
lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等; 在查询网络端口时,经常会用到这个工具。
指定端口查看运行的进程
#分为两步
#第一步,查询使用该端口的进程的PID;
$lsof -i:7902
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
WSL 30294 tuapp 4u IPv4 447684086 TCP 10.6.50.37:tnos-dp (LISTEN)
#查到30294
#使用ps工具查询进程详情:
$ps -fe | grep 30294
tdev5 30294 26160 0 Sep10 ? 01:10:50 tdesl -k 43476
root 22781 22698 0 00:54 pts/20 00:00:00 grep 11554
查看某用户打开的文件
lsof -u tecmint
查看ipv4、ipv4打开的文件
# lsof -i 4
# lsof -i 6
查询tcp端口1-1024运行的进程
lsof -i TCP:1-1024
使用'^'排除用户
lsof -i -u^root
关掉某用户的所有进程
kill -9 `lsof -t -u tecmint`
查看端口占用的进程状态:
lsof -i:3306
查看用户username的进程所打开的文件
$lsof -u username
查询init进程当前打开的文件
$lsof -c init
查询指定的进程ID(23295)打开的文件:
$lsof -p 23295
查询指定目录下被进程开启的文件(使用+D 递归目录):
$lsof +d mydir1/
查看占用端口的进程并Kill
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
lspci
显示显卡有多少内存
# Step1 列出显卡设备信息:
lspci | grep -i vga
# 视频控制器的设备号输出信息通常如下: 00:02.0 VGA compatible controller: Intel Corporation 82Q35 Express Integrated Graphics Controller (rev 02)
# Step2 加上视频设备号重新运行 lspci 命令:
lspci -v -s 00:02.0
Linux查看PCIe设备带宽
- 找到设备名称
Scale-➜ ~ lspci | grep SSD
1b:00.0 Non-Volatile memory controller: Intel Corporation NVMe Datacenter SSD [3DNAND, Beta Rock Controller]
- 查看vendor id 和 device id
Scale-➜ ~ lspci -n | grep -i 1b:00.0
1b:00.0 0108: 8086:0a54
- 查看带宽
Scale-➜ ~ lspci -n -d 8086:0a54 -vvv | grep -i width
LnkCap: Port #0, Speed 5GT/s, Width x32, ASPM L0s, Exit Latency L0s <64ns
LnkSta: Speed 5GT/s (ok), Width x32 (ok)
LnkCap 支持的速度是5GT/s LnkSta设备的速度是5GT/s
mkdir 创建目录
mkdir -p new_folder/{folder_1,folder_2,folder_3,folder_4,folder_5}
mount
挂载smb共享
mount -t cifs //192.168.50.127/SMB /mnt/smb_share/ -o username=zhangsan,password=AAbb1234.
挂载NFS
apt-get install nfs-common
mkdir /mnt/dataset1
mount -t nfs 192.168.50.127:/mnt/Pool1/dataset1 /mnt/dataset1
mount
mtr 用于网络诊断,并提供网络响应和连接的实时情况。
mtr [URL/IP]
# 如果你想让 mtr 同时显示主机名和 IP 地址,你可以把它和 -b 选项配对
mtr -b [URL]
netstat 查询网络服务和端口
netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
列出所有端口 (包括监听和未监听的)
netstat -a
列出所有 tcp 端口
netstat -at
列出所有tcp 监听的端口
netstat -lt
列出所有 udp 端口
netstat -au
列出所有udp监听端口、
netstat -lu
列出所有有监听的服务状态
netstat -l
列出所有unix监听的服务状态
netstat -lx
使用netstat工具查询端口
$netstat -antp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 25501/redis-server
$ps 25501
PID TTY STAT TIME COMMAND
25501 ? Ssl 28:21 ./redis-server ./redis.conf
显示所有协议的统计信息
netstat -s
显示TCP协议统计
netstat -st
显示UDP协议统计
netstat -su
显示服务名称和PID
netstat -tp
混合模式,5秒更新一次
netstat -ac 5 | grep tcp
显示网络接口传输
netstat -i
显示网络接口表
有点像 ifconfig
netstat -ie
nmap 主要用于审计网络安全
nmap bihell.com
nmcli 用于网络连接的故障排除工具
# 监控设备的连接状态
nmcli dev status
# 当不使用任何选项时,它将带来你系统中所有现有设备的信息
nmcli
nvme
NVMe 是指非易失性内存规范Non-Volatile Memory Express,它规范了软件和存储通过 PCIe 和其他协议(包括 TCP)进行通信的方式。它是由非营利组织领导的 开放规范,并定义了几种形式的固态存储。
安装 nvme-cli
# ubuntu
apt install nvme-cli
列出所有的 NVMe 驱动器
Scale-➜ ~ nvme list
Node SN Model Namespace Usage Format FW Rev
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1 50026B76845B9972 KINGSTON SA2000M81000G 1 804.44 GB / 1.00 TB 512 B + 0 B S5Z42105
/dev/nvme1n1 PHLF727200TF4P0MGN INTEL SSDPE7KX040T7 1 4.00 TB / 4.00 TB 512 B + 0 B QDV101D1
通过id-ctrl
你可以得到更多关于该硬盘和它所支持的特性的信息:
Scale-➜ ~ nvme id-ctrl /dev/nvme0n1
NVME Identify Controller:
vid : 0x2646
ssvid : 0x2646
sn : 50026B76845B9972
mn : KINGSTON SA2000M81000G
fr : S5Z42105
rab : 6
ieee : 0026b7
cmic : 0
mdts : 5
cntlid : 0x1
...
驱动器健康
Scale-➜ ~ nvme smart-log /dev/nvme0n1
Smart Log for NVME device:nvme0n1 namespace-id:ffffffff
critical_warning : 0
temperature : 43 C
available_spare : 100%
available_spare_threshold : 10%
percentage_used : 0%
endurance group critical warning summary: 0
data_units_read : 419793
data_units_written : 11932769
host_read_commands : 7391700
host_write_commands : 596892449
controller_busy_time : 905
power_cycles : 39
power_on_hours : 5378
unsafe_shutdowns : 19
media_errors : 0
num_err_log_entries : 0
Warning Temperature Time : 0
Critical Composite Temperature Time : 0
Thermal Management T1 Trans Count : 0
Thermal Management T2 Trans Count : 0
Thermal Management T1 Total Time : 0
Thermal Management T2 Total Time : 0
格式化一个 NVMe 驱动器
nvme format /dev/nvme0nX
安全地擦除 NVMe 驱动器
nvme sanitize /dev/nvme0nX
paste 按列拼接文本
- 将两个文本按列拼接到一起;
cat file1
1
2
cat file2
colin
book
paste file1 file2
1 colin
2 book
- 默认的定界符是制表符,可以用-d指明定界符:
paste file1 file2 -d ","
1,colin
2,book
wc 统计行和字符的工具
$wc -l file // 统计行数
$wc -w file // 统计单词数
$wc -c file // 统计字符数
ps 查看当前系统进程状态
- 选项说明
命令 | 描述 |
---|---|
a | 列出带有终端的所有用户的进程 |
x | 列出当前用户的所有进程,包括没有终端的进程 |
u | 面向用户友好的显示风格 |
-e | 列出所有进程 |
-u | 列出某个用户关联的所有进程 |
-f | 显示完整格式的进程列表 |
- 功能说明
ps aux 显示信息说明
USER:该进程是由哪个用户产生的
PID:进程的 ID 号
%CPU:该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源;
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;
VSZ:该进程占用虚拟内存的大小,单位 KB;
RSS:该进程占用实际物理内存的大小,单位 KB;
TTY:该进程是在哪个终端中运行的。对于 CentOS 来说,tty1 是图形化终端, tty2-tty6 是本地的字符界面终端。pts/0-255 代表虚拟终端。
STAT:进程状态。常见的状态有:R:运行状态、S:睡眠状态、T:暂停状态、Z:僵尸状态、s:包含子进程、l:多线程、+:前台显示
START:该进程的启动时间
TIME:该进程占用 CPU 的运算时间,注意不是系统时间
COMMAND:产生此进程的命令名
ps -ef 显示信息说明
UID:用户 ID
PID:进程 ID
PPID:父进程 ID
C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算, 执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
STIME:进程启动的时间
TTY:完整的终端名称
TIME:CPU 时间
CMD:启动进程所用的命令和参数
- 实际栗子
# 查询归属于用户colin115的进程
$ps -ef | grep colin115
$ps -lu colin115
# 以完整的格式显示所有的进程
$ps -ajx
# 查看系统中所有进程
# 如果想查看进程的 CPU 占用率和内存占用率,可以使用 aux;
ps aux | grep xxx
# 可以查看子父进程之间的关系
# 如果想查看进程的父进程 ID 可以使用 ef;
ps -ef | grep xxx
# 将用户colin115下的所有进程名以av_开头的进程终止
ps -u colin115 | awk '/av_/ {print "kill -9 " $1}' | sh
# 将用户colin115下所有进程名中包含HOST的进程终止
ps -fe| grep colin115|grep HOST |awk '{print $2}' | xargs kill -9;
route
查看路由状态
route -n
rsync
Rsync是一个非常灵活的启用网络的同步工具。它使用一种算法,通过仅移动变更了的部分文件来最大程度地减少复制的数据量。 由于它在Linux和类Unix系统上无处不在,并且作为系统脚本工具而广受欢迎,因此默认情况下,它已包含在大多数Linux发行版中。它的特性如下:
- 可以保持文件原来的权限、时间、所有者、组信息、软硬链接等等
- 可以从远程或者本地镜像保存整个目录树和文件系统
- 无须特殊权限 super-user 即可安装使用
- 快速:要比 scp (Secure Copy) 要快;第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,可以使用更少的带宽
- 安全:可以使用 scp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接
- 支持匿名传输,以方便进行网站镜像
一、参数含义
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, 归档模式, 归档模式总是递归拷贝,而且保留符号链接、权限、属主、属组时间戳 等于 -rlptgoD
-r, 递归拷贝数据,但是传输数据时不保留时间戳和权限
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用 --suffix 选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename) 存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于 DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向 SRC 路径目录树以外的链结
--safe-links 忽略指向 SRC 路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省 DST 的空间
-n, --dry-run 显示那些文件将被传输,并不会实际传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是 700 字节
-e, --rsh=COMMAND 指定使用 rsh、ssh 方式进行数据同步
--rsync-path=PATH 指定远程服务器上的 rsync 命令所在路径信息
-C, --cvs-exclude 使用和 CVS 一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于 DST 的文件,而不备份那些新创建的文件
--delete 删除那些 DST 中 SRC 没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现 IO 错误也进行删除
--max-delete=NUM 最多删除 NUM 个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组 ID 匹配为用户名和组名
--timeout=TIME IP 超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为 0
-T --temp-dir=DIR 在 DIR 中创建临时文件
--compare-dest=DIR 同样比较 DIR 中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除 FILE 中指定模式的文件
--include-from=FILE 不排除 FILE 指定模式匹配的文件
--version 打印版本信息
--max-size 限定传输文件大小的上限
--bwlimit 限制传输带宽
二、实例准备
我们使用以下命令创建两个测试目录和一些测试文件:
cd ~
mkdir dir1
mkdir dir2
touch dir1/file{1..100}
现在内容如下
ls dir1
# Output
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
然后我们还有个空目录 dir2
举个小🌰,将dir1
目录同步到dir2
目录中:
rsync -r dir1/ dir2
-r
表示递归查询,你可能也想加上-a
替代-r
这个参数。
rsync -a dir1/ dir2
-a
是一个组合参数,归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
注意
注意dir1后面的反斜杠/
,这表是传输dir1目录下面的文件,如果不带反斜杠的话会把dir1一起穿过去。即下面这样:
~/dir2/dir1/[files]
三、实例
3.1 远程同步文件
# 将本地文件传到远程服务器(push)
rsync -a ~/dir1 username@remote_host:destination_directory
# 将远程文件传输到本地(pull)
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
3.2 更改端口
rsync 有两种常用的认证方式,一种为 rsync-daemon 方式,另外一种则是 ssh。ssh 一般为首选,但当远端服务器的 ssh 默认端口被修改后,rsync 时找不到一个合适的方法来输入对方 ssh 服务端口号。
sync 中的命令 参数 -e, --rsh=COMMAND
指定使用 rsh、ssh 方式进行数据同步。此时我们的命令要这样写:
rsync -avz -e "ssh -p $port" /local/path/ user@remoteip:/path/to/files/
3.3 显示备份进度
可以使用 --progress
选项来显示进度
rsync -avzhe ssh --progress /home/files/ root@remoteip:/path/to/files/
3.4 限制备份文件最大值
设置 Max size 备份文件
rsync -avzhe ssh --max-size='2000k' /var/lib/rpm/ root@remoteip:/root/tmprpm
3.5 备份结束后自动删除本地文件
rsync --remove-source-files -zvh backup.tar /tmp/backups/
3.6 设置备份带宽
rsync --bwlimit=100 -avzhe ssh /var/lib/rpm/ root@remoteip:/root/tmprpm/
3.7 本地同步某个文件
[root@iZ7eetumtw8c9jZ jenkins]# rsync -zvrh remoting.jar /root/work/
sending incremental file list
created directory /root/work
remoting.jar
sent 796.37K bytes received 68 bytes 1.59M bytes/sec
total size is 872.44K speedup is 1.10
四、分发脚本
sar
查看CPU使用率
$sar -u
eg:
$sar -u 1 2
[/home/weber#]sar -u 1 2
Linux 2.6.35-22-generic-pae (MyVPS) 06/28/2014 _i686_ (1 CPU)
09:03:59 AM CPU %user %nice %system %iowait %steal %idle
09:04:00 AM all 0.00 0.00 0.50 0.00 0.00 99.50
09:04:01 AM all 0.00 0.00 0.00 0.00 0.00 100.00
后面的两个参数表示监控的频率,比如例子中的1和2,表示每秒采样一次,总共采样2次;
查看CPU平均负载
$sar -q 1 2
sar指定-q后,就能查看运行队列中的进程数、系统上的进程大小、平均负载等;
sar指定-r之后,可查看内存使用状况;
$sar -r 1 2
09:08:48 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact
09:08:49 AM 17888 359784 95.26 37796 73272 507004 65.42 137400 150764
09:08:50 AM 17888 359784 95.26 37796 73272 507004 65.42 137400 150764
Average: 17888 359784 95.26 37796 73272 507004 65.42 137400 150764
scp
SCP(安全复制Secure Copy)是 Linux 和 Unix 之类的系统中的命令行工具,用于通过网络安全地跨系统传输文件和目录。当我们使用 scp
命令将文件和目录从本地系统复制到远程系统时,则在后端与远程系统建立了 ssh 连接。换句话说,我们可以说 scp
在后端使用了相同的 SSH 安全机制,它需要密码或密钥进行身份验证。
scp 命令语法
# scp <选项> <文件或目录> 用户名@目标主机:/<文件夹>
# scp <选项> 用户名@目标主机:/文件 <本地文件夹>
scp
命令的第一个语法演示了如何将文件或目录从本地系统复制到特定文件夹下的目标主机。
scp
命令的第二种语法演示了如何将目标主机中的文件复制到本地系统中。
下面列出了 scp 命令中使用最广泛的一些选项:
- -C 启用压缩
- -i 指定识别文件或私钥
- -l 复制时限制带宽
- -P 指定目标主机的 ssh 端口号
- -p 复制时保留文件的权限、模式和访问时间
- -q 禁止 SSH 警告消息
- -r 递归复制文件和目录
- -v 详细输出
实例
- 使用 scp 将文件从本地系统复制到远程系统
假设我们要使用 scp
命令将 jdk 的 rpm 软件包从本地 Linux 系统复制到远程系统(172.20.10.8),请使用以下命令,
[root@linuxtechi ~]$ scp jdk-linux-x64_bin.rpm root@linuxtechi:/opt
root@linuxtechi's password:
jdk-linux-x64_bin.rpm 100% 10MB 27.1MB/s 00:00
[root@linuxtechi ~]$
上面的命令会将 jdk 的 rpm 软件包文件复制到 /opt
文件夹下的远程系统。
- 使用 scp 将文件从远程系统复制到本地系统
假设我们想将文件从远程系统复制到本地系统下的 /tmp
文件夹,执行以下 scp 命令,
[root@linuxtechi ~]$ scp root@linuxtechi:/root/Technical-Doc-RHS.odt /tmp
root@linuxtechi's password:
Technical-Doc-RHS.odt 100% 1109KB 31.8MB/s 00:00
[root@linuxtechi ~]$ ls -l /tmp/Technical-Doc-RHS.odt
-rwx------. 1 pkumar pkumar 1135521 Oct 19 11:12 /tmp/Technical-Doc-RHS.odt
[root@linuxtechi ~]$
- 使用 scp 传输文件时的详细输出(-v)
在 scp
命令中,我们可以使用 -v
选项启用详细输出。使用详细输出,我们可以轻松地发现后台确切发生了什么。这对于调试连接、认证和配置等问题非常有用。
root@linuxtechi ~]$ scp -v jdk-linux-x64_bin.rpm root@linuxtechi:/opt
Executing: program /usr/bin/ssh host 172.20.10.8, user root, command scp -v -t /opt
OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS 11 Sep 2018
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf
debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config
debug1: /etc/ssh/ssh_config.d/05-redhat.conf line 8: Applying options for *
debug1: Connecting to 172.20.10.8 [172.20.10.8] port 22.
debug1: Connection established.
…………
debug1: Next authentication method: password
root@linuxtechi's password:
- 将多个文件传输到远程系统
可以使用 scp
命令一次性将多个文件复制/传输到远程系统,在 scp
命令中指定多个文件,并用空格隔开,示例如下所示
[root@linuxtechi ~]$ scp install.txt index.html jdk-linux-x64_bin.rpm root@linuxtechi:/mnt
root@linuxtechi's password:
install.txt 100% 0 0.0KB/s 00:00
index.html 100% 85KB 7.2MB/s 00:00
jdk-linux-x64_bin.rpm 100% 10MB 25.3MB/s 00:00
[root@linuxtechi ~]$
- 在两个远程主机之间传输文件
使用 scp
命令,我们可以在两个远程主机之间复制文件和目录,假设我们有一个可以连接到两个远程 Linux 系统的本地 Linux 系统,因此从我的本地 Linux 系统中,我可以使用 scp
命令在这两个系统之间复制文件,
命令语法:
# scp 用户名@远程主机1:/<要传输的文件> 用户名@远程主机2:/<文件夹>
示例如下:
# scp root@linuxtechi:~/backup-Oct.zip root@linuxtechi:/tmp
# ssh root@linuxtechi "ls -l /tmp/backup-Oct.zip"
-rwx------. 1 root root 747438080 Oct 19 12:02 /tmp/backup-Oct.zip
- 递归复制文件和目录(-r)
在 scp
命令中使用 -r
选项将整个目录从一个系统递归地复制到另一个系统,示例如下所示:
[root@linuxtechi ~]$ scp -r Downloads root@linuxtechi:/opt
使用以下命令验证 Downloads
文件夹是否已复制到远程系统,
[root@linuxtechi ~]$ ssh root@linuxtechi "ls -ld /opt/Downloads"
drwxr-xr-x. 2 root root 75 Oct 19 12:10 /opt/Downloads
[root@linuxtechi ~]$
- 通过启用压缩来提高传输速度(-C)
在 scp
命令中,我们可以通过使用 -C
选项启用压缩来提高传输速度,它将自动在源主机上启用压缩并在目标主机上解压缩。
root@linuxtechi ~]$ scp -r -C Downloads root@linuxtechi:/mnt
在以上示例中,我们正在启用压缩的情况下传输下载目录。
- 复制时限制带宽(-l)
在 scp
命令中使用 -l
选项设置复制时对带宽使用的限制。带宽以 Kbit/s 为单位指定,示例如下所示:
[root@linuxtechi ~]$ scp -l 500 jdk-linux-x64_bin.rpm root@linuxtechi:/var
- 在 scp 时指定其他 ssh 端口(-P)
在某些情况下,目标主机上的 ssh 端口会更改,因此在使用 scp
命令时,我们可以使用 -P
选项指定 ssh 端口号。
[root@linuxtechi ~]$ scp -P 2022 jdk-linux-x64_bin.rpm root@linuxtechi:/var
在上面的示例中,远程主机的 ssh 端口为 “2022”。
- 复制时保留文件的权限、模式和访问时间(-p)
从源复制到目标时,在 scp
命令中使用 -p
选项保留权限、访问时间和模式。
[root@linuxtechi ~]$ scp -p jdk-linux-x64_bin.rpm root@linuxtechi:/var/tmp
jdk-linux-x64_bin.rpm 100% 10MB 13.5MB/s 00:00
[root@linuxtechi ~]$
- 在 scp 中以安静模式传输文件(-q)
在 scp
命令中使用 -q
选项可禁止显示 ssh 的传输进度、警告和诊断消息。示例如下所示:
[root@linuxtechi ~]$ scp -q -r Downloads root@linuxtechi:/var/tmp
[root@linuxtechi ~]$
- 在传输时使用 scp 中的识别文件(-i)
在大多数 Linux 环境中,首选基于密钥的身份验证。在 scp
命令中,我们使用 -i
选项指定识别文件(私钥文件),示例如下所示:
[root@linuxtechi ~]$ scp -i my_key.pem -r Downloads root@linuxtechi:/root
在上面的示例中,my_key.pem
是识别文件或私钥文件。
- 在 scp 中使用其他 ssh_config 文件(-F)
在某些情况下,你使用不同的网络连接到 Linux 系统,可能某些网络位于代理服务器后面,因此在这种情况下,我们必须具有不同的 ssh_config
文件。通过 -F
选项在 scp
命令中指定了不同的 ssh_config
文件,示例如下所示:
[root@linuxtechi ~]$ scp -F /home/pkumar/new_ssh_config -r Downloads root@linuxtechi:/root
root@linuxtechi's password:
jdk-linux-x64_bin.rpm 100% 10MB 16.6MB/s 00:00
backup-Oct.zip 100% 713MB 41.9MB/s 00:17
index.html 100% 85KB 6.6MB/s 00:00
[root@linuxtechi ~]$
- 在 scp 命令中使用其他加密方式(-c)
默认情况下,scp
使用 AES-128 加密方式来加密文件。如果你想在 scp
命令中使用其他加密方式,请使用 -c
选项,后接加密方式名称。
假设我们要在用 scp
命令传输文件时使用 3des-cbc 加密方式,请运行以下 scp
命令:
[root@linuxtechi ~]# scp -c 3des-cbc -r Downloads root@linuxtechi:/root
使用以下命令列出 ssh
和 scp
支持的加密方式:
[root@linuxtechi ~]# ssh -Q cipher localhost | paste -d , -s -
3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,root@linuxtechi,aes128-ctr,aes192-ctr,aes256-ctr,root@linuxtechi,root@linuxtechi,root@linuxtechi
[root@linuxtechi ~]#
via: https://linux.cn/article-11669-1.html
sed 文本替换利器
常用
- 替换每一行的第一处匹配的text
sed 's/text/replace_text/' file
- 全局替换
sed 's/text/replace_text/g' file
sed 's/^/ /g' fruit.txt 替换成tab制表符, 终端下需要按ctrl+v
- 默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:
sed -i 's/text/repalce_text/g' file
- 移除空白行
sed '/^$/d' file 最后的/d告诉sed不执行替换操作,而是直接删除匹配到的空行
- 已匹配的字符串通过标记&来引用.
echo this is en example | sed 's/\w\+/[&]/g'
$>[this] [is] [en] [example]
- 子串匹配标记 第一个匹配的括号内容使用标记
\1
来引用
sed 's/hello\([0-9]\)/\1/'
- 双引号求值
sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:
sed 's/$var/HLLOE/'
当使用双引号时,我们可以在sed样式和替换字符串中指定变量;
p=patten
r=replaced
echo "line con a patten" | sed "s/$p/$r/g"
$>line con a replaced
- 字符串插入字符:将文本中每行内容(ABCDEF) 转换为 ABC/DEF:
sed 's/^.\{3\}/&\//g' file
- 替换管道或命令行输入的数据
nl dukeofyork.txt | sed 's/the/The/'
- 输入并输出文件
sed 's/the/THE/' < dukefyork.txt > output.txt
- g标记可以使sed替换弟N次出现的匹配
$ echo thisthisthisthis | sed 's/this/THIS/2g'
thisTHISTHISTHIS
$ echo thisthisthisthis | sed 's/this/THIS/3g'
thisthisTHISTHIS
$ echo thisthisthisthis | sed 's/this/THIS/4g' 8 thisthisthisTHIS
- 替换的文字中有单引号的需要用双引号限定两边
sed "s/were/weren 't/" dukeofyork.txt
# 有时候需要反义符
sed "s/were/\"\$werent\'t\"/" dukeofyork.txt
- 去除tag标记
sed -E 's/<[^<>]+>//g' homepage.html
- 使用指定的数字替换文件中所有3位数的数字
sed -i 's/\b[0-9]\{3\}\b/NUMBER/g' sed_data.txt
- 单词互换
echo "Dan Stevens" | sed -E 's/([A-Za-z]+) ([A-Za-z]+)/\2, \1/'
- 替换的同时备份文件
sed -i.bak 's/abc/def/' file 这时的sed不仅替换文件内容,还会创建一个名为file.bak的文件
- 获取指定行的数据
sed '4297196!d' /temp/tmp_sqp_export_2711.txt
- 修改默认分隔符
# sed命令会将s之后的字符串视为命令分隔符。这允许我们修改默认分隔符
sed 's:text:replace:g'
sed 's|text|replace|g'
- 将array.c中的main函数输出到 main.c
sed -n '/^[a-z]* main *(/,/^}/w main.c' array.c
正则表达
.
匹配任意一个字符
/a.c/ 匹配"abc","axc"但不匹配"ac","axxc"
^
和$
匹配行首和行尾
/^abc/ 匹配 ”abcd" 不匹配“dadc" /abc$/ 不匹配"abcd" 匹配 ”dabc“
[]
匹配集合中的任何字符
/a[xyz]c/ 匹配 ”axc" 但是不匹配 "axyzc" 因为只是匹配一个字符 /a[a-z]c/ 匹配"abc" /a[a-zA-Z]c/ 匹配“abc" 或 ”abc" /a[^a-z]c/ 不匹配 “abc"
sed 's/the[^]/YOU/g' xxx.txt
*
匹配0个或多个重复
/ab*c/ 匹配"abc","abbbbc","ac" 但是不匹配"axc"
()
重复多个
/ab*c/ 匹配 "abbbbbc" /(ab)*c/ 匹配 "ababababac"
Greediness
/<.*>/ 匹配 `<i>italic text</i>` 匹配html标记
sed -E 's/(apple|pear|plum|peach)/\1 tree/' fruit.txt
sed -E 's/(...)time/\1light/' 或 sed 's/\(...\)time/\1light/'
sed 's/\(they)\) \(were\)/\2 \2/g' xxx.txt
sed 's/weeeere \([a-z]*\)/\13d/g' xxx.txt
参数
使用-i选项会使得sed用修改后的数据替换原始文件
sed -i 's/text/replace/' file
-n + p组合打印替换后的行
sed -n 's/the/THE/pg' dukeofyork
-e执行多个替换参数
sed -e 's/up/UP/' -e 's/down/DOWN/' dukeofyou.txt
-f从文件执行替换条件
cat > script
# change ten thousand men to one woman
s/ten thousand/one/
s/men/woman/g
s/were/was/g
sed -f script xxxx.txt
命令
- 使用P命令打印行
打印第三行
sed -n 3p dukefyork.txt
打印最后一行
sed -n '$p' xxx.txt
打印1~3行
sed -n '1,3 p' dukefo.txt
当grep用
sed -n '/[Tt]he[my]/p' xxx.txt
,
匹配出第一个匹配词到最后一个匹配词的所有行
nl xxx.txt | sed -n '/marched/,/when/p'
sed -n '/^}/,/^{/p' array
nl xxx.txt | sed -n '2,/down/p' #第二行到第一个down行
nl xxx.txt | sed -n '2,5!p' 显示2~5行以外的行
使用
D
参数删除行删除第四行
nl dukeofyork.txt | sed '4d' nl dukeofyork.txt | sed '/up/d' nl dukeofyork.txt | sed '/thousand/,/down/d'
使用
R
和W
读取写入文件读取文件将down替换为haha.txt中的文字
sed '/down/r haha.txt' dukeofyork.txt
将 dukeofyork.txt的1~3行写入文件 top.txt
sed '1,3w top.txt' dukeofyork.txt
将替换后的UP写入到文件up
sed 's/up?UP/w up' dukeofyork.txt sed 's/up/UP/wg up' dukeofyork.txt sed -e '/down/w down' -e 's/up/UP/' dukeofyourk.txt sed -e 's/up/UP/w out' -e 's/down/DOWN/w out' dukeofyork.txt
使用'Y'命令进行转换类似tr
sed 'y/abcdef/ABCDEF/' dukeofyork.txt sed 'y/aceilost/4(3!10$+)' dukeofyork.txt
sftp 文件传输
ftp/sftp文件传输::
$sftp ID@host
登录服务器host,ID为用户名。sftp登录后,可以使用下面的命令进一步操作:
- get filename # 下载文件
- put filename # 上传文件
- ls # 列出host上当前路径的所有文件
- cd # 在host上更改当前路径
- lls # 列出本地主机上当前路径的所有文件
- lcd # 在本地主机更改当前路径
smartctl
常用命令
# 显示磁盘所有信息
smartctl -a /dev/sdc
# 是否通过自检
smartctl -H /dev/sdc
SMART的值
临界值(Threshold)
临界值是硬盘厂商指定的表示某一项目可靠性的门限值,也称阈值,它通过特定公式计算而得。如果某个参数的当前值接近了临界值,就意味着硬盘将变得不可靠,可能导致数据丢失或者硬盘故障。由于临界值是硬盘厂商根据自己产品特性而确定的,因此用厂商提供的专用检测软件往往会跟Windows下检测软件的检测结果有较大出入。 以参数Raw Read Error Rate(底层数据读取错误率)为例:某型硬盘对该参数的计算公式为“10×log10(主机和硬盘之间所传输数据的扇区数)×512×8/重读的扇区数”。其中“512×8”是把扇区数转化为所传输的数据位(bits),这个值只在所传输的数据位处于1010~1012范围时才作计算,而当Windows系统启动后,主机和硬盘之间所传输的数据扇区大于或等于1012时,此值将重新复位,所以有些值在不同的操作环境、不同检测程序下时会有较大的波动。
当前值(Normalized value)
当前值是各ID项在硬盘运行时根据实测数据通过公式计算的结果,计算公式由硬盘厂家自定。 硬盘出厂时各ID项目都有一个预设的最大正常值,也即出厂值,这个预设的依据及计算方法为硬盘厂家保密,不同型号的硬盘都不同,最大正常值通常为100或200或253,新硬盘刚开始使用时显示的当前值可以认为是预设的最大正常值(有些ID项如温度等除外)。随着使用损耗或出现错误,当前值会根据实测数据而不断刷新并逐渐减小。因此,当前值接近临界值就意味着硬盘寿命的减少,发生故障的可能性增大,所以当前值也是判定硬盘健康状态或推测寿命的依据之一。
最差值(Worst)
最差值是硬盘运行时各ID项曾出现过的最大的非正常值。 最差值是对硬盘运行中某项数据变劣的峰值统计,该数值也会不断刷新。通常,最差值与当前值是相等的,如果最差值出现较大的波动(小于当前值),表明硬盘曾出现错误或曾经历过恶劣的工作环境(如温度)。
数据值(Data或Raw value)
数据值是硬盘运行时各项参数的实测值,大部分SMART工具以十进制显示数据。 数据值代表的意义随参数而定,大致可以分为三类:
- 数据值并不直接反映硬盘状态,必须经过硬盘内置的计算公式换算成当前值才能得出结果;
- 数据值是直接累计的,如Start/Stop Count(启动/停止计数)的数据是50,即表示该硬盘从出厂到现在累计启停了50次;
- 有些参数的数据是即时数,如Temperature(温度)的数据值是44,表示硬盘的当前温度是44℃。
因此,有些参数直接查看数据也能大致了解硬盘目前的工作状态。
SMART参数详解
一般情况下,用户只要观察当前值、最差值和临界值的关系,并注意状态提示信息即可大致了解硬盘的健康状况。下面简单介绍各参数的含义,以红色标出的项目是寿命关键项,蓝色为固态硬盘(SSD)特有的项目。
在基于闪存的固态硬盘中,存储单元分为两类:SLC(Single Layer Cell,单层单元)和MLC(Multi-Level Cell,多层单元)。SLC成本高、容量小、但读写速度快,可靠性高,擦写次数可高达100000次,比MLC高10倍。而MLC虽容量大、成本低,但其性能大幅落后于SLC。为了保证MLC的寿命,控制芯片还要有智能磨损平衡技术算法,使每个存储单元的写入次数可以平均分摊,以达到100万小时的平均无故障时间。因此固态硬盘有许多SMART参数是机械硬盘所没有的,如存储单元的擦写次数、备用块统计等等,这些新增项大都由厂家自定义,有些尚无详细的解释,有些解释也未必准确,此处也只是仅供参考。下面凡未注明厂商的固态硬盘特有的项均为SandForce主控芯片特有的,其它厂商各自单独注明。
01(001)底层数据读取错误率 Raw Read Error Rate
数据为0或任意值,当前值应远大于与临界值。
底层数据读取错误率是磁头从磁盘表面读取数据时出现的错误,对某些硬盘来说,大于0的数据表明磁盘表面或者读写磁头发生问题,如介质损伤、磁头污染、磁头共振等等。不过对希捷硬盘来说,许多硬盘的这一项会有很大的数据量,这不代表有任何问题,主要是看当前值下降的程度。
在固态硬盘中,此项的数据值包含了可校正的错误与不可校正的RAISE错误(UECC+URAISE)。
注:RAISE(Redundant Array of Independent Silicon Elements)意为独立硅元素冗余阵列,是固态硬盘特有的一种冗余恢复技术,保证内部有类似RAID阵列的数据安全性。
02(002)磁盘读写通量性能 Throughput Performance
此参数表示硬盘的读写通量性能,数据值越大越好。当前值如果偏低或趋近临界值,表示硬盘存在严重的问题,但现在的硬盘通常显示数据值为0或根本不显示此项,一般在进行了人工脱机SMART测试后才会有数据量。
03(003)主轴起旋时间 Spin Up Time
主轴起旋时间就是主轴电机从启动至达到额定转速所用的时间,数据值直接显示时间,单位为毫秒或者秒,因此数据值越小越好。不过对于正常硬盘来说,这一项仅仅是一个参考值,硬盘每次的启动时间都不相同,某次启动的稍慢些也不表示就有问题。 硬盘的主轴电机从启动至达到额定转速大致需要4秒~15秒左右,过长的启动时间说明电机驱动电路或者轴承机构有问题。旦这一参数的数据值在某些型号的硬盘上总是为0,这就要看当前值和最差值来判断了。 对于固态硬盘来说,所有的数据都是保存在半导体集成电路中,没有主轴电机,所以这项没有意义,数据固定为0,当前值固定为100。
04(004)启停计数 Start/Stop Count
这一参数的数据是累计值,表示硬盘主轴电机启动/停止的次数,新硬盘通常只有几次,以后会逐渐增加。系统的某些功能如空闲时关闭硬盘等会使硬盘启动/停止的次数大为增加,在排除定时功能的影响下,过高的启动/停止次数(远大于通电次数0C)暗示硬盘电机及其驱动电路可能有问题。
这个参数的当前值是依据某种公式计算的结果,例如对希捷某硬盘来说临界值为20,当前值是通过公式“100-(启停计数/1024)”计算得出的。若新硬盘的启停计数为0,当前值为100-(0/1024)=100,随着启停次数的增加,该值不断下降,当启停次数达到81920次时,当前值为100-(81920/1024)=20,已达到临界值,表示从启停次数来看,该硬盘已达设计寿命,当然这只是个寿命参考值,并不具有确定的指标性。
这一项对于固态硬盘同样没有意义,数据固定为0,当前值固定为100。
05(005)重映射扇区计数 Reallocated Sectors Count/ 退役块计数 Retired Block Count
数据应为0,当前值应远大于临界值。
当硬盘的某扇区持续出现读/写/校验错误时,硬盘固件程序会将这个扇区的物理地址加入缺陷表(G-list),将该地址重新定向到预先保留的备用扇区并将其中的数据一并转移,这就称为重映射。执行重映射操作后的硬盘在Windows常规检测中是无法发现不良扇区的,因其地址已被指向备用扇区,这等于屏蔽了不良扇区。
这项参数的数据值直接表示已经被重映射扇区的数量,当前值则随着数据值的增加而持续下降。当发现此项的数据值不为零时,要密切注意其发展趋势,若能长期保持稳定,则硬盘还可以正常运行;若数据值不断上升,说明不良扇区不断增加,硬盘已处于不稳定状态,应当考虑更换了。如果当前值接近或已到达临界值(此时的数据值并不一定很大,因为不同硬盘保留的备用扇区数并不相同),表示缺陷表已满或备用扇区已用尽,已经失去了重映射功能,再出现不良扇区就会显现出来并直接导致数据丢失。
这一项不仅是硬盘的寿命关键参数,而且重映射扇区的数量也直接影响硬盘的性能,例如某些硬盘会出现数据量很大,但当前值下降不明显的情况,这种硬盘尽管还可正常运行,但也不宜继续使用。因为备用扇区都是位于磁盘尾部(靠近盘片轴心处),大量的使用备用扇区会使寻道时间增加,硬盘性能明显下降。
这个参数在机械硬盘上是非常敏感的,而对于固态硬盘来说同样具有重要意义。闪存的寿命是正态分布的,例如说MLC能写入一万次以上,实际上说的是写入一万次之前不会发生“批量损坏”,但某些单元可能写入几十次就损坏了。换言之,机械硬盘的盘片不会因读写而损坏,出现不良扇区大多与工艺质量相关,而闪存的读写次数则是有限的,因而损坏是正常的。所以固态硬盘在制造时也保留了一定的空间,当某个存储单元出现问题后即把损坏的部分隔离,用好的部分来顶替。这一替换方法和机械硬盘的扇区重映射是一个道理,只不过机械硬盘正常时极少有重映射操作,而对于固态硬盘是经常性的。
在固态硬盘中这一项的数据会随着使用而不断增长,只要增长的速度保持稳定就可以。通常情况下,数据值=100-(100×被替换块/必需块总数),因此也可以估算出硬盘的剩余寿命。
Intel固态硬盘型号的第十二个字母表示了两种规格,该字母为1表示第一代的50纳米技术的SSD,为2表示第二代的34纳米技术的SSD,如SSDSA2M160G2GN就表示是34nm的SSD。所以参数的查看也有两种情况:
50nm的SSD(一代)要看当前值。这个值初始是100,当出现替换块的时候这个值并不会立即变化,一直到已替换四个块时这个值变为1,之后每增加四个块当前值就+1。也就是100对应0~3个块,1对应4~7个块,2对应8~11个块……
34nm的SSD(二代)直接查看数据值,数据值直接表示有多少个被替换的块。
06(006)读取通道余量 Read Channel Margin
这一项功能不明,现在的硬盘也不显示这一项。
07(007)寻道错误率 Seek Error Rate
数据应为0,当前值应远大于与临界值。
这一项表示磁头寻道时的错误率,有众多因素可导致寻道错误率上升,如磁头组件的机械系统、伺服电路有局部问题,盘片表面介质不良,硬盘温度过高等等。
通常此项的数据应为0,但对希捷硬盘来说,即使是新硬盘,这一项也可能有很大的数据量,这不代表有任何问题,还是要看当前值是否下降。
08(008)寻道性能 Seek Time Performance
此项表示硬盘寻道操作的平均性能(寻道速度),通常与前一项(寻道错误率)相关联。当前值持续下降标志着磁头组件、寻道电机或伺服电路出现问题,但现在许多硬盘并不显示这一项。
09(009)通电时间累计 Power-On Time Count (POH)
这个参数的含义一目了然,表示硬盘通电的时间,数据值直接累计了设备通电的时长,新硬盘当然应该接近0,但不同硬盘的计数单位有所不同,有以小时计数的,也有以分、秒甚至30秒为单位的,这由磁盘制造商来定义。
这一参数的临界值通常为0,当前值随着硬盘通电时间增加会逐渐下降,接近临界值表明硬盘已接近预计的设计寿命,当然这并不表明硬盘将出现故障或立即报废。参考磁盘制造商给出的该型号硬盘的MTBF(平均无故障时间)值,可以大致估计剩余寿命或故障概率。
对于固态硬盘,要注意“设备优先电源管理功能(device initiated power management,DIPM)”会影响这个统计:如果启用了DIPM,持续通电计数里就不包括睡眠时间;如果关闭了DIPM功能,那么活动、空闲和睡眠三种状态的时间都会被统计在内。
0A(010)主轴起旋重试次数 Spin up Retry Count
数据应为0,当前值应大于临界值。
主轴起旋重试次数的数据值就是主轴电机尝试重新启动的计数,即主轴电机启动后在规定的时间里未能成功达到额定转速而尝试再次启动的次数。数据量的增加表示电机驱动电路或是机械子系统出现问题,整机供电不足也会导致这一问题。
0B(011)磁头校准重试计数 Calibration Retry Count
数据应为0,当前值应远大于与临界值。
硬盘在温度发生变化时,机械部件(特别是盘片)会因热胀冷缩出现形变,因此需要执行磁头校准操作消除误差,有的硬盘还内置了磁头定时校准功能。这一项记录了需要再次校准(通常因上次校准失败)的次数。
这一项的数据量增加,表示电机驱动电路或是机械子系统出现问题,但有些型号的新硬盘也有一定的数据量,并不表示有问题,还要看当前值和最差值。
0C(012)通电周期计数 Power Cycle Count
通电周期计数的数据值表示了硬盘通电/断电的次数,即电源开关次数的累计,新硬盘通常只有几次。
这一项与启停计数(04)是有区别的,一般来说,硬盘通电/断电意味着计算机的开机与关机,所以经历一次开关机数据才会加1;而启停计数(04)表示硬盘主轴电机的启动/停止(硬盘在运行时可能多次启停,如系统进入休眠或被设置为空闲多少时间而关闭)。所以大多情况下这个通电/断电的次数会小于启停计数(04)的次数。
通常,硬盘设计的通电次数都很高,如至少5000次,因此这一计数只是寿命参考值,本身不具指标性。
0D(013)软件读取错误率 Soft Read Error Rate
软件读取错误率也称为可校正的读取误码率,就是报告给操作系统的未经校正的读取错误。数据值越低越好,过高则可能暗示盘片磁介质有问题。
AA(170)坏块增长计数 Grown Failing Block Count(Micron 镁光)
读写失败的块增长的总数。
AB(171)编程失败块计数 Program Fail Block Count
Flash编程失败块的数量。
AC(172)擦写失败块计数 Erase Fail Block Count
擦写失败块的数量。
AD(173)磨损平衡操作次数(平均擦写次数) / Wear Leveling Count(Micron 镁光)
所有好块的平均擦写次数。
Flash芯片有写入次数限制,当使用FAT文件系统时,需要频繁地更新文件分配表。如果闪存的某些区域读写过于频繁,就会比其它区域磨损的更快,这将明显缩短整个硬盘的寿命(即便其它区域的擦写次数还远小于最大限制)。所以,如果让整个区域具有均匀的写入量,就可明显延长芯片寿命,这称为磨损均衡措施。
AE(174)意外失电计数 Unexpected Power Loss Count
硬盘自启用后发生意外断电事件的次数。
B1(177)磨损范围对比值 Wear Range Delta
磨损最重的块与磨损最轻的块的磨损百分比之差。
B4(180)未用的备用块计数 Unused Reserved Block Count Total(惠普)
固态硬盘会保留一些容量来准备替换损坏的存储单元,所以可用的预留空间数非常重要。这个参数的当前值表示的是尚未使用的预留的存储单元数量。
B5(181)编程失败计数 Program Fail Count
用4个字节显示已编程失败的次数,与(AB)参数相似。
#### B5(181)非4KB对齐访问数 Non-4k Aligned Access(Micron 镁光)
B6(182)擦写失败计数 Erase Fail Count
用4个字节显示硬盘自启用后块擦写失败的次数,与(AC)参数相似。
B7(183)串口降速错误计数 SATA Downshift Error Count
这一项表示了SATA接口速率错误下降的次数。通常硬盘与主板之间的兼容问题会导致SATA传输级别降级运行。
B8(184)I/O错误检测与校正 I/O Error Detection and Correction(IOEDC)
“I/O错误检测与校正”是惠普公司专有的SMART IV技术的一部分,与其他制造商的I/O错误检测和校正架构一样,它记录了数据通过驱动器内部高速缓存RAM传输到主机时的奇偶校验错误数量。
B8(184)点到点错误检测计数 End to End Error Detection Count
Intel第二代的34nm固态硬盘有点到点错误检测计数这一项。固态硬盘里有一个LBA(logical block addressing,逻辑块地址)记录,这一项显示了SSD内部逻辑块地址与真实物理地址间映射的出错次数。
B8(184)原始坏块数 Init Bad Block Count(Indilinx芯片)
硬盘出厂时已有的坏块数量。
B9(185)磁头稳定性 Head Stability(西部数据)
意义不明。
BA(186)感应运算振动检测 nduced Op-Vibration Detection(西部数据)
意义不明。
BB(187)无法校正的错误 Reported Uncorrectable Errors(希捷)
报告给操作系统的无法通过硬件ECC校正的错误。如果数据值不为零,就应该备份硬盘上的数据了。 报告给操作系统的在所有存取命令中出现的无法校正的RAISE(URAISE)错误。
BC(188)命令超时 Command Timeout
由于硬盘超时导致操作终止的次数。通常数据值应为0,如果远大于零,最有可能出现的是电源供电问题或者数据线氧化致使接触不良,也可能是硬盘出现严重问题。
BD(189)高飞写入 High Fly Writes
磁头飞行高度监视装置可以提高读写的可靠性,这一装置时刻监测磁头的飞行高度是否在正常范围来保证可靠的写入数据。如果磁头的飞行高度出现偏差,写入操作就会停止,然后尝试重新写入或者换一个位置写入。这种持续的监测过程提高了写入数据的可靠性,同时也降低了读取错误率。这一项的数据值就统计了写入时磁头飞行高度出现偏差的次数。
BD(189)出厂坏块计数 Factory Bad Block Count(Micron 镁光芯片)
BE(190)气流温度 Airflow Temperature
这一项表示的是硬盘内部盘片表面的气流温度。在希捷公司的某些硬盘中,当前值=(100-当前温度),因此气流温度越高,当前值就越低,最差值则是当前值曾经到达过的最低点,临界值由制造商定义的最高允许温度来确定,而数据值不具实际意义。许多硬盘也没有这一项参数。
BF(191)冲击错误率 G-sense error rate
这一项的数据值记录了硬盘受到机械冲击导致出错的频度。
C0(192)断电返回计数 Power-Off Retract Count
当计算机关机或意外断电时,硬盘的磁头都要返回停靠区,不能停留在盘片的数据区里。正常关机时电源会给硬盘一个通知,即Standby Immediate,就是说主机要求将缓存数据写入硬盘,然后就准备关机断电了(休眠、待机也是如此);意外断电则表示硬盘在未收到关机通知时就失电,此时磁头会自动复位,迅速离开盘片。
这个参数的数据值累计了磁头返回的次数。但要注意这个参数对某些硬盘来说仅记录意外断电时磁头的返回动作;而某些硬盘记录了所有(包括休眠、待机,但不包括关机时)的磁头返回动作;还有些硬盘这一项没有记录。因此这一参数的数据值在某些硬盘上持续为0或稍大于0,但在另外的硬盘上则会大于通电周期计数(0C)或启停计数(04)的数据。在一些新型节能硬盘中,这一参数的数据量还与硬盘的节能设计相关,可能会远大于通电周期计数(0C)或启停计数(04)的数据,但又远小于磁头加载/卸载计数(C1)的数据量。
对于固态硬盘来说,虽然没有磁头的加载/卸载操作,但这一项的数据量仍然代表了不安全关机,即发生意外断电的次数。
C1(193)磁头加载/卸载计数 Load/Unload Cycle Count
对于过去的硬盘来说,盘片停止旋转时磁头臂停靠于盘片中心轴处的停泊区,磁头与盘片接触,只有当盘片旋转到一定转速时,磁头才开始漂浮于盘片之上并开始向外侧移动至数据区。这使得磁头在硬盘启停时都与盘片发生摩擦,虽然盘片的停泊区不存储数据,但无疑启停一个循环,就使磁头经历两次磨损。所以对以前的硬盘来说,磁头起降(加载/卸载)次数是一项重要的寿命关键参数。
而在现代硬盘中,平时磁头臂是停靠于盘片之外的一个专门设计的停靠架上,远离盘片。只有当盘片旋转达到额定转速后,磁头臂才开始向内(盘片轴心)转动使磁头移至盘片区域(加载),磁头臂向外转动返回至停靠架即卸载。这样就彻底杜绝了硬盘启停时磁头与盘片接触的现象,西部数据公司将其称为“斜坡加载技术”。由于磁头在加载/卸载过程中始终不与盘片接触,不存在磁头的磨损,使得这一参数的重要性已经大大下降。
这个参数的数据值就是磁头执行加载/卸载操作的累计次数。从原理上讲,这个加载/卸载次数应当与硬盘的启停次数相当,但对于笔记本内置硬盘以及台式机新型节能硬盘来说,这一项的数据量会很大。这是因为磁头臂组件设计有一个固定的返回力矩,保证在意外断电时磁头能靠弹簧力自动离开盘片半径范围,迅速返回停靠架。所以要让硬盘运行时磁头保持在盘片的半径之内,就要使磁头臂驱动电机(寻道电机)持续通以电流。而让磁头臂在硬盘空闲几分钟后就立即执行卸载动作,返回到停靠架上,既有利于节能,又降低了硬盘受外力冲击导致磁头与盘片接触的概率。虽然再次加载会增加一点寻道时间,但毕竟弊大于利,所以在这类硬盘中磁头的加载/卸载次数会远远大于通电周期计数(0C)或启停计数(04)的数据量。不过这种加载/卸载方式已经没有了磁头与盘片的接触,所以设计值也已大大增加,通常笔记本内置硬盘的磁头加载/卸载额定值在30~60万次,而台式机新型节能硬盘的磁头加载/卸载设计值可达一百万次。
C2(194)温度 Temperature
温度的数据值直接表示了硬盘内部的当前温度。硬盘运行时最好不要超过45℃,温度过高虽不会导致数据丢失,但引起的机械变形会导致寻道与读写错误率上升,降低硬盘性能。硬盘的最高允许运行温度可查看硬盘厂商给出的数据,一般不会超过60℃。
不同厂家对温度参数的当前值、最差值和临界值有不同的表示方法:希捷公司某些硬盘的当前值就是实际温度(摄氏)值,最差值则是曾经达到过的最高温度,临界值不具意义;而西部数据公司一些硬盘的最差值是温度上升到某值后的时间函数,每次升温后的持续时间都将导致最差值逐渐下降,当前值则与当前温度成反比,即当前温度越高,当前值越低,随实际温度波动。
C3(195)硬件ECC校正 Hardware ECC Recovered
ECC(Error Correcting Code)的意思是“错误检查和纠正”,这个技术能够容许错误,并可以将错误更正,使读写操作得以持续进行,不致因错误而中断。这一项的数据值记录了磁头在盘片上读写时通过ECC技术校正错误的次数,不过许多硬盘有其制造商特定的数据结构,因此数据量的大小并不能直接说明问题。
C3(195)实时无法校正错误计数 On the fly ECC Uncorrectable Error Count
这一参数记录了无法校正(UECC)的错误数量。
C3(195)编程错误块计数 Program Failure block Count(Indilinx芯片)
C4(196)重映射事件计数 Reallocetion Events Count
数据应为0,当前值应远大于临界值。
这个参数的数据值记录了将重映射扇区的数据转移到备用扇区的尝试次数,是重映射操作的累计值,成功的转移和不成功的转移都会被计数。因此这一参数与重映射扇区计数(05)相似,都是反映硬盘已经存在不良扇区。
C4(196)擦除错误块计数 Erase Failure block Count(Indilinx芯片)
在固态硬盘中,这一参数记录了被重映射的块编程失败的数量。
C5(197)当前待映射扇区计数 Current Pending Sector Count
数据应为0,当前值应远大于临界值。
这个参数的数据表示了“不稳定的”扇区数,即等待被映射的扇区(也称“被挂起的扇区”)数量。如果不稳定的扇区随后被读写成功,该扇区就不再列入等待范围,数据值就会下降。
仅仅读取时出错的扇区并不会导致重映射,只是被列入“等待”,也许以后读取就没有问题,所以只有在写入失败时才会发生重映射。下次对该扇区写入时如果继续出错,就会产生一次重映射操作,此时重映射扇区计数(05)与重映射事件计数(C4)的数据值增加,此参数的数据值下降。
C5(197)读取错误块计数(不可修复错误)Read Failure block Count(Indilinx芯片)
C6(198)脱机无法校正的扇区计数 Offline Uncorrectable Sector Count
数据应为0,当前值应远大于临界值。
这个参数的数据累计了读写扇区时发生的无法校正的错误总数。数据值上升表明盘片表面介质或机械子系统出现问题,有些扇区肯定已经不能读取,如果有文件正在使用这些扇区,操作系统会返回读盘错误的信息。下一次写操作时会对该扇区执行重映射。
C6(198)总读取页数 Total Count of Read Sectors(Indilinx芯片)
C7(199)Ultra ATA访问校验错误率 Ultra ATA CRC Error Rate
这个参数的数据值累计了通过接口循环冗余校验(Interface Cyclic Redundancy Check,ICRC)发现的数据线传输错误的次数。如果数据值不为0且持续增长,表示硬盘控制器→数据线→硬盘接口出现错误,劣质的数据线、接口接触不良都可能导致此现象。由于这一项的数据值不会复零,所以某些新硬盘也会出现一定的数据量,只要更换数据线后数据值不再继续增长,即表示问题已得到解决。
C7(199)总写入页数 Total Count of Write Sectors(Indilinx芯片)
C8(200)写入错误率 Write Error Rate / 多区域错误率 Multi-Zone Error Rate(西部数据)
数据应为0,当前值应远大于临界值。
这个参数的数据累计了向扇区写入数据时出现错误的总数。有的新硬盘也会有一定的数据量,若数据值持续快速升高(当前值偏低),表示盘片、磁头组件可能有问题。
C8(200)总读取指令数 Total Count of Read Command(Indilinx芯片)
C9(201)脱道错误率 Off Track Error Rate / 逻辑读取错误率 Soft Read Error Rate
数据值累积了读取时脱轨的错误数量,如果数据值不为0,最好备份硬盘上的资料。
C9(201)TA Counter Detected(意义不明)
C9(201)写入指令总数 Total Count of Write Command(Indilinx芯片)
CA(202)数据地址标记错误 Data Address Mark errors
此项的数据值越低越好(或者由制造商定义)。
CA(202)TA Counter Increased(意义不明)
CA(202)剩余寿命 Percentage Of The Rated Lifetime Used(Micron 镁光芯片)
当前值从100开始下降至0,表示所有块的擦写余量统计。计算方法是以MLC擦写次数除以50,SLC擦写次数除以1000,结果取整数,将其与100的差值作为当前值(MLC预计擦写次数为5000,SLC预计擦写次数为100000)。
CA(202)闪存总错误bit数 Total Count of error bits from flash(Indilinx芯片)
CB(203)软件ECC错误数 Run Out Cancel
错误检查和纠正(ECC)出错的频度。
CB(203)校正bit错误的总读取页数 Total Count of Read Sectors with correct bits error(Indilinx芯片)
CC(204)软件ECC校正 Soft ECC Correction
通过软件ECC纠正错误的计数。
CC(204)坏块满标志 Bad Block Full Flag(Indilinx芯片)
CD(205)热骚动错误率 Thermal Asperity Rate (TAR)
由超温导致的错误。数据值应为0。
CD(205)最大可编程/擦除次数 Max P/E Count(Indilinx芯片)
CE(206)磁头飞行高度 Flying Height
磁头距离盘片表面的垂直距离。高度过低则增加了磁头与盘片接触导致损坏的可能性;高度偏高则增大了读写错误率。不过准确地说,硬盘中并没有任何装置可以直接测出磁头的飞行高度,制造商也只是根据磁头读取的信号强度来推算磁头飞行高度。
CE(206)底层数据写入出错率 Write Error Rate
CE(206)最小擦写次数 Erase Count Min(Indilinx芯片)
CF(207)主轴过电流 Spin High Current
数据值记录了主轴电机运行时出现浪涌电流的次数,数据量的增加意味着轴承或电机可能有问题。
CF(207)最大擦写次数 Erase Count Max(Indilinx芯片)
D0(208)主轴电机重启次数 Spin Buzz
数据值记录了主轴电机反复尝试启动的次数,这通常是由于电源供电不足引起的。
D0(208)平均擦写次数Erase Count Average(Indilinx芯片)
D1(209)脱机寻道性能 Offline Seek Performance
这一项表示驱动器在脱机状态下的寻道性能,通常用于工厂内部测试。
D1(209)剩余寿命百分比 Remaining Life %(Indilinx芯片)
D2(210)斜坡加载值 Ramp Load Value
这一项仅见于几年前迈拓制造的部分硬盘。通常数据值为0,意义不明。
D2(210)坏块管理错误日志 BBM Error Log(Indilinx芯片)
D3(211)写入时振动 Vibration During Write
写入数据时受到受到外部振动的记录。
D3(211)SATA主机接口CRC写入错误计数 SATA Error Count CRC (Write)(Indilinx芯片)
D4(212)写入时冲击 Shock During Write
写入数据时受到受到外部机械冲击的记录。
D4(212)SATA主机接口读取错误计数 SATA Error Count Count CRC (Read)(Indilinx芯片)
DC(220)盘片偏移量 Disk Shift
硬盘中的盘片相对主轴的偏移量(通常是受外力冲击或温度变化所致),单位未知,数据值越小越好。
DD(221)冲击错误率 G-sense error rate
与(BF)相同,数据值记录了硬盘受到外部机械冲击或振动导致出错的频度。
DE(222)磁头寻道时间累计 Loaded Hours
磁头臂组件运行的小时数,即寻道电机运行时间累计。
DF(223)磁头加载/卸载重试计数 Load/Unload Retry Count
这一项与(C1)项类似,数据值累积了磁头尝试重新加载/卸载的次数。
E0(224)磁头阻力 Load Friction
磁头工作时受到的机械部件的阻力。
E1(225)主机写入数据量 Host Writes
由于闪存的擦写次数是有限的,所以这项是固态硬盘特有的统计。Intel的SSD是每当向硬盘写入了65536个扇区,这一项的数据就+1。如果用HDTune等软件查看SMART时可以自己计算,Intel SSD Toolbox已经为你算好了,直接就显示了曾向SSD中写入过的数据量。
E2(226)磁头加载时间累计 Load 'In'-time
磁头组件运行时间的累积数,即磁头臂不在停靠区的时间,与(DE)项相似。
E3(227)扭矩放大计数 Torque Amplification Count
主轴电机试图提高扭矩来补偿盘片转速变化的次数。当主轴轴承存在问题时,主轴电机会尝试增加驱动力使盘片稳定旋转。这个参数的当前值下降,说明硬盘的机械子系统出现了严重的问题。
E4(228)断电返回计数 Power-Off Retract Cycle
数据值累计了磁头因设备意外断电而自动返回的次数,与(C0)项相似。
E6(230)GMR磁头振幅 GMR Head Amplitude
磁头“抖动”,即正向/反向往复运动的距离。
E7(231)温度 Temperature
温度的数据值直接表示了硬盘内部的当前温度,与(C2)项相同。
E7(231)剩余寿命 SSD Life Left
剩余寿命是基于P/E周期与可用的备用块作出的预测。新硬盘为100;10表示PE周期已到设计值,但尚有足够的保留块;0表示保留块不足,硬盘将处于只读方式以便备份数据。
E8(232)寿命余量 Endurance Remaining
寿命余量是指硬盘已擦写次数与设计最大可擦写次数的百分比,与(CA)项相似。
E8(232)预留空间剩余量 Available Reserved Space(Intel芯片)
对于Intel的SSD来说,前边05项提到会保留一些容量来准备替换损坏的存储单元,所以可用的预留空间数非常重要。当保留的空间用尽,再出现损坏的单元就将出现数据丢失,这个SSD的寿命就结束了。所以仅看05项意义并不大,这一项才最重要。这项参数可以看当前值,新的SSD里所有的预留空间都在,所以是100。随着预留空间的消耗,当前值将不断下降,减小到接近临界值(一般是10)时,就说明只剩下10%的预留空间了,SSD的寿命将要结束。这个与(B4)项相似。
E9(233)通电时间累计 Power-On Hours
对于普通硬盘来说,这一项与(09)相同。
E9(233)介质磨耗指数 Media Wareout Indicator(Intel芯片)
由于固态硬盘的擦写次数是有限的,当到达一定次数的时候,就会出现大量的单元同时损坏,这时候预留空间也顶不住了,所以这项参数实际上表示的是硬盘设计寿命。Intel的SSD要看当前值,随着NAND的平均擦写次数从0增长到最大的设计值,这一参数的当前值从开始的100逐渐下降至1为止。这表示SSD的设计寿命已经终结。当然到达设计寿命也不一定意味着SSD就立即报废,这与闪存芯片的品质有着很大的关系。
注:Total Erase Count全擦写计数是指固态硬盘中所有块的擦写次数的总和,不同规格的NAND芯片以及不同容量的SSD,其最大全擦写次数均有所不同。
F0(240)磁头飞行时间 Head Flying Hours / 传输错误率 Transfer Error Rate(富士通)
磁头位于工作位置的时间。 富士通硬盘表示在数据传输时连接被重置的次数。
F1(241)LBA写入总数 Total LBAs Written
LBA写入数的累计。
F1(241)写入剩余寿命 Lifetime Writes from Host
自硬盘启用后主机向硬盘写入的数据总量,以4个字节表示,每写入64GB字节作为一个单位。
F2(242)LBA读取总数 Total LBAs Read
LBA读取数的累计。某些SMART读取工具会显示负的数据值,是因为采用了48位LBA,而不是32位LBA。
F2(242)读取剩余寿命 Lifetime Reads from Host
自硬盘启用后主机从硬盘读取的数据总量,以4个字节表示,每读取64GB字节作为一个单位。
FA(250)读取错误重试率 Read Error Retry Rate
从磁盘上读取时出错的次数。
FE(254)自由坠落保护 Free Fall Protection
现在有些笔记本硬盘具有自由坠落保护功能,当硬盘内置的加速度探测装置检测到硬盘位移时,会立即停止读写操作,将磁头臂复位。这个措施防止了磁头与盘片之间发生摩擦撞击,提高了硬盘的抗震性能。这个参数的数据里记录了这一保护装置动作的次数。
参考
sort
- 查看一下你最常用的10个命令
cat .bash_history | sort | uniq -c | sort -rn | head -n 10
- 列出当前目录里最大的10个文件
du -s * | sort -n | tail
- 列出头十个最耗内存的进程
ps aux | sort -nk +4 | tail
- 去除重复的行
sort -u your_file > sorted_deduplicated_file
# 保留原来行顺序
cat -n your_file | sort -uk2 | sort -nk1 | cut -f2-
speedtest-cli speedtest.net[1] 的 CLI 工具,用于检查网速
speedtest-cli
stat 获取文件信息
tpxcer@docker-no-proxy:~$ stat nezha.sh
File: nezha.sh
Size: 34828 Blocks: 72 IO Block: 4096 regular file
Device: 254,0 Inode: 526184 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ tpxcer) Gid: ( 1000/ tpxcer)
Access: 2023-11-30 21:14:48.186246550 +0800
Modify: 2023-11-30 21:14:39.518157174 +0800
Change: 2023-11-30 21:14:39.526157257 +0800
Birth: 2023-11-30 21:14:39.466156638 +0800
ss 获得有关网络套接字的详细信息(在网络上发送和接收数据的端点)
# 列出所有监听和非监听的 TCP 连接
ss -at
# UDP 端口进行同样的操作
ss -au
tcpdump 数据包嗅探和分析工具,用于捕获、分析和过滤网络流量
# 获得当前接口的捕获数据包
sudo tcpdump
# 将捕获的数据包保存在 pcap 文件中
sudo tcpdump -w Captured_Packets.cap -i < networkdevice >
# 要访问保存的文件,你需要使用 -r 选项加上文件名。
sudo tcpdump -r Captured_Packets.pcap
tee 同时输出到屏幕和文件
# 只能输出到文件,屏幕看不到结果
ls > file
# 用了tee可以在屏幕显示结果,并同时输出到文件
ls | tee file
touch 创建文件
touch file_{1..1000} 创建一千个文件
touch {apple,banana,cherry,durian}
touch {1..10..2} 创建奇数文件
touch {w..d..2}
touch {apple,banana,cherry,durian}_{01..100}{w..d}
用tr进行转换
- 加解密转换,替换对应字符
echo 12345 | tr '0-9' '9876543210'
echo 'This is ROT-13 encrypted.' | tr 'A-Za-z' 'N-ZA-Mn-za-m' --加密
echo 'Guvf vf EBG-13 rapelcgrq.' | tr 'A-Za-z' 'N-ZA-Mn-za-m' --解密
tr 'A-Z' 'a-z' people.txt
tr ',' '\t' < us_presidents.csv > us_presidents.tsv
- 制表符转空格
cat text| tr '\t' ' '
- 删除字符
cat file | tr -d '0-9'
tr -d '\015\032' < windows_file > unix_file 移除换行符
- 获取文件中所有数字
cat file | tr -c '0-9'
- 删除非数字数据
cat file | tr -d -c '0-9 \n'
6.压缩文本中出现的重复字符;最常用于压缩多余的空格
cat file | tr -s ' '
tr -s ' ' < file1 > file2 移除双空格
tr -d '\015\032' < windows_file > unix_file 移除换行符
- 字符类 tr中可用各种字符类:
- alnum:字母和数字
- alpha:字母
- digit:数字
- space:空白字符
- lower:小写
- upper:大写
- cntrl:控制(非可打印)字符
- print:可打印字符
移除不可见字符
tr -dc [:print:] < file1 > file2
tracepath 在追踪网络主机的路径时,获取最大传输单元
# 发现 MTU(最大传输单元)
tracepath google.com
# 同时打印出 IP 地址和主机名
tracepath -b google.com
traceroute 识别数据包到达主机的路径
探测前往地址IP的路由路径
MAC-➜ ~ traceroute google.com
traceroute to google.com (142.251.220.46), 64 hops max, 52 byte packets
1 192.168.100.1 (192.168.100.1) 7.112 ms 7.802 ms 6.863 ms
2 114.92.204.1 (114.92.204.1) 11.022 ms 11.213 ms 9.048 ms
3 61.152.31.29 (61.152.31.29) 15.013 ms
61.152.31.25 (61.152.31.25) 16.841 ms 11.843 ms
4 101.95.88.102 (101.95.88.102) 14.839 ms 12.169 ms 17.978 ms
uniq 消除重复行
命令仅能对相邻的行去重
- 消除重复行
sort unsort.txt | uniq
- 统计各行在文件中出现的次数
sort unsort.txt | uniq -c
- 找出重复行
sort unsort.txt | uniq -d
vmstat
列出活动和非活动内存
hdp1-➜ ~ vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 0 14206168 404652 1335188 0 0 2 1 97 33 0 0 99 1 0
- Free – Amount of free/idle memory spaces.
- si – Swapped in every second from disk in KiloBytes.
- so – Swapped out every second to disk in KiloBytes.
间隔x秒持续显示n次
hdp1-➜ ~ vmstat 2 5
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 14205632 2104 645288 0 0 2 1 97 35 0 0 99 1 0
0 0 0 14205672 2104 645288 0 0 0 0 395 739 0 0 100 0 0
0 0 0 14205672 2104 645288 0 0 0 2 476 889 0 0 100 0 0
0 0 0 14205672 2104 645288 0 0 0 0 411 752 0 0 100 0 0
0 0 0 14205640 2104 645288 0 0 0 0 499 891 0 0 100 0 0
显示时间
hdp1-➜ ~ vmstat -t 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st CST
1 0 0 14205952 2104 645288 0 0 2 1 97 35 0 0 99 1 0 2021-12-22 11:05:50
0 0 0 14205780 2104 645288 0 0 0 0 393 728 0 0 100 0 0 2021-12-22 11:05:51
0 0 0 14204840 2104 645304 0 0 0 0 945 1274 1 2 97 0 0 2021-12-22 11:05:52
0 0 0 14204840 2104 645304 0 0 0 0 585 1043 0 0 100 0 0 2021-12-22 11:05:53
0 0 0 14204872 2104 645304 0 0 0 0 514 893 0 0 100 0 0 2021-12-22 11:05:54
显示汇总信息
hdp1-➜ ~ vmstat -s
16266504 K total memory
1413408 K used memory
1335020 K active memory
404644 K inactive memory
14205692 K free memory
2104 K buffer memory
645300 K swap cache
0 K total swap
0 K used swap
0 K free swap
36622 non-nice user cpu ticks
8 nice user cpu ticks
30251 system cpu ticks
28038710 idle cpu ticks
196714 IO-wait cpu ticks
0 IRQ cpu ticks
280 softirq cpu ticks
0 stolen cpu ticks
565324 pages paged in
173559 pages paged out
0 pages swapped in
0 pages swapped out
27390151 interrupts
52929228 CPU context switches
1640071508 boot time
11959 forks
显示磁盘状态
hdp1-➜ ~ vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 11791 7 1128593 3652 15277 334 347527 8834 0 6
sr0 18 0 2056 4 0 0 0 0 0 0
dm-0 9675 0 1091261 3352 15560 0 316391 8747 0 6
dm-1 86 0 4144 8 0 0 0 0 0 0
显示统计,以M为单位
hdp1-➜ ~ vmstat -S M 1 5
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 13872 2 630 0 0 2 1 97 36 0 0 99 1 0
1 0 0 13872 2 630 0 0 0 0 410 740 0 0 100 0 0
0 0 0 13872 2 630 0 0 0 0 441 837 0 0 100 0 0
vnstat 主要用于监控网络流量和带宽消耗
# 系统所有可用接口的基本统计信息
vnstat
# 实时监控
vnstat -l
watch
查看cpu实时频率
watch grep \"cpu MHz\" /proc/cpuinfo
wget
下载文件,指定目录和文件名
$ wget --output-document=file=file.tzx 'https://domain/foo-bar-xyz-long-file.tzx?key=xyz'
## OR use the capital '-O' as follows ##
$ wget -O file.tzx 'https://domain/foo-bar-xyz-long-file.tzx?key=xyz'
设置下载目录前缀
wget -P /tmp/ url
wget -P /isoimages/ https://ur1/freebsd.iso
wget -P /isoimages/ https://ur2/opnbsd.iso
wget -P /isoimages/ https://ur3/rhel.iso
下载的时候记录日志
$ wget --output-file=log.txt https://url1/..
## small '-o' ##
$ wget -o download.log.txt https://url2/..
$ wget -o download.log \
-O rhel9.iso \
'https://access.cdn.redhat.com/content/origin/23e6decd3160473/rhel-baseos-9.0-beta-0-x86_64-dvd.iso?_auth_=xyz'
下载多个文件
$ wget http://www.cyberciti.biz/download/lsst.tar.gz ftp://ftp.freebsd.org/pub/sys.tar.gz ftp://ftp.redhat.com/pub/xyz-1rc-i386.rpm
URLS="http://www.cyberciti.biz/download/lsst.tar.gz \
ftp://ftp.freebsd.org/pub/sys.tar.gz \
ftp://ftp.redhat.com/pub/xyz-1rc-i386.rpm \
http://xyz-url/abc.iso"
for u in $URLS
do
wget "$u"
done
通过文件列表下载
文件列表/tmp/download.txt
http://www.cyberciti.biz/download/lsst.tar.gz
ftp://ftp.freebsd.org/pub/sys.tar.gz
ftp://ftp.redhat.com/pub/xyz-1rc-i386.rpm
http://xyz-url/abc.iso
下载
$ wget -i /tmp/download.txt
断点续传
$ wget -c http://www.cyberciti.biz/download/lsst.tar.gz
$ wget -c -i /tmp/download.txt
后台下载
$ wget -cb -o /tmp/download.log -i /tmp/download.txt
$ nohup wget -c -o /tmp/download.log -i /tmp/download.txt &
限制下载速度
$ wget -c -o /tmp/susedvd.log --limit-rate=50k ftp://ftp.novell.com/pub/suse/dvd1.iso
限制下载大小
$ wget -cb -o /tmp/download.log -i /tmp/download.txt --quota=100m
用户名密码下载
$ wget --http-user=vivek --http-password=Secrete http://cyberciti.biz/vivek/csits.tar.gz
$ wget 'http://username:password@cyberciti.biz/file.tar.gz
下载的同时管道输出
$ wget -q -O - 'https://url1/file.tar.xz' | tar -Jxzf - -C /tmp/data/
镜像站点
$ wget -m https://url/
$ wget --mirror https://url/
使用指定的User-Agent下载
$ wget -U 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0' \
https://www.nixcraft.com/robots.txt
不验证https证书下载
$ wget --no-check-certificate \
https://www.cyberciti.biz/robots.txt
whois 获取有关注册的域名、IP 地址、名称服务器等信息
whois [DomainName]
xargs
xargs命令可以从标准输入读取参数,然后组建成新的命令去执行,举个例子:
$ echo 'this that' | xargs
this that
这里就是把 echo 打印到标准输出的内容,通过管道传到 xargs 的标准输入,因此 xargs 拼接出命令 xargs echo this that, 那么为啥会有一个echo出来呢?因为xargs的格式是 xargs <选项> <命令> <默认给的参数>,如果默认没有填写命令,那么就是echo。 继续照着上面的例子讲解,正常情况下,xargs构建命令,是直接把标准输入读到的命令放在最后,比如:
$ echo this that whoops well | xargs echo duang
duang this that whoops well
xargs 命令行参数转换
xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find;
参数说明
- -d 定义定界符 (默认为空格 多行的定界符为 \n)
- -n 指定输出为多行
- -I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
- -0:指定\0为输入定界符
- 将多行输出转化为单行输出
cat file.txt| xargs \n 是多行文本间的定界符
- 将单行转化为多行输出
# -n:指定每行显示的字段数
cat single.txt | xargs -n 3
- 统计程序行数
find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l
- redis通过string存储数据,通过set存储索引,需要通过索引来查询出所有的值:
./redis-cli smembers $1 | awk '{print $1}'|xargs -I {} ./redis-cli get {}
- 复制文件到多个目录
echo /home/user/1/ /home/user/2/ /home/user/3/ | xargs -n 1 cp /home/user/my_file.txt