使用 fdisk 或 parted 把第二块硬盘分区并挂载

<p>系统环境: Debian13</p> <h3 id="使用-fdisk-分区">使用 fdisk 分区</h3> <p>先确认:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>fdisk -l </span></span></code></pre></div><p>如果能正常输出,就可以用 <code>fdisk</code>。</p> <p>进入分区工具:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>fdisk /dev/vdb </span></span></code></pre></div><p>依次输入:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>g # 创建新的 GPT 分区表 </span></span><span style="display:flex;"><span>n # 新建分区 </span></span><span style="display:flex;"><span>&lt;回车&gt; # 分区号,默认 1 </span></span><span style="display:flex;"><span>&lt;回车&gt; # 起始位置,默认 </span></span><span style="display:flex;"><span>&lt;回车&gt; # 结束位置,默认(使用整个磁盘) </span></span><span style="display:flex;"><span>w # 保存退出 </span></span></code></pre></div><p>完成后会生成:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>/dev/vdb1 </span></span></code></pre></div><p>查看确认:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>lsblk </span></span></code></pre></div><p>应该能看到类似:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>vdb 500G </span></span><span style="display:flex;"><span>└─vdb1 500G </span></span></code></pre></div><hr> <h3 id="使用-parted-分区">使用 parted 分区</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>parted /dev/vdb --script mklabel gpt </span></span><span style="display:flex;"><span>parted /dev/vdb --script mkpart primary ext4 0% 100% </span></span></code></pre></div><p>得到:</p> <pre tabindex="0"><code>/dev/vdb1 </code></pre><hr> <h3 id="然后格式化">然后格式化</h3> <p>例如 ext4:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkfs.ext4 /dev/vdb1 </span></span></code></pre></div><hr> <h3 id="挂载">挂载</h3> <p>例如:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir -p /data </span></span><span style="display:flex;"><span>mount /dev/vdb1 /data </span></span></code></pre></div><p>查看:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>df -h </span></span></code></pre></div><p>应该能看到:</p> <pre tabindex="0"><code>/dev/vdb1 500G ... /data </code></pre><hr> <h3 id="设置开机自动挂载">设置开机自动挂载</h3> <p>查看 UUID:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>blkid /dev/vdb1 </span></span></code></pre></div><p>例如:</p> <pre tabindex="0"><code>UUID=&#34;12345678-xxxx-xxxx&#34; </code></pre><p>编辑:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>nano /etc/fstab </span></span></code></pre></div><p>加入:</p> <pre tabindex="0"><code class="language-fstab" data-lang="fstab">UUID=12345678-xxxx-xxxx /data ext4 defaults,nofail 0 2 </code></pre><p>然后测试:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mount -a </span></span></code></pre></div><p>没有报错即可。</p> <hr>

2026/7/1
阅读更多

SSH 配置安全加固

<p>环境: Debian 13 配置文件 <code>/etc/ssh/sshd_config</code></p> <h3 id="额外配置">额外配置</h3> <pre tabindex="0"><code class="language-conf" data-lang="conf">Include /etc/ssh/sshd_config.d/*.conf </code></pre><p>会加载该目录下的所有 .conf 文件,优先级可能覆盖主配置(后加载的生效)</p> <h3 id="修改配置项">修改配置项</h3> <pre tabindex="0"><code class="language-conf" data-lang="conf">#允许 root 登录,但禁止使用密码,只能用 SSH 密钥登录 PermitRootLogin prohibit-password #每个连接最多尝试 3 次认证 MaxAuthTries 3 #启用 SSH key 登录 PubkeyAuthentication yes #禁用密码登录 PasswordAuthentication no #禁止空密码 PermitEmptyPasswords no </code></pre><h3 id="加载配置">加载配置</h3> <p><strong>在让配置生效前,务必先开一个 SSH 窗口测试登录,确认能正常登录后,再关闭旧连接。</strong></p> <p>不会断开当前 SSH 连接</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl reload ssh </span></span></code></pre></div><p>或</p> <p>直接重启ssh服务(可能断连)</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl restart ssh </span></span></code></pre></div><p>在执行 <code>reload/restart</code> 前先检查:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sshd -t </span></span></code></pre></div><p>如果配置正确,不会有任何输出。</p>

2026/4/21
阅读更多

为 Docker 容器加入 IPv6 网络

<p>环境: debian12</p> <h3 id="启用-docker-daemon-ipv6-支持">启用 Docker daemon IPv6 支持</h3> <p>编辑 <code>/etc/docker/daemon.json</code>,添加 IPv6 配置:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ </span></span><span style="display:flex;"><span> <span style="color:#f92672">&#34;ipv6&#34;</span>: <span style="color:#66d9ef">true</span>, </span></span><span style="display:flex;"><span> <span style="color:#f92672">&#34;fixed-cidr-v6&#34;</span>: <span style="color:#e6db74">&#34;2001:db8:2::/64&#34;</span> </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><p>然后重启 Docker:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl restart docker </span></span></code></pre></div><blockquote> <p>⚠️ <code>fixed-cidr-v6</code> 必须指定一个 IPv6 子网,不然 Docker 不会给容器分配 IPv6。</p></blockquote> <hr> <h3 id="创建支持-ipv6-的自定义网络">创建支持 IPv6 的自定义网络</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker network create <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --driver bridge <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --subnet 172.19.0.0/16 <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --gateway 172.19.0.1 <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --ipv6 <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --subnet 2001:db8:2::/64 <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> --gateway 2001:db8:2::1 <span style="color:#ae81ff">\ </span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span> myip_v6 </span></span></code></pre></div><ul> <li><code>--ipv6</code> → 开启 IPv6</li> <li><code>--subnet</code> / <code>--gateway</code> → IPv4</li> <li><code>--subnet-ipv6</code> / <code>--gateway-ipv6</code> → IPv6 子网</li> </ul> <p>如果你看到 <code>unknown flag</code>,说明你的 Docker <strong>版本不支持在命令行直接指定 IPv6 子网</strong>。</p> <hr> <h4 id="旧版本-docker-可以这样操作">旧版本 Docker 可以这样操作:</h4> <ol> <li><strong>先启用 daemon IPv6</strong>(上一步)</li> <li><strong>创建网络时只用 <code>--ipv6</code></strong>,Docker 会自动分配 IPv6:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker network create --driver bridge --ipv6 myip_v6 </span></span></code></pre></div><ol start="3"> <li>查看 IPv6 分配:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker network inspect myip_v6 </span></span></code></pre></div><ul> <li>Docker 会在网络里给每个容器分配 <code>GlobalIPv6Address</code></li> <li>如果需要特定子网,必须升级 Docker</li> </ul> <h3 id="临时生效-把当前运行的容器加入网络">临时生效: 把当前运行的容器加入网络</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker network connect myip_v6 mycontainer </span></span></code></pre></div><h3 id="长期生效-在-docker-composeyml-中添加">长期生效: 在 docker-compose.yml 中添加</h3> <p>如果你希望每次用 <code>docker-compose up</code> 都自动连接 IPv6 网络,需要修改 <code>docker-compose.yml</code>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">version</span>: <span style="color:#e6db74">&#34;3.9&#34;</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">services</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">myservice</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">image</span>: <span style="color:#ae81ff">your_image</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">networks</span>: </span></span><span style="display:flex;"><span> - <span style="color:#ae81ff">myip</span> </span></span><span style="display:flex;"><span> - <span style="color:#ae81ff">myip_v6 </span> <span style="color:#75715e"># 添加 IPv6 网络</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">networks</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">myip</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">driver</span>: <span style="color:#ae81ff">bridge</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">myip_v6</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">external</span>: <span style="color:#66d9ef">true</span> <span style="color:#75715e"># 使用你已经创建的 IPv6 网络</span> </span></span></code></pre></div><ul> <li><code>external: true</code> → 表示使用已经存在的 Docker 网络,不让 compose 创建新网络</li> <li>这样启动容器时就自动连接 IPv6 网络,不用每次手动执行 <code>docker network connect</code></li> </ul>

2026/3/9
阅读更多

卸载腾讯云的云监控组件 sgagent、barad_agent、YDService

<p>相关云监控的进程分别是<code>sgagent</code>,<code>barad_agent</code>和<code>YDService</code></p> <h3 id="删除云监控插件">删除云监控插件</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/usr/local/qcloud/stargate/admin/uninstall.sh </span></span><span style="display:flex;"><span>/usr/local/qcloud/YunJing/uninst.sh </span></span><span style="display:flex;"><span>/usr/local/qcloud/monitor/barad/admin/uninstall.sh </span></span></code></pre></div><h3 id="删除自动化助手">删除自动化助手</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo wget -qO - https://tat-1258344699.cos.accelerate.myqcloud.com/tat_agent/uninstall.sh | sudo sh </span></span></code></pre></div><p>或</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl stop tat_agent </span></span><span style="display:flex;"><span>systemctl disable tat_agent </span></span><span style="display:flex;"><span>rm -f /etc/systemd/system/tat_agent.service </span></span><span style="display:flex;"><span>rm -rf /usr/local/qcloud </span></span></code></pre></div><h3 id="检查-agent-进程是否还在">检查 agent 进程是否还在</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ps -A | grep agent </span></span></code></pre></div><p>如果执行后没有任何显示,说明已经清理干净</p> <h3 id="删除自启">删除自启</h3> <p>进入服务器 <code>/etc/rc.d/rc.local</code> 目录,删除所有<code>/usr/local/qcloud/</code>路径的信息。</p> <h3 id="官方文档">官方文档</h3> <pre tabindex="0"><code>云监控:https://cloud.tencent.com/document/product/248/53584 YDService :https://cloud.tencent.com/document/product/296/9928 自主化助手:https://cloud.tencent.com/document/product/1340/50822 </code></pre>

2025/12/31
阅读更多

当 PostgreSQL 查询占用 CPU 很高时,找出是谁在吃 CPU

<h3 id="找出是谁在吃-cpu">找出「是谁」在吃 CPU</h3> <h4 id="查看当前正在跑的高-cpu-查询">查看当前正在跑的高 CPU 查询</h4> <pre tabindex="0"><code>SELECT pid, usename, datname, state, now() - query_start AS running_time, wait_event_type, wait_event, query FROM pg_stat_activity WHERE state = &#39;active&#39; ORDER BY running_time DESC; </code></pre><p>重点关注: running_time 很长的 query 是否是复杂 SELECT 是否反复出现同一条 SQL</p> <h4 id="看耗-cpu-的-sql">看耗 CPU 的 SQL</h4> <p>如果开启了 pg_stat_statements</p> <p>查总 CPU 消耗最高:</p> <pre tabindex="0"><code>SELECT query, calls, total_exec_time, mean_exec_time, rows FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10; </code></pre><p>查单次最慢:</p> <pre tabindex="0"><code>SELECT query, max_exec_time, calls FROM pg_stat_statements ORDER BY max_exec_time DESC LIMIT 10; </code></pre><p>查调用次数最多</p> <pre tabindex="0"><code>SELECT query, calls FROM pg_stat_statements ORDER BY calls DESC LIMIT 10; </code></pre><h4 id="检查连接数">检查连接数</h4> <p><code>SELECT count(*) FROM pg_stat_activity;</code></p> <h4 id="看当前正在跑的-sql">看当前正在跑的 SQL</h4> <pre tabindex="0"><code>SELECT pid, now() - query_start AS runtime, state, query FROM pg_stat_activity WHERE state = &#39;active&#39; ORDER BY runtime DESC; </code></pre><h4 id="系统确认-cpu-高--io-高">系统确认 CPU 高 ≠ I/O 高</h4> <pre tabindex="0"><code>SELECT datname, blks_read, blks_hit FROM pg_stat_database; </code></pre><p><code>blks_hit</code> 高 → CPU 计算型 <code>blks_read</code> 高 → I/O 型问题</p> <h4 id="是否有-autovacuum-问题">是否有 autovacuum 问题</h4> <pre tabindex="0"><code>SELECT relname, n_dead_tup FROM pg_stat_user_tables ORDER BY n_dead_tup DESC; </code></pre><p>死元组多: 查询变慢 CPU 增高</p> <h3 id="启用-pg_stat_statements-扩展">启用 pg_stat_statements 扩展</h3> <p>docker-compose</p> <pre tabindex="0"><code>services: db_postgres: image: postgres:18 command: - &#34;postgres&#34; - &#34;-c&#34; - &#34;shared_preload_libraries=pg_stat_statements&#34; - &#34;-c&#34; - &#34;pg_stat_statements.max=10000&#34; - &#34;-c&#34; - &#34;pg_stat_statements.track=all&#34; </code></pre><p>或者修改 <code>/var/lib/postgresql/data/postgresql.conf</code> 加入:</p> <pre tabindex="0"><code>shared_preload_libraries = &#39;pg_stat_statements&#39; pg_stat_statements.max = 10000 pg_stat_statements.track = all </code></pre><h4 id="在数据库里创建扩展">在数据库里创建扩展</h4> <pre tabindex="0"><code>CREATE EXTENSION IF NOT EXISTS pg_stat_statements; </code></pre><p>验证是否成功:</p> <pre tabindex="0"><code>SELECT count(*) FROM pg_stat_statements; </code></pre><p>如果有数字结果 → 成功</p> <pre tabindex="0"><code>-- ===================================== -- 📊 PostgreSQL Top 10 SQL 分析模板 -- 时间单位:秒 (s) -- ===================================== SELECT query, calls AS execution_count, total_exec_time / 1000.0 AS total_time_sec, -- 总耗时(秒) mean_exec_time / 1000.0 AS avg_time_sec, -- 平均耗时(秒) max_exec_time / 1000.0 AS max_time_sec, -- 单次最大耗时(秒) rows AS total_rows_returned FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10; </code></pre><pre><code>字段解释 字段 含义 query SQL 文本 execution_count SQL 被调用次数 total_time_sec SQL 总耗时,秒为单位 avg_time_sec SQL 平均执行时间,秒为单位 max_time_sec SQL 单次最大耗时,秒为单位 total_rows_returned SQL 总返回行数 </code></pre> <h3 id="优化建议">优化建议</h3> <h4 id="建立索引可有效应对大部分的耗时查询">建立索引可有效应对大部分的耗时查询</h4> <p>通过 PostgreSQL 内置的系统视图或 <code>\d</code> 命令查看已经创建的索引</p> <p><code>\d 表名</code></p> <h4 id="检查-work_mem">检查 work_mem</h4> <p>如果聚合 + 排序占用 CPU 高,可以调大: <code>SET work_mem = '64MB';</code></p> <h4 id="定期-analyze">定期 ANALYZE</h4> <p><code>ANALYZE 表名;</code></p>

2025/12/20
阅读更多

从 Debian 12 升级到 Debian 13

<p>在进行重大版本升级之前,务必备份所有重要数据。尽管升级过程通常很稳定,但硬件故障或配置错误等意外情况可能会导致数据丢失。</p> <p>以下是将Debian 12 (Bookworm) 升级到Debian 13 (Trixie) 的详细步骤。</p> <h3 id="备份">备份</h3> <p>在开始升级之前,请务必创建一个完整的系统备份,包括:</p> <p>所有重要数据和个人文件 (/home 目录)。</p> <p>系统配置文件 (/etc 目录)。</p> <p>已安装软件包的列表。您可以使用以下命令生成一个列表:</p> <pre tabindex="0"><code>Bashsudo dpkg --get-selections &#39;*&#39; &gt; ~/installed-packages.list </code></pre><h3 id="第一步-升级现有系统">第一步 升级现有系统</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt update </span></span><span style="display:flex;"><span>apt upgrade </span></span><span style="display:flex;"><span>apt autoremove </span></span><span style="display:flex;"><span>apt clean </span></span></code></pre></div><h3 id="第二步-修改软件源列表">第二步 修改软件源列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i <span style="color:#e6db74">&#39;s/bookworm/trixie/g&#39;</span> /etc/apt/sources.list </span></span></code></pre></div><h3 id="第三步-升级">第三步 升级</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#更新软件包索引</span> </span></span><span style="display:flex;"><span>apt update </span></span><span style="display:flex;"><span><span style="color:#75715e">#最小系统升级</span> </span></span><span style="display:flex;"><span>apt upgrade --without-new-pkgs </span></span><span style="display:flex;"><span><span style="color:#75715e">#完整系统升级</span> </span></span><span style="display:flex;"><span>apt full-upgrade </span></span><span style="display:flex;"><span><span style="color:#75715e">#清理和重启</span> </span></span><span style="display:flex;"><span>apt --purge autoremove </span></span><span style="display:flex;"><span>reboot </span></span><span style="display:flex;"><span><span style="color:#75715e">#新的系统对于source.list的内容做了结构上的更新,使得格式更加易读了。可用如下的命令更新 source.list</span> </span></span><span style="display:flex;"><span><span style="color:#75715e">#此命令可以将原有的source.list做个备份--source.list.bak, 可以放心更新</span> </span></span><span style="display:flex;"><span>sudo apt modernize-sources </span></span></code></pre></div><h3 id="确认系统版本">确认系统版本</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>root@debian ~ <span style="color:#75715e"># cat /etc/debian_version </span> </span></span><span style="display:flex;"><span>13.0 </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>root@debian ~ <span style="color:#75715e"># lsb_release -a</span> </span></span><span style="display:flex;"><span>No LSB modules are available. </span></span><span style="display:flex;"><span>Distributor ID: Debian </span></span><span style="display:flex;"><span>Description: Debian GNU/Linux <span style="color:#ae81ff">13</span> <span style="color:#f92672">(</span>trixie<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span>Release: <span style="color:#ae81ff">13</span> </span></span><span style="display:flex;"><span>Codename: trixie </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>root@debian ~ <span style="color:#75715e"># uname -a</span> </span></span><span style="display:flex;"><span>Linux debian 6.12.35+deb13-amd64 <span style="color:#75715e">#1 SMP PREEMPT_DYNAMIC Debian 6.12.35-1 (2025-07-03) x86_64 GNU/Linu</span> </span></span></code></pre></div><p>如果您在升级过程中遇到任何问题,可以查阅Debian官方的升级指南获取更详细的信息和故障排除帮助 <a href="https://www.debian.org/releases/stable/release-notes/upgrading.html#upgrading-the-system">官方文档</a></p>

2025/9/16
阅读更多

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

<p>Zsh + Oh My Zsh</p> <p>必须是 zsh 或者 bash,并且补全脚本已经生效</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo $SHELL </span></span><span style="display:flex;"><span>echo $0 </span></span></code></pre></div><ul> <li>输出 /bin/zsh 或 zsh → 正确</li> <li>输出 bash → 需要用 bash 的补全方法(和 zsh 不同)</li> </ul> <p>确认 oh-my-zsh 已安装。</p> <h3 id="在-zshrc-里启用插件">在 <code>~/.zshrc</code> 里启用插件:</h3> <pre tabindex="0"><code class="language-conf" data-lang="conf">plugins=(git ssh) </code></pre><h3 id="确认-zsh-补全系统已经启用">确认 zsh 补全系统已经启用</h3> <p>zsh 的补全系统必须加载:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>autoload -Uz compinit </span></span><span style="display:flex;"><span>compinit </span></span></code></pre></div><p>在 ~/.zshrc 中通常 Oh My Zsh 已经自动加载,但如果手动配置过可能没生效。</p> <h3 id="重新加载-zshrc-">重新加载 <code>~/.zshrc</code> :</h3> <p>source ~/.zshrc</p> <h3 id="然后输入测试">然后输入测试:</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ssh db&lt;TAB&gt; </span></span></code></pre></div><p>就会自动补全到 <code>.ssh/config</code> 里的 db1、db2。</p>

2025/9/9
阅读更多

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

<p>该项目的目标是访问世界上每一个经纬度为整数的交叉点,并在每个地点拍照记录。 目前<a href="https://confluence.org/country.php?id=28">中国的进度</a>是 429/978,平原地区的交叉点基本上被记录完毕了,剩下的都是难啃的骨头。</p> <p>the Degree Confluence Project: <a href="https://confluence.org">https://confluence.org</a></p>

2025/3/28
阅读更多

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

<p>需要收发邮件的话,要注意商家是否开放25端口</p> <h3 id="发邮件">发邮件</h3> <p>使用</p> <pre tabindex="0"><code>telnet smtp.qq.com 25 </code></pre><p>显示:</p> <pre tabindex="0"><code>telnet smtp.qq.com 25 Trying 43.129.255.54... </code></pre><p>则无法使用。</p> <p>显示:</p> <pre tabindex="0"><code>telnet smtp.qq.com 25 Trying 43.129.255.54... Connected to smtp.qq.com. Escape character is &#39;^]&#39;. 220 newxmesmtplogicsvrszc5-0.qq.com XMail Esmtp QQ Mail Server. </code></pre><p>则可以正常使用。</p> <h3 id="使用gmail进行测试也是类似的">使用gmail进行测试也是类似的:</h3> <pre tabindex="0"><code>telnet smtp.gmail.com 25 Trying 172.253.117.109... Connected to smtp.gmail.com. Escape character is &#39;^]&#39;. 220 smtp.gmail.com ESMTP ca40-20020a056a0206a800b005897bfc2ed3sm7618602pgb.93 - gsmtp </code></pre><p>当然,现在Gmail 推荐使用 TLS/SSL 连接,所以也要测试465:</p> <pre tabindex="0"><code>telnet smtp.gmail.com 465 </code></pre><p>显示:</p> <pre tabindex="0"><code>telnet smtp.gmail.com 465 Trying 173.194.174.108... Connected to smtp.gmail.com. Escape character is &#39;^]&#39;. </code></pre><p>正常,超时则无法发送。</p> <h3 id="收邮件">收邮件</h3> <pre tabindex="0"><code>telnet pop.gmail.com 995 </code></pre><p>显示:</p> <pre tabindex="0"><code>telnet pop.gmail.com 995 Trying 64.233.188.108... Connected to pop.gmail.com. Escape character is &#39;^]&#39;. </code></pre><p>测试:</p> <pre tabindex="0"><code>telnet imap.gmail.com 993 </code></pre><p>显示:</p> <pre tabindex="0"><code>Trying 142.251.8.108... Connected to imap.gmail.com. Escape character is &#39;^]&#39;. </code></pre><p>这两个都要测试,超时则无法收到邮件。</p>

2025/2/23
阅读更多

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

<p>最近服务器遭遇间歇性流量攻击,服务器负载不高,却出现无法打开的情况,查看nginx错误日志,出现大量的“Too many open files”错误,大致意思就是说nginx无法打开更多的文件。</p> <p>出现这个错误可能是由于系统的ulimit限制和nginx自身的配置有关系。</p> <h3 id="什么是ulimit">什么是ulimit?</h3> <p>ulimit命令用来限制系统用户对shell资源的访问。</p> <p>假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。</p> <p>ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。</p> <p>简单来说,ulimit描述符可以对用户打开的文件数量进行限制(不止限制打开文件数量),让单个用户不至于打开较多的文件,导致系统奔溃或者资源不足的情况。 查看ulimit</p> <p>既然知道了ulimit是做什么的,首先要先知道系统底层限制到底是多少,ulimit的参数如下:</p> <pre tabindex="0"><code>-a:显示目前资源限制的设定; -c &lt;core文件上限&gt;:设定core文件的最大值,单位为区块; -d &lt;数据节区大小&gt;:程序数据节区的最大值,单位为KB; -f &lt;文件大小&gt;:shell所能建立的最大文件,单位为区块; -H:设定资源的硬性限制,也就是管理员所设下的限制; -m &lt;内存大小&gt;:指定可使用内存的上限,单位为KB; -n &lt;文件数目&gt;:指定同一时间最多可开启的文件数; -p &lt;缓冲区大小&gt;:指定管道缓冲区的大小,单位512字节; -s &lt;堆叠大小&gt;:指定堆叠的上限,单位为KB; -S:设定资源的弹性限制; -t &lt;CPU时间&gt;:指定CPU使用时间的上限,单位为秒; -u &lt;程序数目&gt;:用户最多可开启的程序数目; -v &lt;虚拟内存大小&gt;:指定可使用的虚拟内存上限,单位为KB。 </code></pre><p>由于上述nginx错误是无法打开过多的文件,那么我们直接使用ulimit -n查看同一时间最多可开启的文件数。</p> <p><code>ulimit -n</code></p> <p>可以看出限制的1024个文件,这就导致nginx尝试打开更多的文件(超出1024个)的时候出现错误“Too many open files”</p> <h3 id="修复问题">修复问题</h3> <h4 id="修改ulimit限制">修改ulimit限制</h4> <p>直接执行命令ulimit -n 65535修改打开文件数,65535指的是需要同一时间最多打开多少个文件,请根据自身情况适当修改。</p> <p>ulimit命令修改只对当前的shell有效,退出后失效,如果需要永久生效,需要修改<code>/etc/security/limits.conf</code>这个文件,在底部加入下面的配置:</p> <pre tabindex="0"><code>* soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535 </code></pre><pre tabindex="0"><code> *:代表全局 soft:代表软件 hard:代表硬件 nproc:是代表最大进程数 nofile:是代表最大文件打开数 </code></pre><p>修改完毕后,再次执行命令:<code>ulimit -n</code>可以看到设置已经生效!</p> <h4 id="修改nginx打开文件限制">修改nginx打开文件限制</h4> <p>修改<code>nginx.conf</code>在 http 和 events 外层加入一行: <code>worker_rlimit_nofile 65535;</code> worker_rlimit_nofile这个参数的含义是:“为nginx工作进程改变打开最多文件描述符数目的限制。用来在不重启主进程的情况下增加限制。”</p> <p>Debian系统 看起来像这样的</p> <pre tabindex="0"><code>user www-data; worker_processes auto; pid /run/nginx.pid; ############################################################################################################### # Must be less than LimitNOFILE for systemd # or /etc/security/limits.conf (non-systemd) # E.g. if LimitNOFILE is 65535, I set to 30000 (systemd) # E.g. if &#34;nginx hard nofile 30000&#34; in the /etc/security/limits.conf, I set to 30000 (non-systemd) ############################################################################################################### worker_rlimit_nofile 30000; #vg include /etc/nginx/modules-enabled/*.conf; events { worker_connections 65535; #vg multi_accept on; #vg } http { ## # Basic Settings ... ..... </code></pre><p>重载nginx配置: <code>nginx -s reload</code></p> <h2 id="nginx的其他优化">Nginx的其他优化</h2> <p>编辑 <code>/etc/sysctl.conf</code> 文件,添加或修改 <code>fs.file-max = 70000</code></p> <p>查看是否生效 <code>sysctl -p</code></p>

2025/2/23
阅读更多

推荐订阅

Cloudflare 官方博客中文版,涵盖安全、AI 和开发者相关内容

美团技术团队最近更新内容。