<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on bugwang</title>
    <link>https://bugwang.cn/posts/</link>
    <description>Recent content in Posts on bugwang</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-ch</language>
    <lastBuildDate>Thu, 14 Aug 2025 17:06:02 +0800</lastBuildDate><atom:link href="https://bugwang.cn/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>好久没写博客了</title>
      <link>https://bugwang.cn/posts/%E5%A5%BD%E4%B9%85%E6%B2%A1%E5%86%99%E5%8D%9A%E5%AE%A2%E4%BA%86/</link>
      <pubDate>Thu, 14 Aug 2025 17:06:02 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/%E5%A5%BD%E4%B9%85%E6%B2%A1%E5%86%99%E5%8D%9A%E5%AE%A2%E4%BA%86/</guid>
      <description>爱你😘</description>
    </item>
    
    <item>
      <title>MySQL常用工具总结</title>
      <link>https://bugwang.cn/posts/mysql%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E6%80%BB%E7%BB%93/</link>
      <pubDate>Thu, 13 Jun 2024 17:27:36 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/mysql%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E6%80%BB%E7%BB%93/</guid>
      <description>MySQL常用工具总结 - mysql -P：指定端口
[mysqld] port=端口号 -e：在终端执行SQL，不用登录，主要用于一些脚本程序
mysql -uroot -p1234 -h127.0.0.1 -P3306 -e&amp;#34;select * from user&amp;#34; db1 - mysqladmin 执行管理操作的工具
# 用法 mysqladmin [OPTIONS] command command.... # 创建库 mysqladmin -uroot -p1234 create db2 # 删除库 mysqladmin -uroot -p1234 drop db2 # 修改密码 mysqladmin -uroot -p1234 password 5678 # 查看更多用法 mysqladmin --help - mysqlshow 客户端对象查看工具
&amp;ndash;count：统计
-i：详细信息
mysqlshow -uroot -p1234 [OPTIONS] [database [table [column]]] - mysqldump -B, &amp;ndash;databases：备份多个数据库
-A, &amp;ndash;all-databases：备份所有数据库
&amp;ndash;add-drop-database：创建库之前，增加删除库语句</description>
    </item>
    
    <item>
      <title>PVE重建 LVM-Thin 精简池</title>
      <link>https://bugwang.cn/posts/pve%E9%87%8D%E5%BB%BA-lvm-thin-%E7%B2%BE%E7%AE%80%E6%B1%A0%E7%BC%A9%E5%B0%8F%E9%BB%98%E8%AE%A4-local-lvm-%E5%AD%98%E5%82%A8/</link>
      <pubDate>Thu, 06 Jun 2024 15:52:37 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/pve%E9%87%8D%E5%BB%BA-lvm-thin-%E7%B2%BE%E7%AE%80%E6%B1%A0%E7%BC%A9%E5%B0%8F%E9%BB%98%E8%AE%A4-local-lvm-%E5%AD%98%E5%82%A8/</guid>
      <description>PVE重建 LVM-Thin 精简池：缩小默认 local-lvm 存储 背景 ProxmoxVE 的默认安装会创建 local 和 local-lvm 两个存储。其中local大约磁盘容量的10%，存储类别为目录。 大部分容量都给到了 local-lvm，也就是存储类别为 lvm-thin 的LVM精简卷。
前置知识： LVM逻辑卷管理器中，lv逻辑卷中还存在thin pool精简池模式，相当于 ESXI 的精简制备（Thin provisioning）； thin pool精简池就是一个存储池，可以在池子的基础再新建lv逻辑卷，也就是thin volume精简卷。
因为考虑空间回收问题，我不想像大多数网上教程一样，把全部存储空间改成目录，下面介绍如何将默认的 local-lvm 存储重建（缩小）。
一条龙命令 #假设你已经有了一个名为 pve 的 LVM 卷组 lvcreate -L 100G -T pve/thinpool lvcreate -V 99G --thin -n thinvolume pve/thinpool #剩下的空间给到目录 lvresize --extents +100%FREE --resizefs pve/root #+100%FREE也可以换成+多少G这种形式。 vim /etc/pve/storage.cfg
lvmthin: thinvolume thinpool thinpool vgname pve content images,rootdir 参考我的命令历史： 一、删除默认thinpool精简池 失败操作 root@pve:~# lvremove /dev/pve/data Removing pool &amp;#34;data&amp;#34; will remove 3 dependent volume(s).</description>
    </item>
    
    <item>
      <title>SSH登录安全与Fail2ban加固</title>
      <link>https://bugwang.cn/posts/ssh%E7%99%BB%E5%BD%95%E5%AE%89%E5%85%A8%E4%B8%8Efail2ban%E5%8A%A0%E5%9B%BA/</link>
      <pubDate>Tue, 04 Jun 2024 12:15:23 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/ssh%E7%99%BB%E5%BD%95%E5%AE%89%E5%85%A8%E4%B8%8Efail2ban%E5%8A%A0%E5%9B%BA/</guid>
      <description>SSH登录安全与Fail2ban加固 查看：SSH暴力破解/爆破次数 RedHat 和 CentOS 存储在 /var/log/secure 1.查看 root 用户登录成功的IP及次数看看是否有不熟悉的 IP 地址 grep &amp;#34;Accepted password for root&amp;#34; /var/log/secure | awk &amp;#39;{print $11}&amp;#39; | sort | uniq -c | sort -nr | more 2.查看尝试暴力破解 root 账户的IP及次数 grep &amp;#34;Failed password for root&amp;#34; /var/log/secure | awk &amp;#39;{print $11}&amp;#39; | sort | uniq -c | sort -nr | more 3.查看尝试暴力破解用户名的IP及次数 grep &amp;#34;Failed password for invalid user&amp;#34; /var/log/secure | awk &amp;#39;{print $13}&amp;#39; | sort | uniq -c | sort -nr | more Debian 和 Ubuntu 存储在 /var/log/auth.</description>
    </item>
    
    <item>
      <title>SQLAlchemy快速上手</title>
      <link>https://bugwang.cn/posts/sqlalchemy%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/</link>
      <pubDate>Tue, 04 Jun 2024 11:22:01 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/sqlalchemy%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/</guid>
      <description>SQLAlchemy 演示插入数据代码
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String from sqlalchemy.orm import sessionmaker #创建对象的基类： Base = declarative_base() #定义User对象： class User(Base): #表的名字： __tablename__ = &amp;#39;user&amp;#39; #表的结构: userid = Column(Integer,primary_key=True) username = Column(String(20)) age = Column(Integer) department = Column(String(20)) #初始化数据库连接 engine = create_engine(&amp;#34;mysql+pymysql://kang:123456@10.3.152.35/test&amp;#34;,encoding=&amp;#34;utf-8&amp;#34;,echo=True) #创建session类型 DBSession = sessionmaker(bind=engine) #创建session对象 session = DBSession() #创建新的user对象 new_user1 = User(username=&amp;#39;CC&amp;#39;,age=25,department=&amp;#39;IT&amp;#39;) new_user2 = User(username=&amp;#34;LILI&amp;#34;,age=30,department=&amp;#39;HR&amp;#39;) new_user3 = User(username=&amp;#39;JOHN&amp;#39;,age=22,department=&amp;#39;IT&amp;#39;) #添加单条数据（添加数据，但还没有提交，出错还可以使用rollback撤回操作） new_user = User(name=&amp;#39;lily&amp;#39;) #session.</description>
    </item>
    
    <item>
      <title>重新理解AsyncIO</title>
      <link>https://bugwang.cn/posts/%E9%87%8D%E6%96%B0%E7%90%86%E8%A7%A3asyncio/</link>
      <pubDate>Tue, 04 Jun 2024 10:17:11 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/%E9%87%8D%E6%96%B0%E7%90%86%E8%A7%A3asyncio/</guid>
      <description>1.概要 python下的协程 asyncio和gevent都是基于携程来进行并发操作的。协程也被称为微线程。 协程只是在单一的线程里进行切换不同的协程，因此无法使用多CPU能力，对于CPU密集型程序还是使用多进程比较好。 协程相比较进程和线程来说占用的内容更少，同样的线程切换更多的是靠操作系统来控制，而协程的执行则由我们自己控制。
并发与异步区分 并发原理：当其中一个协程遇到io等待时，将会切换到另一个协程继续运行。
并发与异步：
并发强调的是N人干同样的事，要保证不争抢 (lock，atomic，synchronize，volatile, cas)
异步强调的是1/N人干不同的事，不该等的别等 (thread pool, future, async,reactive)
看到并发的时候经常会看到异步，原因是一般所说的并发，指的是 【每个业务活动频率很低，但是有大量同时进行的业务活动】 这样用异步代码自己维护每个业务状态，而不劳驾系统通过线程/进程的方式维护每个业务状态的方式，能把这个场景实现得性能更好，内存占用更少。 如果业务活动频率又高，又同时大量进行，那就超出异步的解决范围了。那是分布式处理的范畴。 需要协程原因 1.多线程运行过程容易被打断，有可能出现race condition的情况 2.线程切换本身存在定的消耗，若/0操作非常heavy，多线程很有可能满足不了高效率、高质量的需求。
sync和async的概念区分 sync即同步，指操作个接个地执行，下一个操作必须等上一个操作完成后才能执行。 asynd即异步，指不同的操作可以交替执行，如果其中某个操作被block了，程序并不会等待，而是会找出可执行的操作继续执行。 Asyncio的缺陷 在实际工作中，要想用好Asyncio，必须得有相应的python库支持。在之前的多线程例子中，我们用到的是requests库，而在这里使用的却是aiohttp库，原因就在于requests库与Asyncio不兼容，但aiohttp库兼容。但是兼容问题会随着版本的问题逐步减少。
此外，使用Asyncio使得我们在任务调度方面有更大的自主权，写代码时就得更加注意，否则容易出现错误。
比如，如果你需要await一系列的操作，就得使用asyncio.gather()；如果只是单个的future，则用asyncio.wait()就可以了。那么，对于你的future，是想让它run_until_complete()还是run_forever()呢？此类问题都是在面对具体问题时需要去考虑的。
那么使用asyncio时 如何搭配第三方库 首先，最简单的办法就是搜一下这个库的源码里是否出现了 asyncio 或 async def 的字样，如果没有出现则几乎可以证明这个库没有对 asyncio 有做特别的支持。为了彻底证实，还应仔细阅读其代码，查看关键 I/O 部分是如何实现的。
对于暂不支持 asyncio 的第三方库，可以按以下步骤依次排查：
1. 确认其 I/O 时间比例是否占到大部分。比如用 SQLAlchemy 时，如果能基本上确保数据库操作都是瞬时的，那么[理论上](http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/)是可以任由其阻塞主线程的。而对于明显 I/O 占大多数时间且时间不可预测的，比如 requests，就不能让其成为性能瓶颈； 2. 确认其 I/O 的并发能力是否会成为瓶颈。比如说还是用到了 requests，但平均下来每 10 分钟才会发一个请求，其他时间主要都用在数据库计算上了，那么完全可以把 requests [放到线程池里](https://docs.python.org/3/library/asyncio-eventloop.html#executor)去做； 3. 确实需要异步了，首先查找其 asyncio 的扩展，有时会有单独的库做 asyncio 支持，比如 peewee_async； 4.</description>
    </item>
    
    <item>
      <title>Python终端Debug调试：Pdb</title>
      <link>https://bugwang.cn/posts/python%E7%BB%88%E7%AB%AF%E8%B0%83%E8%AF%95debug%E5%91%BD%E4%BB%A4pdb/</link>
      <pubDate>Mon, 12 Jun 2023 08:57:40 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/python%E7%BB%88%E7%AB%AF%E8%B0%83%E8%AF%95debug%E5%91%BD%E4%BB%A4pdb/</guid>
      <description>使用Pdb模块：breakpoint()方法 程序当中，至少要有一个breakpoint()
在你需要的打断点的位置，加上： breakpoint() 查看调用栈：w | where 显示的是从上到下的 路径/文件.py(括号里是行号) (Pdb) w d:\administrator\projects\pdb_test.py(12)&amp;lt;module&amp;gt;() -&amp;gt; func_obj = func1() &amp;gt; d:\administrator\projects\pdb_test.py(4)func1() -&amp;gt; def inner(value): &amp;#39;&amp;#39;&amp;#39; &amp;gt; 仅右箭头：表示当前frame &amp;#39;&amp;#39;&amp;#39; 切换帧（调整当前帧frame）：u、d u | up d | down (Pdb) u &amp;gt; d:\administrator\projects\pdb_test.py(12)&amp;lt;module&amp;gt;() -&amp;gt; func_obj = func1() (Pdb) w &amp;gt; d:\administrator\projects\pdb_test.py(12)&amp;lt;module&amp;gt;() -&amp;gt; func_obj = func1() d:\administrator\projects\pdb_test.py(4)func1() -&amp;gt; def inner(value): 查看断点附近代码：l、ll l | lst：默认显示附近11行 l . ：回到当前行 ll | longlst：查看当前函数全部代码 (Pdb) l 1 def func1(): 2 data = [] 3 breakpoint() 4 -&amp;gt; def inner(value): 5 data.</description>
    </item>
    
    <item>
      <title>PVE使用华为USB网卡</title>
      <link>https://bugwang.cn/posts/proxmox-ve%E4%BD%BF%E7%94%A8%E5%8D%8E%E4%B8%BAusb%E7%BD%91%E5%8D%A1/</link>
      <pubDate>Sun, 05 Mar 2023 03:07:18 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/proxmox-ve%E4%BD%BF%E7%94%A8%E5%8D%8E%E4%B8%BAusb%E7%BD%91%E5%8D%A1/</guid>
      <description>在winidow中,系统会自动读取随身wifi的window驱动并安装,同时我们可以看到,网卡自带的install_linux文件说明也有linux驱动,遗憾的是,在ubuntu系统上始终无法正确识别,因为ubuntu认为是存储设备,但是又无法检测出usb网卡,因此也无法挂载,所以需要我们自己修改ubuntu.
解决步骤: 插入随身wif,按Ctrl +Alt+t打开终端,输入lsusb,显示目前所有的usb设备 root@pve:~# lsusb Bus 002 Device 002: ID 0bc2:ab24 Seagate RSS LLC Backup Plus Portable Drive Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 174c:55aa ASMedia Technology Inc. ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 001 Device 003: ID 040a:2814 Kodak Co. USB Composite Device Bus 001 Device 002: ID 12d1:1c20 Huawei Technologies Co.</description>
    </item>
    
    <item>
      <title>Rclone从安装到长期挂载服务</title>
      <link>https://bugwang.cn/posts/rclone%E4%BB%8E%E5%AE%89%E8%A3%85%E5%88%B0%E6%8C%82%E8%BD%BD%E9%95%BF%E6%9C%9F%E6%9C%8D%E5%8A%A1/</link>
      <pubDate>Sat, 04 Mar 2023 23:37:09 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/rclone%E4%BB%8E%E5%AE%89%E8%A3%85%E5%88%B0%E6%8C%82%E8%BD%BD%E9%95%BF%E6%9C%9F%E6%9C%8D%E5%8A%A1/</guid>
      <description>安装 Linux Rclone官方提供了一键安装脚本： curl https://rclone.org/install.sh | bash apt install -y fuse3 Win scoop install rclone #cd C:\Users\Administrator\scoop\apps\rclone #dir 配置 第一次配置 在终端输入 rclone config 进行配置
rclone config - 进入交互式配置选项，进行添加、删除、管理网盘等操作。
详细操作参见：《Rclone 安装配置教程》
再次重复配置 备份 rclone config file - 显示配置文件的路径，一般配置文件在 ~/.config/rclone/rclone.conf
rclone config show - 显示配置文件内容，复制备份
恢复 mkdir -p ~/.config/rclone cat &amp;gt; ~/.config/rclone/rclone.conf &amp;lt;&amp;lt;EOF 《rclone.conf配置文件内容》 EOF 指定rclone配置文件启动 默认配置：/root/.config/rclone/rclone.conf
--config /root/.config/rclone/rclone.conf #例如 rclone lsd gd_share: --config=~/.config/rclone/rclone.conf 启动 rclone常用命令 ### 文件上传 rclone copy /home/backup gdrive:backup # 本地路径 配置名字:网盘文件夹路径 ### 文件下载 rclone copy gdrive:backup /home/backup # 配置名字:网盘文件夹路径 本地路径 ### 新建文件夹 rclone mkdir gdrive:backup # 配置名字:网盘文件夹路径 ### 获取文件夹大小 rclone size gdrive:backup # 配置名字:网盘文件夹路径 ### 列表 rclone ls gdrive:backup rclone lsl gdrive:backup # 比上面多一个显示上传时间 rclone lsd gdrive:backup # 只显示文件夹 ### 挂载 rclone mount gdrive:mm /root/mm &amp;amp; ### 卸载 fusermount -u /root/mm #### 其他 #### rclone config - 以控制会话的形式添加rclone的配置，配置保存在.</description>
    </item>
    
    <item>
      <title>MongoDB：副本集读写分离搭建</title>
      <link>https://bugwang.cn/posts/mongodb%E5%89%AF%E6%9C%AC%E9%9B%86%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E6%90%AD%E5%BB%BA/</link>
      <pubDate>Wed, 01 Mar 2023 18:54:09 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/mongodb%E5%89%AF%E6%9C%AC%E9%9B%86%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E6%90%AD%E5%BB%BA/</guid>
      <description>背景知识 副本集（Replica Set，replSet，复制集）具有自动故障恢复的功能。主从集群和副本集最大的区别就是副本集没有固定的主节点，整个集群会选出一个主节点，当其挂掉后，会在剩下的副节点中选中一个作为主节点，副本集中总有一个活跃节点(primary)和多个备份节点(secondary)。
MongoDB官方已经不建议使用主从模式，代替的方案是采用副本集的模式。
主从模式 其实就是一个单副本的应用，没有很好的扩展性和容错性，而MongoDB副本集具有多个副本保证了容错性，即使一个副本挂掉了还有多个副本存在，主节点挂掉后，整个集群内会实现自动切换
副本集工作原理 客户端连接到整个MongoDB副本集，不关心具体哪一台节点是否挂掉。主节点负责整个副本集的读写，副本集定期同步数据备份，一旦主节点挂掉，副节点就会选举一个新的主节点，而这一切对于应用服务器不需要任何关心。
副本集中副节点在主节点挂掉后通过心跳机制检测到后，就会在副本集内发起主节点的选举机制，自动选举一位新的主节点。
官方推荐的MongoDB副本集机器数量为至少 3 个，即：一主两副
环境准备 因为主机数量有限，这里只用两个副本集部署演示，两台主机：Centos
ip地址 主机名 角色 192.168.198.140 mongo-master 副本集主节点 192.168.198.142 mongo-slave 副本集副节点 关闭防火墙：
systemctl stop firewalld systemctl disable firewalld 安装MongoDB 安装 wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz tar -zvxf mongodb-linux-x86_64-rhel70-4.2.8.tgz mv mongodb-linux-x86_64-rhel70-4.2.8 /usr/local/mongodb cd /usr/local/mongodb mkdir conf data logs touch conf/mongodb.conf touch logs/mongodb.log mkdir -p data/db 编写MongoDB配置文件mongodb.conf #数据存储路径 dbpath=/usr/local/mongodb/data/db #日志存储文件 logpath=/usr/local/mongodb/logs/mongodb.log #运行端口 port= 27017 #守护进程的方式运行MongoDB，创建服务器进程 fork=true #使用追加的方式写日志 logappend=true # 绑定服务IP，若绑定127.0.0.1，则只能本机访问，不指定默认本地所有IP bind_ip= 192 .168.198. #使用此设置来配置复制副本集。指定一个副本集名称作为参数，所有主机都必须有相同的名称作为同一个副本集 replSet=repset 启动 [root@mongo-master mongodb]# .</description>
    </item>
    
    <item>
      <title>如何打包发布Python包至私有仓库</title>
      <link>https://bugwang.cn/posts/%E5%A6%82%E4%BD%95%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83python%E5%8C%85%E8%87%B3%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA%93/</link>
      <pubDate>Fri, 25 Nov 2022 18:56:42 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/%E5%A6%82%E4%BD%95%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83python%E5%8C%85%E8%87%B3%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA%93/</guid>
      <description>如何打包发布Python包至私有仓库 Python 中的库（package）可以分为标准库和三方库，标注库是在安装Python后，默认安装的库，如math，json等。其余的库可以称之为三方库，需要在使用前单独安装。我们经常使用到 pip install &amp;lt;package&amp;gt; 这个命令就是用于安装三方库的。这里我们只需要指定包名即可非常简单的实现三方库的安装。那么包存储在什么地方，我们是从何处下载安装的呢？
PyPi​ Pip install 命令支持四种来源的安装：
PyPI (and other indexes) VCS 本地项目目录 本地/远程 的 archives Python 安装包教程：https://packaging.python.org/tutorials/installing-packages/#installing-packages
首先，我们介绍下什么是PyPi。PyPi 是The Python Package Index 的缩写，是Python社区用来开发和共享软件的一种软件仓库。
一般如果在使用 pip 安装、搜索第三方Python库的时候，默认使用 Pypi源，若是希望使用其余（私有）的源，可以通过 -i/--index-url指定。
-i, --index-url &amp;lt;url&amp;gt; Base URL of the Python Package Index (default https://pypi.org/simple). This should point to a repository compliant with PEP 503 (the simple repository API) or a local directory laid out in the same format. 如经常使用 清华Pypi镜像 加速某些包下载时经常使用如下方式</description>
    </item>
    
    <item>
      <title>Linux服务器备份和还原：tar命令</title>
      <link>https://bugwang.cn/posts/linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A4%87%E4%BB%BD%E5%92%8C%E8%BF%98%E5%8E%9Ftar%E5%91%BD%E4%BB%A4/</link>
      <pubDate>Mon, 12 Sep 2022 09:18:09 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A4%87%E4%BB%BD%E5%92%8C%E8%BF%98%E5%8E%9Ftar%E5%91%BD%E4%BB%A4/</guid>
      <description>tar备份还原 备份 备份脚本
#!/bin/bash # 强制必须传参 if [ $# -eq 0 ]; then echo &amp;#34;Error: Missing parameter one. Usage: $0 &amp;lt;_BACKUP_DIR&amp;gt;, EXIT&amp;#34; exit 1 fi # 设置备份目录 _BACKUP_DIR=$(realpath &amp;#34;$1&amp;#34;) # 设置输出文件夹（包含末尾斜杠） DEST_PATH=&amp;#34;${_BACKUP_DIR}/$(hostname -I | awk &amp;#39;{print $1}&amp;#39;)/&amp;#34; mkdir -p &amp;#34;$DEST_PATH&amp;#34; # 设置输出文件基础名 DEST_BASE_FILENAME=$(basename &amp;#34;$0&amp;#34;) set -x # 检查 pv 命令存在并安装 _CMDNAME=pv if ! command -v $_CMDNAME &amp;amp;&amp;gt; /dev/null; then if command -v apt-get &amp;amp;&amp;gt; /dev/null; then apt-get update apt-get install -y $_CMDNAME else echo &amp;#34;Error: $_CMDNAME not found and apt-get can&amp;#39;t install.</description>
    </item>
    
    <item>
      <title>Linux下使用NFS访问群晖文件服务</title>
      <link>https://bugwang.cn/posts/linux%E4%B8%8B%E4%BD%BF%E7%94%A8nfs%E8%AE%BF%E9%97%AE%E7%BE%A4%E6%99%96%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1/</link>
      <pubDate>Mon, 06 Dec 2021 19:00:14 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/linux%E4%B8%8B%E4%BD%BF%E7%94%A8nfs%E8%AE%BF%E9%97%AE%E7%BE%A4%E6%99%96%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1/</guid>
      <description>服务端：群晖 开启NFS服务 文件服务 - NFS权限。服务器名称或IP地址：
192.168.0.1/24 客户端 一条龙命令：
#安装nfs服务 yum install nfs-utils -y #显示远程主机共享文件 showmount -e 192.168.x.xx #创建本地目录 mkdir /NFSfile #将远程文件夹挂载到本地目录 mount -t nfs 192.168.1.15:/volume4/Swap /NFSfile -o proto=tcp -o nolock #开启开机挂载 vi /etc/fstab 192.168.x.xx:/volume1/Swap /NFSfile nfs defaults 0 0 安装 apt update apt install nfs-common 查看挂载点
root@debian-11:~# showmount -e 192.168.0.155 Export list for 192.168.0.155: /volume2/HC550_16T 192.168.0.155 /volume1/esxi 192.168.0.8 挂载 注意左下角提示的「装载路径」
使用mount命令：
mount -t nfs -o nolock 群晖IP地址:/volume1/video /mnt/挂载路径要先存在 mount -t nfs -o nolock 192.</description>
    </item>
    
    <item>
      <title>SSH应用：ssh隧道</title>
      <link>https://bugwang.cn/posts/ssh%E9%9A%A7%E9%81%93%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/</link>
      <pubDate>Tue, 30 Nov 2021 10:28:32 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/ssh%E9%9A%A7%E9%81%93%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/</guid>
      <description>文章来源：
https://iguoli.github.io/2018/09/08/OpenSSH-Port-Forwarding.html
以下端口转发命令都可以加上 -f、-N 和 -T 选项，-f 表示让 ssh 进入后台执行命令，-N 表示不执行远程命令，-T 表示不分配终端。
-f
Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background. This implies -n. The recommended way to start X11 programs at a remote site is with something like ssh -f host xterm.
-N
Do not execute a remote command.</description>
    </item>
    
    <item>
      <title>为本地终端设置代理</title>
      <link>https://bugwang.cn/posts/%E4%B8%BA%E6%9C%AC%E5%9C%B0%E7%BB%88%E7%AB%AF%E8%AE%BE%E7%BD%AE%E4%BB%A3%E7%90%86/</link>
      <pubDate>Thu, 04 Nov 2021 10:03:50 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/%E4%B8%BA%E6%9C%AC%E5%9C%B0%E7%BB%88%E7%AB%AF%E8%AE%BE%E7%BD%AE%E4%BB%A3%E7%90%86/</guid>
      <description>为本地终端设置代理 前提准备 电脑本机配置好了clash、V2rayU等代理工具，知道socks5、http的代理端口
第一步 #cat ~/.zprofile #在zsh 加载环境变量的时候，先加载一下 bash_profile 也可 source ~/.bash_profile 第二步 适用于：macOS &amp;amp; Linux（Windows下的：MobaXterm、GitBash）
#cat ~/.bash_profile #cat ~/.bash_aliases #不起作用，重新登录后不会自动加载 cat &amp;gt;&amp;gt; ~/.bash_profile &amp;lt;&amp;lt; EOF #客户端：v2rayN_10808+10809 + NekoBox_2080 + Clash_7890 #socks alias proxy_s5_v2rayN=&amp;#39;export ALL_PROXY=socks5://127.0.0.1:10808&amp;#39; alias proxy_s5_neko=&amp;#39;export ALL_PROXY=socks5://127.0.0.1:2080&amp;#39; alias proxy_s5_clash=&amp;#39;export ALL_PROXY=socks5://127.0.0.1:7890&amp;#39; alias proxy_unset_s5=&amp;#39;unset ALL_PROXY&amp;#39; #http alias proxy_http_v2rayN=&amp;#39;export proxy_http=http://127.0.0.1:10809;export proxy_https=http://127.0.0.1:10809;&amp;#39; alias proxy_http_neko=&amp;#39;export proxy_http=http://127.0.0.1:2081;export proxy_https=http://127.0.0.1:2081;&amp;#39; alias proxy_http_clash=&amp;#39;export proxy_http=http://127.0.0.1:7890;export proxy_https=http://127.0.0.1:7890;&amp;#39; alias proxy_unset_http=&amp;#39;unset proxy_http proxy_https&amp;#39; EOF source .bash_profile all_proxy
大写形式的代理环境变量,遵循与小写形式相同的语法。 用于设置所有协议共用的代理服务器,覆盖其他代理设置。 SOCKS_PROXY、SOCKS5_PROXY
用于设置 SOCKS 代理服务器。 </description>
    </item>
    
    <item>
      <title>MongoDB笔记：基本介绍</title>
      <link>https://bugwang.cn/posts/mongodb%E7%AC%94%E8%AE%B0%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D/</link>
      <pubDate>Wed, 08 Sep 2021 18:26:04 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/mongodb%E7%AC%94%E8%AE%B0%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D/</guid>
      <description>MongoDB笔记：基本介绍 简介:
MongoDB 是一个基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品。
跟关系型数据库的一些概念对比
SQL术语/概念 MongoDB术语/概念 说明 database database 数据库 table collection 表/集合 row document 行/文档 column field 字段/域 index index 索引 内存管理
MongoDB使用的是内存映射存储引擎，把磁盘文件的一部分或全部内容直接映射到内存，这样文件中的信息位置就会在内存中有对应的地址空间，内存中主要存储索引+热数据，Mongodb没有单独的内存管理机制，跟随当前的操作系统的内存管理。
Python操作Mongodb 主流的操作mongodb模块 pymongo
安装 pip install pymongo
创建连接对象
from pymongo import MongoClient class MongoDBClient(object): def __new__(cls): if not hasattr(cls, &amp;#39;instance&amp;#39;): cls.instance = super(MongoDBClient, cls).__new__(cls) return cls.instance def __init__(self): self.params = { &amp;#39;host&amp;#39;: &amp;#39;localhost&amp;#39;, &amp;#39;port&amp;#39;: 27017, &amp;#39;connect&amp;#39;: False, &amp;#39;maxPoolSize&amp;#39;: 2000, &amp;#34;authSource&amp;#34;: &amp;#39;workbench&amp;#39;, # 验证数据库 &amp;#34;username&amp;#34;: &amp;#39;cnns&amp;#39;, # 用户名 &amp;#34;password&amp;#34;: &amp;#39;密码&amp;#39; # 密码 } self.</description>
    </item>
    
    <item>
      <title>Dockerfile笔记</title>
      <link>https://bugwang.cn/posts/docker%E7%AC%94%E8%AE%B0%E7%BC%96%E5%86%99dockerfile/</link>
      <pubDate>Sat, 07 Aug 2021 16:25:53 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/docker%E7%AC%94%E8%AE%B0%E7%BC%96%E5%86%99dockerfile/</guid>
      <description>DockerFile指令 Dockerfile指令包括：
Dockerfile 指令 说明 FROM 指定基础镜像，用于后续的指令构建。 MAINTAINER 指定Dockerfile的作者/维护者。（已弃用，推荐使用LABEL指令） LABEL 添加镜像的元数据，使用键值对的形式。 RUN 在构建过程中在镜像中执行命令。 CMD 指定容器创建时的默认命令。（可以被覆盖） ENTRYPOINT 设置容器创建时的主要命令。（不可被覆盖） EXPOSE 声明容器运行时监听的特定网络端口。 ENV 在容器内部设置环境变量。 ADD 将文件、目录或远程URL复制到镜像中。 COPY 将文件或目录复制到镜像中。 VOLUME 为容器创建挂载点或声明卷。 WORKDIR 设置后续指令的工作目录。 USER 指定后续指令的用户上下文。 ARG 定义在构建过程中传递给构建器的变量，可使用 “docker build” 命令设置。 ONBUILD 当该镜像被用作另一个构建过程的基础时，添加触发器。 STOPSIGNAL 设置发送给容器以退出的系统调用信号。 HEALTHCHECK 定义周期性检查容器健康状态的命令。 SHELL 覆盖Docker中默认的shell，用于RUN、CMD和ENTRYPOINT指令。 通过 Dockerfile 中的这些指令，可以构建出一个完整的Docker 镜像。
1 基础指令 1）FROM 格式： FROM &amp;lt;image&amp;gt; FROM &amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt; 解释：FROM是Dockerfile的第一条而且只能是除了首行注释之外的第一条指令。
2）MAINTAINER 格式： MAINTAINER &amp;lt;name&amp;gt; 解释：指定该Dockerfile文件的维护者信息，类似我们在docker commit时候使用-a参数指定的信息。
3）RUN：(构建镜像) 运行命令（安装环境） 解释：执行命令并创建新的镜像层，通常用于安装软件包
格式： RUN &amp;lt;command&amp;gt; (shell 模式) RUN[&amp;#34;executable&amp;#34;, &amp;#34;param1&amp;#34;, &amp;#34;param2&amp;#34;] (exec 模式：注意需要&amp;#34;双引号&amp;#34;) shell模式：RUN echo 1 ——/bin/sh -c &amp;lsquo;1 &#39; 使用 shell 模式时，docker 会以 /bin/sh -c &amp;quot;task command&amp;quot; 的方式执行任务命令。也就是说容器中的 1号进程 不是任务进程而是 bash进程</description>
    </item>
    
    <item>
      <title>Alembic数据库迁移工具使用</title>
      <link>https://bugwang.cn/posts/alembic%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Fri, 04 Jun 2021 10:56:51 +0800</pubDate>
      
      <guid>https://bugwang.cn/posts/alembic%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/</guid>
      <description>背景 在很多时候，在我们设计好模型之后，又需要进行一定的改变和更新数据操作；最直接的方式就是删除原来的旧表，但我们之前的数据也会删除；究其原因是我们不能精确记住每个修改和对应DDL，这时候就需要数据库迁移框架了。
对于Django ，框架内部就集成了数据库迁移模块，我们可以很方便使用
回顾Django迁移命令： 基本语法： python manage.py xx [app_name] xx如下： migrate，负责应用和撤销迁移。 makemigrations，基于模型的修改创建迁移。 sqlmigrate，展示迁移使用的 SQL 语句。 showmigrations，列出项目的迁移和迁移的状态。 Django迁移过程分为3步走： 1:修改models数据模型 2:生成迁移文件（在migrations/文件夹下）python manage.py makemigrations 3:向数据库执行迁移操作：python manage.py migrate 总结，迁移数据库的主要思路： 1：修改数据模型 2：生成新迁移文件 3：执行迁移 那么在Flask + SQLAlchemy下，如何选择数据库管理迁移工具？
Alembic介绍 Alembic是Sqlalchemy的作者就已经实现的一个数据库版本化管理工具：
Alembic来帮助我们实现数据库的迁移，数据库迁移工具可以在不破坏数据的情况下更新数据库表的结构。蒸馏器（Alembic）是炼金术士最重要的工具，要学习SQL炼金术（SQLAlchemy），当然要掌握蒸馏器的使用。
Alembic 是一个处理数据库更改的工具，它利用 SQLAlchemy 来实现形成迁移。因为 SQLAlchemy 只会在我们使用时根据 metadata create_all 方法来创建缺少的表 ，它不会根据我们对代码的修改而更新数据库表中的列。它也不会自动帮助我们删除表。 Alembic 提供了一种更新 / 删除表，更改列名和添加新约束的方法。因为 Alembic 使用 SQLAlchemy 执行迁移，它们可用于各种后端数据库。
快速上手 # 安装alembic pip install alembic # 初次使用时，需要初始化，创建迁移环境和 alembic.ini 文件、env.py文件 alembic init migrations # 修改alembic.ini配置，改变 sqlalchemy.url 值，配置数据库连接。 sqlalchemy.</description>
    </item>
    
    <item>
      <title></title>
      <link>https://bugwang.cn/posts/docker%E6%90%AD%E5%BB%BAredis%E5%88%86%E5%B8%83%E5%BC%8F%E9%9B%86%E7%BE%A4/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://bugwang.cn/posts/docker%E6%90%AD%E5%BB%BAredis%E5%88%86%E5%B8%83%E5%BC%8F%E9%9B%86%E7%BE%A4/</guid>
      <description>Docker搭建Redis分布式集群 需求：
搭建单机版的redis服务，在应对高并发、稳定性等需求难以胜任。而本次由于项目数据量大，要求稳定性强，能应对高可用，高并发等情况。故搭建redis分布式集群很有必要。考虑到不对物理机造成任何影响，方便管理，本次搭建选择在docker里搭建。 简介
redis分布式集群，由于已经集成了redis哨兵，故具有：
监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover):当一个Master不能正常工作时，哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
从而提高了redis服务的稳定性，高可用性等。
工具
redis镜像 Docker Compose 图解
本次搭建是在两台服务器上，最终集群是三主三从，当使用python客户端连接集群后，数据是通过CRC16算法，之后得到结果，将结果与分配的哈希槽值对比，如果在某一个哈希槽范围内，则将该条数据写入到对应的Master上，同时对应的Slave自动备份；当其中一个Master宕机，在指定的时间内没有恢复，则对应的Slave经过哨兵中自动故障迁移(Automatic failover)功能，提升为Master。之后宕机的服务器恢复后自动降级为Slave。 安装
Docker Compose （可以一条命令启动或删除集群） # 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose，您可以使用 YML 文件来配置应用程序需要的所有服务。然后，使用一个命令，就可以从 YML 文件配置中创建并启动所有服务。 # 安装（Linux系统） # 常规安装： 1、下载安装包 sudo curl -L &amp;#34;https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)&amp;#34; -o /usr/local/bin/docker-compose 2、更改权限 sudo chmod +x /usr/local/bin/docker-compose 3、创建软链接 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 4、测试 docker-compose --version # 本次在Linux中下载安装包时，发现慢，掉包严重，下载失败。而直接执行docker-compose时会提示apt install docker-compose。这条命令提示简单，但是安装后发现无法运行YML文件 可以看到，通过apt install docker-compose安装的docker-compose运行命令docker-compose up -d报错。</description>
    </item>
    
  </channel>
</rss>
