============
== 白菜 ==
============
一个勤奋的代码搬运工!

从 Debian 12 升级到 Debian 13

debian

在进行重大版本升级之前,务必备份所有重要数据。尽管升级过程通常很稳定,但硬件故障或配置错误等意外情况可能会导致数据丢失。

以下是将Debian 12 (Bookworm) 升级到Debian 13 (Trixie) 的详细步骤。

备份

在开始升级之前,请务必创建一个完整的系统备份,包括:

所有重要数据和个人文件 (/home 目录)。

系统配置文件 (/etc 目录)。

已安装软件包的列表。您可以使用以下命令生成一个列表:

Bashsudo dpkg --get-selections '*' > ~/installed-packages.list

第一步 升级现有系统

apt update 
apt upgrade
apt autoremove
apt clean

第二步 修改软件源列表

sed -i 's/bookworm/trixie/g' /etc/apt/sources.list

第三步 升级

#更新软件包索引
apt update
#最小系统升级
apt upgrade --without-new-pkgs
#完整系统升级
apt full-upgrade
#清理和重启
apt --purge autoremove
reboot
#新的系统对于source.list的内容做了结构上的更新,使得格式更加易读了。可用如下的命令更新 source.list
#此命令可以将原有的source.list做个备份--source.list.bak, 可以放心更新
sudo apt modernize-sources

确认系统版本

root@debian ~ # cat /etc/debian_version 
13.0
root@debian ~ # lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 13 (trixie)
Release:        13
Codename:       trixie
root@debian ~ # uname -a
Linux debian 6.12.35+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.35-1 (2025-07-03) x86_64 GNU/Linu

如果您在升级过程中遇到任何问题,可以查阅Debian官方的升级指南获取更详细的信息和故障排除帮助 官方文档

Read more...

在命令行 ssh 时按 <kbd>TAB</kbd> 自动补全主机名

技术分享 ssh zsh

Zsh + Oh My Zsh

必须是 zsh 或者 bash,并且补全脚本已经生效

echo $SHELL
echo $0
  • 输出 /bin/zsh 或 zsh → 正确
  • 输出 bash → 需要用 bash 的补全方法(和 zsh 不同)

确认 oh-my-zsh 已安装。

~/.zshrc 里启用插件:

plugins=(git ssh)

确认 zsh 补全系统已经启用

zsh 的补全系统必须加载:

autoload -Uz compinit
compinit

在 ~/.zshrc 中通常 Oh My Zsh 已经自动加载,但如果手动配置过可能没生效。

重新加载 ~/.zshrc

source ~/.zshrc

然后输入测试:

ssh db<TAB>

就会自动补全到 .ssh/config 里的 db1、db2。

访问世界上每一个经纬度为整数的交叉点

拍照 经纬度

该项目的目标是访问世界上每一个经纬度为整数的交叉点,并在每个地点拍照记录。 目前中国的进度是 429/978,平原地区的交叉点基本上被记录完毕了,剩下的都是难啃的骨头。

the Degree Confluence Project: https://confluence.org

测试服务器能否正常收发邮件

技术分享 mail telnet

需要收发邮件的话,要注意商家是否开放25端口

发邮件

使用

telnet smtp.qq.com 25

显示:

telnet smtp.qq.com 25
Trying 43.129.255.54...

则无法使用。

显示:

telnet smtp.qq.com 25
Trying 43.129.255.54...
Connected to smtp.qq.com.
Escape character is '^]'.
220 newxmesmtplogicsvrszc5-0.qq.com XMail Esmtp QQ Mail Server.

则可以正常使用。

使用gmail进行测试也是类似的:

telnet smtp.gmail.com 25           
Trying 172.253.117.109...
Connected to smtp.gmail.com.
Escape character is '^]'.
220 smtp.gmail.com ESMTP ca40-20020a056a0206a800b005897bfc2ed3sm7618602pgb.93 - gsmtp

当然,现在Gmail 推荐使用 TLS/SSL 连接,所以也要测试465:

telnet smtp.gmail.com 465

显示:

telnet smtp.gmail.com 465

Trying 173.194.174.108...
Connected to smtp.gmail.com.
Escape character is '^]'.

正常,超时则无法发送。

收邮件

telnet pop.gmail.com 995

显示:

Read more...

Nginx 出现 Too many open files 错误与修复

技术分享 nginx

最近服务器遭遇间歇性流量攻击,服务器负载不高,却出现无法打开的情况,查看nginx错误日志,出现大量的“Too many open files”错误,大致意思就是说nginx无法打开更多的文件。

出现这个错误可能是由于系统的ulimit限制和nginx自身的配置有关系。

什么是ulimit?

ulimit命令用来限制系统用户对shell资源的访问。

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

简单来说,ulimit描述符可以对用户打开的文件数量进行限制(不止限制打开文件数量),让单个用户不至于打开较多的文件,导致系统奔溃或者资源不足的情况。 查看ulimit

既然知道了ulimit是做什么的,首先要先知道系统底层限制到底是多少,ulimit的参数如下:

-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

由于上述nginx错误是无法打开过多的文件,那么我们直接使用ulimit -n查看同一时间最多可开启的文件数。

ulimit -n

可以看出限制的1024个文件,这就导致nginx尝试打开更多的文件(超出1024个)的时候出现错误“Too many open files”

修复问题

修改ulimit限制

直接执行命令ulimit -n 65535修改打开文件数,65535指的是需要同一时间最多打开多少个文件,请根据自身情况适当修改。

ulimit命令修改只对当前的shell有效,退出后失效,如果需要永久生效,需要修改/etc/security/limits.conf这个文件,在底部加入下面的配置:

* soft nproc 65535
* hard nproc 65535
* soft nofile 65535 
* hard nofile 65535
    *:代表全局
    soft:代表软件
    hard:代表硬件
    nproc:是代表最大进程数
    nofile:是代表最大文件打开数

修改完毕后,再次执行命令:ulimit -n可以看到设置已经生效!

Read more...

Debian12 系统添加多个IP

ifconfig networking

对于使用 传统的 ifconfig 配置的系统(例如老版本的Ubuntu、Debian等),直接修改 /etc/network/interfaces 文件。

编辑配置文件:

sudo nano /etc/network/interfaces

添加多个IP地址:

在相应的网络接口下添加多个IP地址。例如:

iface enp30 inet static
    address 192.168.0.250
    netmask 255.255.255.0
    gateway 192.168.0.1

iface enp30 inet static
    address 192.168.0.251
    netmask 255.255.255.0

重启网络服务:

保存文件并退出后,重启网络服务:

sudo systemctl restart networking

检查配置

通过以下命令验证多IP地址是否已成功添加:

ip addr show enp30

这将显示 enp30 接口的所有IP地址。你应该能看到你配置的多个IP地址。

临时配置多个IP地址

为 enp30 接口添加一个新的IP 192.168.0.251 执行以下命令: ip addr add 192.168.0.251/24 dev enp30 这操作是临时的,重启后会丢失。

linux测试url的访问速度

Shell脚本 linux curl

使用curl命令来测试URL的访问速度。

以下是使用curl测试URL访问速度的步骤:

  • 打开终端或命令行界面。
  • 输入以下命令:
	curl -o /dev/null -s -w "time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_pretransfer: %{time_pretransfer}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n" <URL>

请将<URL>替换为要测试的URL地址。

执行命令后,curl将会发送请求并返回一些关于请求的统计信息,包括以下内容:

  • time_namelookup:DNS解析耗时,即将URL解析为IP地址的时间。
  • time_connect:建立TCP连接的耗时。
  • time_pretransfer:从开始到传输开始之前的耗时。
  • time_starttransfer:从开始到第一个字节接收完成的耗时。
  • time_total:总耗时,即从开始到请求完成的时间。

这些时间单位都以秒为单位。

通过这些统计信息,你可以了解到URL的访问速度和各个阶段的耗时情况。

Giffgaff 打开 wificall 的操作步骤及分流规则

WifiCall Giffgaff

打开wificall的好处:可以使用英国本地资费,免费接电话。

ios:需要运营商刷到58.0版本,或者ios17.4以上版本

  • 关闭wifi和wificall开关
  • 打开飞行模式
  • 关闭你的国内运营商
  • 打开你的wifi
  • 全局连接英国节点,或走规则
  • 打开giffgaff的wificall开关,正常就可以连接上了,成功为运营商名字变成giffgaff
  • 可以解除飞行模式和正常打开你的国内运营商了

安卓:origin os系统

  • 打开wificall开关
  • 全局连接英国节点,或走规则
  • 正常就可以直接连上wificall

分流规则

# 地区检测
DOMAIN-SUFFIX, gspe1-ssl.ls.apple.com
# 沃达丰
DOMAIN-SUFFIX, epdg.epc.mnc015.mcc234.pub.3gppnetwork.org
DOMAIN-SUFFIX, ss.epdg.epc.mnc015.mcc234.pub.3gppnetwork.org
DOMAIN-SUFFIX, ss.epdg.epc.geo.mnc015.mcc234.pub.3gppnetwork.org
DOMAIN-SUFFIX, entsrv-uk.vodafone.com
DOMAIN-SUFFIX, vuk-gto.prod.ondemandconnectivity.com
IP-CIDR,88.82.0.0/19
# CMLinkUK EE
IP-CIDR,46.68.0.0/17
# Giffgaff
IP-CIDR,87.194.0.0/16

  # 地区检测
  - 'DOMAIN-SUFFIX,gspe1-ssl.ls.apple.com,WifiCall'
  # 沃达丰
  - 'DOMAIN-SUFFIX,epdg.epc.mnc015.mcc234.pub.3gppnetwork.org,WifiCall'
  - 'DOMAIN-SUFFIX,ss.epdg.epc.mnc015.mcc234.pub.3gppnetwork.org,WifiCall'
  - 'DOMAIN-SUFFIX,ss.epdg.epc.geo.mnc015.mcc234.pub.3gppnetwork.org,WifiCall'
  - 'DOMAIN-SUFFIX,entsrv-uk.vodafone.com,WifiCall'
  - 'DOMAIN-SUFFIX,vuk-gto.prod.ondemandconnectivity.com,WifiCall'
  - 'IP-CIDR,88.82.0.0/19,WifiCall,no-resolve'
  # CMLinkUK EE
  - 'IP-CIDR,46.68.0.0/17,WifiCall,no-resolve'
  # Giffgaff
  - 'IP-CIDR,87.194.0.0/16,WifiCall,no-resolve'  

节点需要支持UDP!!! wificall走的UDP的500和4500端口

Docker本地镜像的导出、导入 (export,import,save,load)

Docker

对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。

一、使用 export 和 import

1,查看本机的容器

使用 docker ps -a 命令查看本机所有的容器。

2,导出镜像

(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。

docker export 镜像ID > server.tar

(2)上面命令执行后,可以看到文件已经保存到当前的终端目录下。

3,导入镜像

(1)使用 docker import 命令则可将这个镜像文件导入进来。

docker import - new_server < server.tar

(2)执行 docker images 命令可以看到镜像确实已经导入进来了。

二、使用 save 和 load

1,查看本机的容器

这两个命令是通过镜像来保存、加载镜像文件的。首先我们使用 docker images 命令查看本机所有的镜像。

2,保存镜像

(1)下面使用 docker save 命令根据 ID 将镜像保存成一个文件。

docker save 镜像ID > server.tar

(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgres 和 mongo 打包:

docker save -o images.tar postgres mongo

Read more...

Go语言进制以及进制转换

编程学习 Golang

二进制 0B或者0b 表示

var bin1 = 0b1101
package main

import "fmt"

func main(){
	var num01 int = 0b1100
	fmt.Printf("%b的十进制为%d", num01,num01)
}

八进制 0O或者0o 表示

var oct = 0o1234567
package main

import "fmt"

func main(){
	var num01 int = 0o10
	fmt.Printf("%o的十进制为%d", num01,num01)
}

十六进制 0X或者0x 表示

var hex = 0x1234
package main

import "fmt"

func main(){
	var num01 int = 0xf
	fmt.Printf("%x的十进制为%d", num01,num01)
}

进制转换

1. 二进制转八进制  %b -> %o
2. 二进制转十进制  %b ->  %d
3. 二进制转十六进制 %b -> %x
4. 八进制转二进制 %o -> %b
5. 八进制转十进制 %o -> %d
6. 八进制转十六进制 %o -> %x
7. 十进制转二进制 %d -> %b
8. 十进制转八进制 %d -> %o
9. 十进制转十六进制 %d -> %x
10. 十六进制转二进制 %x -> %b
11. 十六进制转八进制 %x -> %o
12. 十六进制转十进制 %x -> %d

// 例
fmt.Printf("十进制%d转成八进制%o",num1,num2)
%b    表示为二进制
%c    该值对应的unicode码值
%d    表示为十进制
%o    表示为八进制
%q    该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x    表示为十六进制,使用a-f
%X    表示为十六进制,使用A-F
%U    表示为Unicode格式:U+1234,等价于"U+%04X"
%E    用科学计数法表示
%f    用浮点数表示

快速测试 go.dev/play

Read more...
1 of 9 Next Page