QEMU KVM 虚拟机制作
🌟Overview
应使用 libvirt 进行操作、管理. libvirt 使用 XML 来定义各种对象, 最好使用 virt-manager 创建虚拟机然后在配置文件里进行修改, 也可使用 virt-install 创建.
🌟模拟网卡设置
1 |
|
🌟vhost-net
virtio 在 Host 端的后端处理程序 (backend) 一般是由用户空间的 QEMU 提供的. vhost-net 是一个驱动模块, 是内核级别的后端处理程序, 将 virtio-net 的后端处理任务放到内核空间执行, 减少内核态与用户态之间的 context 切换, 从而提高效率.
一次陕西旅游行程记录
目的地
陕西华阴县华山景区、西安大雁塔
住宿
用携程软件在离西安北站约 2 公里的一个酒店订了个房间, 订住两晚花费共计 713 元.
行程
第一日下午, 成都东站 ==> 西安北站, 快凌晨的时候到达西安北站, 通过导航坐地铁、步行达到了酒店. 票约 265 元.
第二日上午, 西安北站 ==> 华山北站, 出站到门口的客运站坐免费公交到达景区入口. 票约 55 元.
第二日下午, 排队、登山、吃东西、下山, 此间花了约 480 元.
第二日下午, 第一次吃羊肉泡馍和肉夹馍, 共计 38 元.
第二日下午, 华山北站 ==> 西安北站, 票约 55 元.
第三日下午, 西安大雁塔, 票 40 元, 登塔 25 元. 共计 65 元.
第三日下午, 西安北站 ==> 汉中中转 ==> 成都东站, 共计 322 元.
总结
可以看到, 大头花在了住宿上面, 不过住宿环境好一点, 住着要舒心一些, 在往返西安北站与酒店时它还提供免费接送服务。
另外, 华山确实值得一攀, 景色非常好, 华山群峰雄伟挺拔, 如同剑劈过一般, 看着有些锐利。悬崖峭壁上还长有各式各样的松树, 也不知顽强生存了多少年。一般情况都能看到云海, 在山顶上看云海翻腾, 感觉仙气飘飘。
华山上有两个额外付费项目也很有意思, 一个是鹞子翻身、一个是长空栈道。因为当时都要排队以及其他原因我就没有去体验。
鹞子翻身就是一个深入悬崖空中的山麓, 上面有一个亭子, 亭子内有一副围棋残局,据说是赵匡胤和谁在那儿下棋, 把华山输给了对方。
这个地方视野绝佳,就像一块木板从悬崖边向前延伸, 人走上去, 在群山环绕下心旷神怡。非常值得一观。用无人机的话应该能拍出很好的片。本来即使排队我都想去看一看的, 结果在那儿遭遇负责这块地的态度不甚友好的工作人员, 就没有去。
长空栈道则是扒着悬崖绝壁走那条非常窄的路, 需要绑着安全带。
大雁塔是西安地标, 在塔外看着挺不错, 有点古朴沧桑的感觉。登塔时感觉一般, 每层楼只有可怜的一两件藏品, 而且当时我去的时候 7 楼及以上在施工上不去, 不知道上面有什么。
这一次旅行其实有点失误了, 赶上了学生们的暑假, 登华山时上山排队排了两小时, 好在景色没有辜负我。
另外, 陕西的黄河壶口瀑布有机会我也会去看看。
格里历闰年规约
格里历, 也就是公历、西元.
一年 365 天, 与回归年 (365.24219天) 有点误差. 差不多 4 年需要做误差补偿,也就是 4 年一闰, 增加一天, 这一天加在2月份上, 使其成为 29 天.
但这样的话每 4 年还有个误差,就是多了 0.0312 天,平均每年人类公历历法相比回归年多了约0.0078天, 每 400 年就会多出 3.12 天.
所以人为规定每 400 年应减掉 3 个闰年再继续闰.
总结下来就是: 四年一闰, 百年不闰, 四百年再闰.
创建 systemd 服务
创建 demo.service 服务文件
创建服务配置文件 /etc/systemd/system/demo.service
1 | [Unit] |
可选创建同名 demo.timer 文件
环形缓冲区
什么是环形缓冲区 (Circular Buffers)
环形缓冲区是大小固定的含两个指针的环形 Buffer.
head指针:生产者将新数据插入缓冲区的位置点tail指针 :消费者从缓冲区读取数据的位置点
一些特点
- 当
head == tail时, 缓冲区为空 (EMPTY) - 当
head < tail时, 缓冲区为满 (FULL) - 头索引在添加项时递增,尾索引在删除项时递增
- 尾部索引不会跳过头部索引,当到达缓冲区末尾时,两个索引都应该被包装为0,从而允许无限数量的数据流经缓冲区
- 通过将内存屏障与循环缓冲区结合使用,可以避免一些锁操作:
- 使用一个单独的锁来控制对缓冲区两端的访问,从而允许同时填充和清空缓冲区
- 使用原子计数器操作
这有两个方面, 生产者填充缓冲区,消费者清空(读取、吃掉)缓冲区。在任何时间只有一件事,或者是填充缓冲区,或者是清空缓冲区,但是两边可以同时操作。
生产者
1 |
|
消费者
1 | spin_lock(&consumer_lock); |
这篇文章也是以前的笔记, 不知是自己写的还是在哪儿摘抄的, 过于久远.
NodeJS 读写 Xlsx
安装
使用
node-xlsx或js-xlsx模块
- 使用
npm包管理器npm install xlsx --savenpm install node-xlsx --save
- 使用
bowerbower install js-xlsx
node-xlsx 的使用
1 |
|
文章有点久远, 注意验证.
安卓手机刷自编译内核支持Docker
记录一个大致流程
- 刷
TWRP - 刷
orangefox, xda 上找一个自个儿手机的第三方包, 但必须公开了其内核源码. 刷Magisk, Magisk.apk 改为 magisk.zip 即可刷 - 安装
Termux, 设置文件存储访问权限并运行termux-setup-storage, 换源termux-change-repo并更新:pkg update - 使用
check-config.sh, 查看该包内核需要开启什么选项 git clone ROM 的内核源码- 安装配置交叉编译工具链 (需要
合适的 gcc/clang 版本, 只能尝试, 或者如果 ROM 作者有提示更好) - 在内核源码目录运行
make clean && make mrproper && make ttifany_defconfig (我的一个旧手机代号: 小米 5X) && make menuconfig将第 4 步显示的missing项勾选上, 应配置为星号*, 而不是M, 表示模块编译进内核与内核一体, 而不是可”插拔”的模块. make -j4- 在 TWRP 的 Terminal 中执行
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/stockboot.img - 下载
Android Image KitchenLinux 版本, 解压, 将stockboot.img拷贝道 AIK 目录下 - 在 AIK 目录下执行
sudo ./unpackimg.sh stockboot.img - 将第 8 步编译好的内核
arch/arm64/boot/Image.gz-dtb替换[AIK]/split_img/image.gz-kernel - 在 AIK 目录执行
sudo ./repacking.sh - 将
image-new.img拷贝到手机/sdcard/下 - 在 TWRP 中选中 boot 分区刷入
image-new.img - 手机开机后, 在 Termux 中再次运行
check-config.sh检查相关配置是否已经满足 - (可设置开机启动)运行
sudo mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup pkg install root-repopkg install docker- (可设置开机启动)运行
sudo DOCKER_RAMDISK=true dockerd --iptables=false sudo docker run hello-world- 然后就能看到是否成功的提示了
一些说明
这是以前记录在为知笔记里头的, 这次转录过来做个备忘, 省略了很多细节. 第 8 步可能会出现很多问题, 比如头文件
什么的找不到之类, 需要找到错误提示对应的文件所在目录的 Makefile 里面加上能找到相关头的路径.
使用 Watchtower 自动更新容器
Overview
自动删除旧容器和镜像,使用被更新容器原来的参数创建新的容器.
自动检查更新
1 | docker run -d --name watcht_memos --restart always -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup memos |
手动检查更新
1 | # 添加容器运行参数, 表示只运行一次、运行完就删除该更新检查容器 |
一些坑
有一些容器不适合使用 Watchtower 来更新, 比如我使用的 nextcloud:25.0.3-apache.
Watchtower 是检查的 latest 标签. 如果它直接更新, 那么这个所谓 latest 将变成版本 23.0, 而我使用的是 25.0.3 版本, 相当于还降级了.
我上次就不小心更新了. 还好做了 bind mount, 数据都在, 重新安装需要的版本就好.