QA
SSH升级
直接最新版本
为了防止过程出现意外,先安装telnet远程工具
然后按顺序安装升级
- zlib
- openssl
- openssh
telnet
shell
yum -y install telnet-server xinetd
echo "service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no
}" > /etc/xinetd.d/telnet
systemctl enable xinetd --now
# 默认端口22
一般来说不允许root用户登录,所以还需要创建一个其他用户用来登录
shell
useradd temp
passwd temp
yum -y install zlib* pam-* gcc openssl-devel gcc-c++ make
zlib
shell
cd /usr/local/src/
tar zxvf zlib-1.3.tar.gz
cd zlib-1.3
yum install gcc gcc-c++ make -y
./configure --prefix=/usr/local/zlib
make && make install
openssl
shell
cd /usr/local/src/
#解压文件
tar zxvf openssl-3.2.0.tar.gz
cd openssl-3.2.0
#安装相应的前置依赖
yum install -y perl-CPAN perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
./config --prefix=/usr/local/ssl --shared
make && make install
#新注:编译好后需链接相关目录
mv -f /usr/bin/openssl /usr/bin/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf.d/ssl.conf
#查看链接
ldconfig -v
#查看版本
openssl version -a
#路径写入etc/ld.so.conf
echo '/usr/local/ssl/lib64' >> /etc/ld.so.conf
openssh
shell
#备份ssh配置文件
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp -p /usr/sbin/sshd /usr/sbin/sshd.bak
cp -p /usr/bin/ssh /usr/bin/ssh.bak
cp -p /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
cp -p /etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub.bak
#停止ssh服务
systemctl stop sshd
#备份ssh文件
cp -r /etc/ssh /etc/ssh.old
#查询原有ssh包并卸载
rpm -qa | grep openssh
openssh-7.4p1-23.el7_9.x86_64
openssh-clients-7.4p1-23.el7_9.x86_64
openssh-server-7.4p1-23.el7_9.x86_64
#根据查询结果,卸载原有OpenSSH包
yum remove openssh-7.4p1-23.el7_9.x86_64
#再次查看已经没有了
rpm -qa | grep openssh
shell
cd /usr/local/src/
#解压
tar zxvf openssh-9.5p1.tar.gz
cd openssh-9.5p1
#编译安装openssh 指明zlib路径和ssl路径
./configure --prefix=/usr/local/openssh- --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/ssl
make && make install
#ssh允许root登录、需要密码进行验证
echo 'PermitRootLogin yes' >>/usr/local/openssh/etc/sshd_config
echo 'PubkeyAuthentication yes' >>/usr/local/openssh/etc/sshd_config
echo 'PasswordAuthentication yes' >>/usr/local/openssh/etc/sshd_config
#将编译安装的新配置文件 拷贝到原路径下
cp /usr/local/openssh/etc/sshd_config /etc/ssh/sshd_config
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
cp /usr/local/openssh/bin/ssh /usr/bin/ssh
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
cp /usr/local/openssh/etc/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub
#拷贝启动脚本
cp -p contrib/redhat/sshd.init /etc/init.d/sshd
#给sshd添加可执行权限
chmod +x /etc/init.d/sshd
systemctl enable sshd --now
ssh -V
telnet服务禁用:略
glibc升级
shell
sudo yum groupinstall "Development Tools" -y
sudo yum install gcc-c++ glibc-devel -y
- 查看依赖
shell
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.31.tar.gz
tar -zxvf glibc-2.31.tar.gz
cd glibc-2.31/
cat INSTALL | grep -E "newer|later"
* GNU 'make' 4.0 or newer
* GCC 6.2 or newer
building the GNU C Library, as newer compilers usually produce
* GNU 'binutils' 2.25 or later
* GNU 'texinfo' 4.7 or later
* GNU 'bison' 2.7 or later
* GNU 'sed' 3.02 or newer
* Python 3.4 or later
* GDB 7.8 or later with support for Python 2.7/3.4 or later
* GNU 'gettext' 0.10.36 or later
- 升级gcc
shell
wget https://mirrors.aliyun.com/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz
tar axf gcc-9.3.0.tar.gz
cd gcc-9.3.0
./contrib/download_prerequisites
cat /proc/cpuinfo| grep "processor"| wc -l
mkdir build
cd build
../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr
make -j32
make install
gcc -v
- 升级make
shell
wget https://mirrors.aliyun.com/gnu/make/make-4.3.tar.gz
tar axf make-4.3.tar.gz
cd make-4.3
mkdir build
cd build
../configure --prefix=/usr && make -j32 && make install
make -v
- 升级gblic
shell
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.31.tar.gz
cd glibc-2.31/
mkdir build
cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks --disable-werror
make -j32
make install
make localedata/install-locales
ldd --version
ll /lib64/libc.so.6
Docker
代理
- docker单独配置
创建文件
shell
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
文件内容
yaml
[Service]
Environment="HTTP_PROXY=http://10.1.72.80:7897/"
Environment="HTTPS_PROXY=http://10.1.72.80:7897/"
Environment="NO_PROXY=localhost,127.0.0.1,::1,172.29.0.0/16"
重启 Docker
shell
sudo systemctl daemon-reload
sudo systemctl restart docker
- 命令单独代理
shell
https_proxy="http://ip:port" curl -i baidu.com
- docker代理掉线的情况下,需要移除这个配置文件才能正常pull,所以随便映射个端口给docker用
yaml
version: '3'
services:
tinyproxy:
image: dannydirect/tinyproxy
container_name: tinyproxy
ports:
- "7890:8888"
networks:
- net
command: ANY
restart: always
networks:
net:
external: true
- 环境变量配置
bash
export HTTP_PROXY=http://172.19.1.16:7890
export HTTPS_PROXY=http://172.19.1.16:7890
export NO_PROXY="172.0.0.0/24,10.0.0.0/24,localhost,127.0.0.1,.svc,.cluster.local"
时区问题
Ubuntu && Debian
dockerfile
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y \
tzdata \
&& rm -rf /var/lib/apt/lists/*
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& dpkg-reconfigure --frontend noninteractive tzdata
shell
docker run -it iamge date
端口封禁
shell
#只允许10.108.11.178访问容器的1521端口
iptables -I DOCKER-USER ! -s 10.108.11.178 -p tcp --dport 1521 -j DROP
iptables -nL
shell
#永久保存iptables规则
yum install iptables -y && yum install iptables-services -y
systemctl start iptables.service && systemctl enable iptables.service
service iptables save
然后添加docker容器内部的访权限
shell
# 获取网卡的subnet
docker network inspect bridge |grep Subnet
iptables -I DOCKER-USER -p tcp -s 172.17.0.0/16 -j ACCEPT
给容器内部添加静态hosts
yaml
extra_hosts:
- "somehost:50.31.209.229"
容器大小控制
多阶段构建
dockerfile
# 第一阶段:构建应用
FROM golang:1.20-alpine AS builder
# 设置工作目录
WORKDIR /app
# 将源代码复制到容器中
COPY . .
# 下载依赖并构建应用程序
RUN go mod tidy && go build -o myapp .
# 第二阶段:生成最终镜像
FROM alpine:3.18
# 创建应用运行所需的目录
WORKDIR /app
# 从构建阶段复制生成的二进制文件到当前镜像
COPY --from=builder /app/myapp .
# 运行应用
CMD ["./myapp"]
swap
swappiness
swappiness
参数控制了内核将内存中的数据移到 swap 空间的频率。这个参数的值介于 0 到 100 之间:
- 0 表示尽可能避免使用 swap,将更多数据保存在内存中。
- 100 表示更频繁地使用 swap,即使内存尚未耗尽。
shell
# 临时更改(直到系统重启为止)
sudo sysctl vm.swappiness=10
# 永久更改
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 查看当前值
cat /proc/sys/vm/swappiness
开启关闭
如果你想将现有 swap 分区或文件中的数据重新加载到内存中,可以通过以下步骤进行:
- 关闭 Swap:
plain
sudo swapoff -a
- 检查 Swap 内容是否写入 RAM:
swapoff
命令会尝试将 swap 中的数据重新加载到 RAM 中。你可以使用free -m
来检查 swap 是否已清空,内存使用是否有所增加。 - 重新启用 Swap(如果需要):
plain
sudo swapon -a
OOM
1. 查看系统日志文件
CentOS 系统的日志通常保存在 /var/log/
目录下。你可以查看相关的日志文件来获取有关内存不足和系统重启的详细信息。
- dmesg 日志:
dmesg
命令用于显示内核的环形缓冲区日志,包含内核启动过程中的信息,包括内存错误或 OOM(Out-Of-Memory)相关的信息。
plain
dmesg | grep -i oom
这将搜索是否有 OOM killer 被触发的记录,如果系统因内存不足自动终止进程或重启,通常会有类似的日志。
- /var/log/messages: 该文件包含了系统的各种日志,包括内存错误和系统崩溃的信息。
plain
grep -i oom /var/log/messages
如果系统因为内存不足而重启,相关的日志也通常会出现在这里。
- /var/log/syslog: 在一些系统中,
/var/log/syslog
也会包含系统日志。你可以搜索 OOM 或内存错误相关的条目。
plain
grep -i oom /var/log/syslog
- /var/log/boot.log: 这个文件包含了系统启动时的详细日志,查看是否有启动时的内存问题。
plain
cat /var/log/boot.log
2. 使用 journalctl
查看日志
如果你的 CentOS 系统启用了 systemd
,你可以使用 journalctl
命令查看系统日志。这比传统的日志文件更为强大和灵活。
- 查看所有日志:
plain
journalctl
- 查看最近的内存相关日志:
plain
journalctl -k | grep -i oom
-k
参数表示只查看内核日志,其中会包含内存、CPU 和硬件相关的错误信息。
- 查看日志的时间范围:
plain
journalctl --since "2024-11-01" --until "2024-11-05"
这会显示指定日期范围内的所有日志。
3. 查看 OOM Killer 事件
OOM Killer 事件是内存不足时触发的进程杀死机制。你可以通过 dmesg
或 journalctl
查看这类事件:
bash
dmesg | grep -i "Out of memory"
或者使用 journalctl
:
shell
journalctl | grep -i "Out of memory"
如果你看到类似以下的日志条目,表示 OOM Killer 已经被触发:
plain
Out of memory: Kill process 12345 (myapp) score 123 or sacrifice child
Killed process 12345 (myapp) total-vm:123456kB, anon-rss:12345kB, file-rss:12345kB
4. 查看重启日志
如果系统因内存问题重启,查看重启日志也是很有帮助的。你可以通过以下命令查看系统的重启历史记录:
plain
last reboot
GPU
shell
yum -y install epel-release
yum -y install gcc binutils wget
yum -y install kernel-devel
# 禁用Nouveau,无信息输出表示已被禁用无需在操作以下步骤;
lsmod | grep nouveau
echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist.conf
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut /boot/initramfs-$(uname -r).img $(uname -r)
reboot
# 检查是否关闭
lsmod | grep nouveau
yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
yum -y install nvidia-detect
nvidia-detect -v
wget https://us.download.nvidia.cn/XFree86/Linux-x86_64/450.80.02/NVIDIA-Linux-x86_64-450.80.02.run
chmod +x NVIDIA-Linux-x86_64-450.80.02.run
sh ./NVIDIA-Linux-x86_64-450.80.02.run -s --no-x-check