技术交流

好好学习,天天向上。

0%

Linux常用操作

RedHat系列配置静态IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# cat  /etc/sysconfig/network-scripts/ifcfg-enp2s0f0 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 重点
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp2s0f0
UUID=65d626bd-d33f-42aa-8180-c6259b552177
DEVICE=enp2s0f0
ONBOOT=yes # 重点
IPADDR=xx.xx.xx.xx # 重点
PREFIX=21 # 重点
GATEWAY=xx.xx.xx # 重点

PS:用nmtui工具也可以,好像还更方便

RedHat系列配置网桥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
RedHat:~ # cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=xx.xx.xx.xx
PREFIX=21
GATEWAY=xx.xx.xx

RedHat:~ # cat /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
BRIDGE=br0

Debian系列配置静态IP

1
2
3
4
5
6
7
8
9
10
# cat  /etc/network/interfaces
auto lo
iface lo inet loopback

auto p1p1 # 重点
iface p1p1 inet static # 重点
address 90.88.31.222 # 重点
netmask 255.255.248.0 # 重点
gateway 90.88.24.1 # 重点
dns-nameservers 8.8.8.8 # 重点

RedHat系列默认进入控制台

1
systemctl set-default multi-user.target

搭建MSYS2环境

1
pacman -S base-devel gcc

配置代理

1
export http_proxy="http://域\\\账户:密码@IP:端口/"

Red Hat更换CentosOS的yum

1
2
3
4
5
6
7
8
9
# 删除原有的yum包管理工具: 
rpm -qa|grep yum|xargs rpm -e --nodeps

# 到于Red Hat对应版本的CentOS源中找到以下包,然后用 rpm -ivh ./yum-* 批量安装
yum-***ver***.centos.noarch.rpm
yum-metadata-parser-***ver***.rpm
yum-plugin-fastestmirror-***ver***.rpm

#将下载yum包管理工具的Repo放到/etc/yum.repos.d中,替换原来CentOS的,记得替文本中的版本参数

火焰图性能分析

perf record 与 report

性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果。

1
2
3
4
perf record -e cpu-clock -g -p 2548
-g 选项是告诉perf record额外记录函数的调用关系
-e cpu-clock 指perf record监控的指标为cpu周期
-p 指定需要record的进程pid

程序运行完之后,perf record会生成一个名为perf.data的文件,如果之前已有,那么之前的perf.data文件会被覆盖
获得这个perf.data文件之后,就需要perf report工具进行查看

1
perf report -i perf.data

使用火焰图展示结果

Flame Graph是开源的,通过这个软件可以将perf record的数据可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 第一步,利用perf抓取进程信息
$sudo perf record -e cpu-clock -g -p 28591
# Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data.

# 第二步
用perf script工具对perf.data进行解析
perf script -i perf.data &> perf.unfold

# 第三步
将perf.unfold中的符号进行折叠:
./stackcollapse-perf.pl perf.unfold &> perf.folded

# 最后生成svg图:
./flamegraph.pl perf.folded > perf.svg

使用自定义版本glibc编译程序的方法

1
gcc xxx.c -Wl,--rpath=/path/to/install/lib -Wl,--dynamic-linker=/path/to/install/lib/ld-linux-x86-64.so.2

备份与恢复磁盘命令

1
2
sudo dd if=/dev/sda | gzip > disk.img.gz
gzip -dc /disk.img.gz | dd of=/dev/sda

CentOS 安装NFS

1
2
3
4
5
6
7
8
9
10
11
12
13
# 服务端客户端
yum install nfs-utils
# 服务端编辑 /etc/exports
/path/to/share *(insecure,rw,sync,no_root_squash,no_all_squash)
/another/path xx.xx.xx.xx/x(insecure,rw,sync,no_root_squash,no_all_squash)
# 服务端启动服务
systemctl --now enable nfs-server

# 客户端
showmount -e xx.xx.xx.xx # 查看共享目录
mount -t nfs xx.xx.xx.xx:/path/to/share /data
# 写进fastb
xx.xx.xx.xx:/path/to/share /data nfs defaults 0 0

RedHat系列支持X转发最小化安装

1
# yum install "@X Window System"

或者

1
# yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-utils

fdisk无损扩容

1
2
3
4
5
6
7
# 卸载目标分区
umount /xxx/mount/point
fdisk /dev/xxx
p # 记录起始和终止扇区位置
d # 删除目标分区
n # 创建新的分区,需要保持起始扇区和p打印保持一致
w

虚拟磁盘镜像扩容

1
2
3
virt-filesystems --long -h --all -a /path/to/old.img # 查看原始虚拟镜像分区
qemu-img create -f qcow2 new.img 128G # 创建新的磁盘镜像文件
virt-resize --expand /dev/sda1 old.img new.img # resize目标分区,扩容到新的磁盘镜像

GCC各种技巧

1
2
void * __builtin_frob_return_addr (void *addr) // 打印出该函数在上N层的返回地址,可以用于调试用户态锁
void * __builtin_frame_address (unsigned int level) // 可以在执行点上N层的栈帧

截断大文件最快的方法

1
2
3
4
5
6
7
8
9
描述:删除大文件的开头几行
举例:FILENAME=输入文件名 LINECOUNT=输入行数; OUTFILENAME="$FILENAME$RANDOM$FILENAME"; dd if=$FILENAME of=$OUTFILENAME bs=$(head -$LINECOUNT $FILENAME |wc -c) skip=1 conv=notrunc iflag=fullblock; mv $OUTFILENAME $FILENAME -f

描述:删除大文件的开头xx字节
举例:FILENAME=输入文件名 BYTECOUNT=输入字节数; OUTFILENAME="$FILENAME$RANDOM$FILENAME"; dd if=$FILENAME of=$OUTFILENAME bs=$BYTECOUNT skip=1 conv=notrunc iflag=fullblock

描述:删除大文件的末尾几行
举例:FILENAME=输入文件名 LINECOUNT=输入行数; dd if=/dev/null of=$FILENAME seek=1 bs=$(($(find $FILENAME -printf "%s")-$(tail -$LINECOUNT $FILENAME |wc -c)))
举例:FILENAME=输入文件名 LINECOUNT=输入行数; dd if=/dev/null of=$FILENAME seek=1 bs=$(($(stat -c%s $FILENAME)- $(tail -$LINECOUNT $FILENAME |wc -c)))

GDB调试fork+exec簇函数下子进程的方法

1
2
3
4
(gdb) set follow-fork-mode child
(gdb) catch exec
(gdb) run # 或者continue
(gdb) b main

下面以调试CentOS自带的qemu-kvm为例

1
2
3
4
5
6
7
8
9
# gdb attach xxxx # 首先attach到libvirtd上
(gdb) b virExec
(gdb) c
# virsh start xxx
(gdb) set follow-fork-mode child # 不能提前设立
(gdb) cat exec
(gdb) c
(gdb) b main
(gdb) c

一种有效阻止服务器被暴力破解的方法(FRP内网穿透模式下无效)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash

# 生成IP封禁脚本
mkdir -p /opt/anti-attack
cat >/opt/anti-attack/anti-attack.sh <<EOF
#!/bin/bash
touch /var/log/anti-attack.log
touch /etc/hosts.allow
touch /etc/hosts.deny
cat /var/log/secure|awk '/Failed/{print \$(NF-3)}'|sort|uniq -c|awk '{print \$2"="\$1;}' > /var/log/anti-attack.log
for i in \`cat /var/log/anti-attack.log\`

do
IP=\`echo \$i|awk -F= '{print \$1}'\`
NUM=\`echo \$i|awk -F= '{print \$2}'\`
if [ \${NUM} -gt 10 ]; then
grep \$IP /etc/hosts.allow /etc/hosts.deny > /dev/null
if [ \$? -gt 0 ];then
echo "sshd:\$IP:deny" >> /etc/hosts.deny
fi
fi
done
EOF
chmod +x /opt/anti-attack/anti-attack.sh

# 设定该脚本定时运行策略
crontab -l 2>&1|grep -v /opt/anti-attack/anti-attack.sh|grep -v 'no\ crontab\ for'>/var/tmp/tmp_modify
echo "00 */1 * * * sh /opt/anti-attack/anti-attack.sh" >> /var/tmp/tmp_modify
crontab /var/tmp/tmp_modify
rm /var/tmp/tmp_modify -f

# 下面的语句将修改ssh默认端口
sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
systemctl restart sshd

RHEL系列修改网口DNS

1
2
3
4
5
6
# 查看网口是否有配置dns
nmcli c s eth0 | grep ipv4.dns
# 修改网口的dns
nmcli c m eth0 ipv4.dns "8.8.8.8 8.8.4.4"
# 将dns信息保存到/etc/resolv.conf
nmcli c up eth0