Rootop 服务器运维与web架构

2024-07-25
发表者 Venus
ubuntu中扫描硬盘坏块已关闭评论

ubuntu中扫描硬盘坏块

作者: “Zhwt”,一位极其爱折腾的小哥。

今天收到粉丝投稿  – ↑ –

使用 badblocks 命令扫描磁盘上的坏块.

# badblocks -b 4096 -o badblocks.txt -nsv /dev/sda
  • -b 4096: 指定扫描的块大小, 可以用 tune2fs -l partition | grep 'Block size' 查看某个分区的信息
  • -o badblocks.txt 坏块信息输出到 badblocks.txt 而不是 stdout
  • -n 指定用非破坏性读写测试. 在测试之前自动备份扇区的原始内容, 然后写入随机数据并读取, 最后从备份中恢复原始内容. 适合硬盘上已经有数据的情况, 这种方式不会破坏硬盘上原有的数据
  • -s 显示进度
  • -v 显示详细信息, 显示坏块信息到 stdout

需要注意的是在使用 badblocks 检查坏块时, 被检查的磁盘不能处于被挂载的状态, 如果提示:

/dev/sda is mounted; it's not safe to run badblocks!

说明需要先 umount 解除磁盘的挂载, 然后再运行 badblocks 扫描. 建议可以用 Clonezilla 或者 Ubuntu 系统安装盘起一个 live 环境然后扫描.

示例输出:

# badblocks -b 4096 -o badblocks.txt -nsv /dev/sda
Checking for bad blocks in non-destructive read-write mode
From block 0 to 3909653
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern:  11.45% done, 1:41 elapsed. (1/2/3 errors)

最后的 (1/2/3 errors) 指的是 1 个读取错误, 2 个写入错误, 3 个 corruption error(损坏错误, 不会翻译)

利用已知坏块信息重新创建分区:

# mke2fs -t filesystem-type -l badblocks.txt /dev/sda2

查看 SMART 信息

列出挂载的磁盘信息:

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 14.9G  0 disk
├─sda1   8:1    0  711M  0 part /boot/efi
└─sda2   8:2    0 14.2G  0 part /

查看硬盘 SMART 信息:

smartctl -a /dev/sda

如果这一步提示找不到命令, 需要安装 smartmoontools 包:

apt install smartmontools

示例 SMART 信息:

# smartctl -a /dev/sda
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.8.0-39-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     FORESEE 16GB SSD
Serial Number:    I48883J003721
LU WWN Device Id: 5 02b2a2 01d1c1b1a
Add. Product Id:  mavlsata
Firmware Version: V3.24
User Capacity:    16,013,942,784 bytes [16.0 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
TRIM Command:     Available
Device is:        Not in smartctl database 7.3/5528
ATA Version is:   ACS-3 T13/2161-D revision 4
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Thu Jul 25 07:01:14 2024 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x02) Offline data collection activity
                                        was completed without error.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.
Total time to complete Offline
data collection:                (    0) seconds.
Offline data collection
capabilities:                    (0x35) SMART execute Offline immediate.
                                        No Auto Offline data collection support.
                                        Abort Offline collection upon new
                                        command.
                                        No Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        No Selective Self-test supported.
SMART capabilities:            (0x0002) Does not save SMART data before
                                        entering power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x00) Error logging NOT supported.
                                        General Purpose Logging supported.
Short self-test routine
recommended polling time:        (   1) minutes.
Extended self-test routine
recommended polling time:        (   1) minutes.
Conveyance self-test routine
recommended polling time:        (   1) minutes.

SMART Attributes Data Structure revision number: 5
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0033   100   100   010    Pre-fail  Always       -       4559
 12 Power_Cycle_Count       0x0033   100   100   010    Pre-fail  Always       -       1107
161 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
164 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       42474
165 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       51
166 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       17
167 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       40
169 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
176 Erase_Fail_Count_Chip   0x0033   100   100   010    Pre-fail  Always       -       0
177 Wear_Leveling_Count     0x0033   100   100   010    Pre-fail  Always       -       0
178 Used_Rsvd_Blk_Cnt_Chip  0x0033   100   100   010    Pre-fail  Always       -       0
192 Power-Off_Retract_Count 0x0033   100   100   010    Pre-fail  Always       -       14
194 Temperature_Celsius     0x0033   100   100   010    Pre-fail  Always       -       48
195 Hardware_ECC_Recovered  0x0033   100   100   010    Pre-fail  Always       -       0
199 UDMA_CRC_Error_Count    0x0033   100   100   010    Pre-fail  Always       -       0
241 Total_LBAs_Written      0x0033   100   100   010    Pre-fail  Always       -       237
242 Total_LBAs_Read         0x0033   100   100   010    Pre-fail  Always       -       659
243 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
244 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
245 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
246 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
250 Read_Error_Retry_Rate   0x0033   100   100   010    Pre-fail  Always       -       0
251 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
252 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
253 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
254 Unknown_SSD_Attribute   0x0033   100   100   010    Pre-fail  Always       -       0

SMART Error Log not supported

SMART Self-test Log not supported

Selective Self-tests/Logging not supported

The above only provides legacy SMART information - try 'smartctl -x' for more

如果提示信息如下说明硬盘不支持 SMART, 例如在 VMWare 虚拟机里的虚拟磁盘:

# smartctl -a /dev/sda
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.15.0-113-generic] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Vendor:               VMware,
Product:              VMware Virtual S
Revision:             1.0
User Capacity:        107,374,182,400 bytes [107 GB]
Logical block size:   512 bytes
Rotation Rate:        Solid State Device
Device type:          disk
Local Time is:        Thu Jul 25 15:04:32 2024 CST
SMART support is:     Unavailable - device lacks SMART capability.

=== START OF READ SMART DATA SECTION ===
Current Drive Temperature:     0 C
Drive Trip Temperature:        0 C

Error Counter logging not supported

Device does not support Self Test logging

需要注意 SMART 信息中的 Reallocated_Sector_Ct, Reallocated_Event_Count, Current_Pending_Sector 这三条数据, 如果开始升高说明可能磁盘上出现坏块而且数量在增加

参考:

  1. https://wiki.archlinux.org/title/Badblocks
  2. https://www.baeldung.com/linux/disk-check-repair-bad-sectors
  3. https://forum.openmediavault.org/index.php?thread/21047-clip-out-bad-sectors/

2024-07-16
发表者 Venus
XHR和fetch两种类型对OPTIONS方法和预检请求区别整理已关闭评论

XHR和fetch两种类型对OPTIONS方法和预检请求区别整理

XHR是传统的数据请求方式,而 Fetch API 则代表了现代Web开发的新兴标准。

fetch和XMLHttpRequest(XHR)在处理跨域请求时的行为有所不同。

# fetch
fetch默认不发送OPTIONS请求。
如果需要发送OPTIONS请求,需要显式地创建一个OPTIONS请求并使用fetch发送。

# XMLHttpRequest (XHR)
XHR在跨域请求时浏览器会先发送OPTIONS请求,以检查服务器是否允许实际请求跨域访问资源。
这是浏览器的一种安全措施,确保服务器知道请求的方法、来源和头部是安全的。

预检请求(Preflight Request):在实际的跨域请求之前,浏览器会首先发送一个 OPTIONS 请求,以检测服务器是否支持真实的跨域请求。
这个 OPTIONS 请求中会携带以下请求头信息:
Access-Control-Request-Headers:告知服务器实际请求可能携带的自定义请求头字段。
Access-Control-Request-Method:告知服务器实际请求所使用的 HTTP 方法。

服务端响应:
服务端需要设置响应头,以允许跨域请求。以下是一些关键的响应头字段
Access-Control-Allow-Methods: 返回服务端允许的请求方法,包括 GET、HEAD、PUT、PATCH、POST、DELETE 等。
Access-Control-Allow-Credentials:允许跨域携带 cookie(如果跨域请求需要携带 cookie,这个字段必须设置为 true)。
Access-Control-Allow-Origin: 允许跨域请求的域名,可以在服务端配置信任的域名白名单。
Access-Control-Allow-Headers: 允许跨域携带自定义请求头。

参考:https://www.cnblogs.com/magicg/p/13670213.html

########################################################################################

在配置 aws cloudfront 时要注意两种 “缓存键和源请求” 的区别!!!

这两个标头,需要被 CloudFront 正确的转发至 S3,才能使有 OPTIONS 的跨域成功被满足。然而恰巧两种「缓存键和源请求」对于处理这个标头的方式不同:

1. 使用 Cache policy and origin request policy (recommended),缓存策略是 CachingOptimized、源请求策略 无。
这样的配置会让 CloudFront 过滤掉以上两个 Access-Control-* 标头。
参考基准:当使用 Cache policy and origin request policy,需参考文档 [1] 的表格,确认您需要转发的标头是否在表格中、且是否默认会被转发。
然而 Access-Control-* 属于表格中第一列「其他定义的标头」,行为会是:被过滤。

解决方式:使用「源请求策略」功能,选择「CORS-S3Origin」,配置完成后刷新缓存(失效)。

2. 使用 Legacy cache settings,也就是「旧缓存设置」,旧缓存设置的行为,如同表格 [1] 第一列「其他定义的标头」提到的,「旧缓存设置 会使 CloudFront 将标头转发到源」,因此您使用旧缓存设置的时候,不用额外多做配置就可以将 Access-Control-* 转发到源,使 OPTIONS 成功。

因此建议您当使用 Cache policy and origin request policy 时需要额外注意标头是否被转发,并使用「源请求策略」来放行特定标头,以 CORS 跨域来说选择「CORS-S3Origin」并清理下缓存即可让 OPTIONS 成功。
或者是直接使用「旧缓存设置」也可以达成您的需求。

文档1:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior

2024-07-12
发表者 Venus
nginx配置br压缩已关闭评论

nginx配置br压缩

# br模块仓库 https://github.com/google/ngx_brotli

注意br模块只能在https中用。http协议是不支持的。

当浏览器发送请求时,会在请求头中携带支持的压缩算法。
比如chrome访问http网站时,请求头中为Accept-Encoding: gzip, deflate
访问https网站时,请求头中为Accept-Encoding: gzip, deflate, br, zstd

nginx可以同时配置gzip和br压缩算法,如果浏览器的请求头中含有br,则优先于gzip。

# 错误:CMake 3.15 or higher is required. You are running version 3.6.0
# 安装新版本cmake,否则可能会提示上面CMake版本过低问题。

[root@web02 ~]# cd /usr/local/
[root@web02 local]# wget -c https://cmake.org/files/v3.30/cmake-3.30.0-linux-x86_64.tar.gz
[root@web02 local]# tar zxvf cmake-3.30.0-linux-x86_64.tar.gz 

[root@web02 local]# echo 'export PATH=$PATH:/usr/local/cmake-3.30.0-linux-x86_64/bin' >> /etc/profile
[root@web02 ~]# source /etc/profile

# 构建依赖
[root@web02 ~]# cat br
git clone --recurse-submodules https://github.com/google/ngx_brotli
cd ngx_brotli/deps/brotli
mkdir out && cd out
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_CXX_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_INSTALL_PREFIX=./installed ..
cmake --build . --config Release --target brotlienc

[root@web02 ~]# bash br

# nginx添加br的编译参数
./configure --add-module=../ngx_brotli


# nginx虚拟主机配置
server
{

	listen       16666 ssl;
	http2 on;
	server_name  localhost;

	ssl_certificate /home/software/openresty/nginx/conf/vhost/fullchain5.pem;
	ssl_certificate_key /home/software/openresty/nginx/conf/vhost/privkey5.pem;
	
	ssl_session_timeout 5m;
	ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
	ssl_prefer_server_ciphers on;


	index index.html;
	root /home/software/openresty/nginx/html;

	#启用brotli压缩
	brotli on;
	brotli_comp_level 6;
	brotli_buffers 16 8k;
	brotli_min_length 20;
	# 注意要配置压缩的文件类型(content-type)
	brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml application/wasm application/octet-stream;  


	# 反向代理用法
	#location /
	#{
		#proxy_pass http://192.168.12.196:8888;
		#proxy_set_header Accept-Encoding "";

		#启用brotli压缩
		#brotli on;
		#brotli_comp_level 6;
		#brotli_buffers 16 8k;
		#brotli_min_length 20;
		# 注意要配置压缩的文件类型(content-type)
		#brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml application/wasm application/octet-stream;  
	#}
}

2024-06-27
发表者 Venus
sshfs远程挂载到本地已关闭评论

sshfs远程挂载到本地

sshfs命令可以将远程文件系统挂载到本地文件系统,使得远程文件可以像本地文件一样访问。

[root@web ~]# yum install -y fuse-sshfs
# ubuntu安装:apt install sshfs

# 将远程主机的/mnt目录挂载到本地的/mnt目录
[root@web ~]# sshfs root@192.168.12.220:/mnt /mnt
提示输入密码

[root@web ~]# df -h| grep mnt
root@192.168.12.220:/mnt   49G  2.1G   47G   5% /mnt

# 卸载
[root@web ~]# fusermount -u /mnt/

2024-06-18
发表者 Venus
ip rule/ip route定义策略路由已关闭评论

ip rule/ip route定义策略路由

ip rule 是 Linux 下的一个命令,用于管理和查看路由策略数据库 (RPDB, Routing Policy Database)。
它允许管理员定义基于各种选择条件(如源地址、目的地址、接口等)的路由规则。
以下是 ip rule 命令的一些常用参数及其解释:

# 常用参数
add:添加一条新的路由规则。
del:删除一条现有的路由规则。
list 或 show:显示当前的路由规则。

参数解释
from [ADDRESS[/MASK]]:指定源地址或源地址范围。只匹配来自这些地址的数据包。可以是单个 IP 地址或 CIDR 范围。
to [ADDRESS[/MASK]]:  指定目的地址或目的地址范围。只匹配发送到这些地址的数据包。可以是单个 IP 地址或 CIDR 范围。
iif [NAME]:		   指定入接口。只匹配从该接口接收到的数据包。接口名例如 eth0。
oif [NAME]:		   指定出接口。只匹配将从该接口发送出去的数据包。接口名例如 eth0。
priority [PREFERENCE]:指定规则的优先级。数值越小优先级越高。规则按优先级顺序进行匹配。规则按从小到大的顺序进行匹配。
table [TABLE_ID]:	   指定路由表。数据包匹配此规则后,将在指定的路由表中查找路由。默认路由表 ID 为 main (254), local (255), default (253) 等。
fwmark [MARK]:		   指定防火墙标记。只匹配带有该标记的数据包。由 iptables 或 nftables 设置的数据包标记。
uidrange [UID-START-UID-END]:匹配数据包的用户 ID 范围。例如, 0-65535。
sport [PORT[/MASK]]:  指定源端口或源端口范围。只匹配来自这些端口的数据包。可以是单个端口或端口范围。
dport [PORT[/MASK]]:  指定目标端口或目标端口范围。只匹配发送到这些端口的数据包。可以是单个端口或端口范围。
tos [TOS]:			   指定服务类型 (Type of Service)。只匹配带有此 TOS 值的数据包。TOS 值用来指定数据包的优先级。
ipproto [PROTOCOL]:   指定 IP 协议。只匹配使用该协议的数据包。例如, tcp, udp, icmp 等。

在方括号内的表达式(“[” 和 “]”之间的字符)是可选的(写命令时要去掉括号)。
在尖括号内的表达式(“<” 和 “>”之间的字符)是必须替换的表达式(而且要去掉尖括号)。
省略号表示该选项可以单个或多个

# 添加规则
ip rule add from 192.168.1.0/24 table 100 priority 100
这条规则表示,来自 192.168.1.0/24 网络的数据包将根据路由表 100 的规则进行处理,优先级为 100。

# 删除规则
ip rule del from 192.168.1.0/24 table 100 priority 100
这条规则表示删除之前添加的规则。

# 显示当前规则
ip rule show
这条命令将显示当前的所有路由规则及其优先级和条件。

#####################################################################
linux中默认有3个路由表,local main default
[root@localhost ~]# cat /etc/iproute2/rt_tables 
#
# reserved values
#
255	local
254	main
253	default
0	unspec
#
# local
#
#1	inr.ruhep

ip route show 默认就是打印的main表,等于ip route show table main
local表是本地路由表,ip route show table local,是系统配置的ip生成的路由信息。

ip route add 是用于向 Linux 内核的路由表中添加路由的命令。
它属于 ip 命令套件的一部分,该套件用于管理网络设备、路由、策略路由和隧道。
ip route add 命令有多种参数,可以配置路由的不同方面。以下是一些常见参数及其解释:

基本语法
ip route add [prefix] via [gateway] dev [device] [additional options]

常用参数及解释
prefix:				指定要添加的目标网络或主机。格式为 IP地址/子网掩码长度,例如 192.168.1.0/24 或 0.0.0.0/0(默认路由)。
via [gateway]:		指定路由数据包的下一跳网关 IP 地址。例如 via 192.168.1.1。这是数据包应通过的中间路由器。
dev [device]:		指定要通过的网络设备接口。例如 dev eth0。这用于指示数据包应发送到的物理或虚拟网络接口。
src [source-address]:	指定用于该路由的数据包的源地址。例如 src 192.168.1.100。这在多源地址环境中非常有用。
metric [value]:		指定路由的优先级(度量值)。度量值越小,优先级越高。用于在多条路由可用时确定使用哪条路由。
table [table_id]:	指定要添加路由的路由表。默认情况下,路由添加到主路由表(table 254)。
scope [scope]:		指定路由的范围。常用范围包括:
	global:			全球范围,适用于整个互联网。
	link:				链路范围,适用于直连网络。
	host:				主机范围,仅适用于特定主机。
proto [protocol]:	指定路由协议。常用协议包括:
	static:	静态路由。
	kernel:	由内核生成的路由。
	boot:		在系统启动时添加的路由。
	dhcp:		由 DHCP 获取的路由。
	onlink:		强制将目标视为直接连接,即使没有相关 ARP 条目。这在某些需要绕过常规 ARP 检查的情况下有用。
	nexthop:	指定多个下一跳以实现负载均衡或冗余。例如:

ip route add 192.168.1.0/24 nexthop via 192.168.1.1 dev eth0 weight 1 nexthop via 192.168.1.2 dev eth1 weight 2
weight:指定每个下一跳的权重,用于流量分配。

示例
添加到特定网络的路由:
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0
将发往 192.168.2.0/24 网络的数据包通过 192.168.1.1 网关,并使用 eth0 接口。


添加默认路由:
ip route add default via 192.168.1.1
将所有未知目的地的数据包发送到 192.168.1.1 网关。


添加主机路由:
ip route add 192.168.1.10/32 dev eth0
将发往 192.168.1.10 的数据包通过 eth0 接口。


添加带度量值的路由:
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0 metric 100
添加到 192.168.2.0/24 网络的路由,度量值为 100。


添加到特定路由表:
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0 table 100
将路由添加到 ID 为 100 的路由表。