搭建基于 SQLite 的 joplin server
服务端配置构建 joplin server12345$ cd /home/runsisi/runsisi.com/$ git clone https://github.com/laurent22/joplin.git$ cd joplin/packages/server/$ npm install$ npm run tsc
创建 joplin 用户创建用户:
1$ sudo useradd -M joplin -s /usr/sbin/nologin
并且为 joplin 用户添加 joplin/packages/server/ 目录访问权限:
12$ cd ..$ setfacl -m u:joplin:rwx server/
创建 systemd 服务123$ sudo vi /etc/default/joplinAPP_BASE_URL=https://joplin.runsisi.comAPP_PORT=8080
123456789101112131415161718$ sudo vi /lib/systemd/system/joplin. ...
Ceph 受墙上时间调整影响分析
我们知道,Ceph 集群在部署时要求各节点通过 NTP 统一各自的系统时间,而且 MON 还会检测 MON 集群各节点间的时间差异,当超过一定阈值(mon_clock_drift_allowed)时产生相应的告警,但实际上在 Ceph 集群对集群各节点(甚至客户端节点)的时间有非常严格的要求(主要包括保持各节点时间同步、禁止时间跳变),本文将对 Ceph 涉及的时间各方面进行一个较详细的分析解读。
需要注意的是,本文引用的代码都基于 Ceph Luminous 版本,不同 Luminous 小版本之间代码可能有细微的差异,但不影响这里的分析。新版本 Ceph 在时间处理上有一些改变,但显然还远未做到对时间不敏感。
此外,不仅仅是 Ceph 自身代码需要处理系统时间调整的问题,本文涉及的墙上时间/单调时间选择、条件变量超时等待、定时器在 Ceph 依赖的其它组件同样会遇到,比如为了规避系统时间调整的问题,dmClock 的代码就有一处将 CLOCK_REALTIME 时间改成 CLOCK_MONOTONIC 的改动,当然这不是本文的重点。
C/C++ 时间虽然 Cep ...
搭建基于 SQLite 的 Typecho 站点
博客系统从 Hugo 迁移到 Typecho 了,这里简单记录一下安装配置过程。
环境为 Ubuntu 20.04,总的来说挺顺利的。
安装首先安装 PHP 8.0、SQLite 扩展,以及一些和 handsome 主题相关的扩展。
123$ sudo add-apt-repository ppa:ondrej/php$ sudo apt install php8.0-fpm php8.0-sqlite3 php8.0-mbstring php8.0-curl$ systemctl status php8.0-fpm
配置 PHP1234$ grep ^listen /etc/php/8.0/fpm/pool.d/www.conflisten = /run/php/php8.0-fpm.socklisten.owner = www-datalisten.group = www-data
配置 Nginx1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 ...
从 hugo 迁移至 typecho
博客已经从 Hugo 切换至 Typecho !
从 cppblog 到 Pelican 到 Gatsby 到 Hugo 再到 Typecho,一直在折腾 :)
Gatsby
Hugo
Typecho
vstart 环境使用 RDMA
showgids.sh 脚本12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#!/bin/bashblack='\E[30;50m'red='\E[31;50m'green='\E[32;50m'yellow='\E[33;50m'blue='\E[34;50m'magenta='\E[35;50m'cyan='\E[36;50m'white='\E[37;50m'bold='\033[1m'gid_count=0# cecho (color echo) prints text in color.# first parameter should be ...
rdma-core 构建与使用
在编写 rdma 代码时,有时候需要使用 gdb 进行调试,或者需要修改 rdma-core 自身的代码进行代码分析,或者需要使用新版本进行测试,在这些场景下通常有必要在本地对 rdma-core 进行构建。
由于这里我们只考虑在本地的编译、调试,因此,不会涉及 rpm 包之类的构建,这些会在独立的文档中进行描述。
构建rdma-core 的构建体系使用的是 CMake,因此构建起来非常的容易,和其它的 CMake 工程构建没有什么差异:
123456$ git clone https://github.com/linux-rdma/rdma-core.git$ cd rdma-core/$ mkdir build$ cd build/$ cmake -DIN_PLACE=1 ..$ make
注意 cmake 命令行中的 IN_PLACE 宏定义,这样本地构建的命令行程序才会使用 build/etc/ 目录下的配置文件(否则需要定义 CMAKE_INSTALL_PREFIX 为 /usr,这样命令行程序会加载系统目录下配置),默认构建(既不定义 IN_ ...
Soft-RoCE
使用 Soft-RoCE 可以在任何以太网接口上模拟 RoCE 网卡功能,当不具备拥有 Mellanox 等支持 RoCE 功能的物理网卡条件时,可以使用内核的 Soft-RoCE 模块在普通以太网借口上进行模拟。
Soft-RoCE 架构
其中 Soft-RoCE 内核驱动模块完成了 RoCE 网络层(UDP/IP)处理:
Soft-RoCE 初体验首先需要加载 Soft-RoCE 内核驱动模块(rdma_rxe.ko):
123456789$ sudo modprobe rdma_rxe$ modinfo rdma_rxefilename: /lib/modules/5.4.0-64-generic/kernel/drivers/infiniband/sw/rxe/rdma_rxe.koalias: rdma-link-rxelicense: Dual BSD/GPLdescription: Soft RDMA transportauthor: Bob Pearson, Frank Zago, John ...
Excel/WPS 甘特图
这些年其实也使用/试用过一些任务管理之类的软件,或简陋,或繁复,总有一些不太如人意的地方。
在知乎找了个 Excel 的甘特图模板,虽然用于团队任务管理过于简陋,也存在无法协作的问题,但用于个人的任务管理感觉还不错:
甘特图_知乎_王小玮.xlsx by @玲珑
项目管理甘特图-Vince修改版-原作者王小玮.xlsx by @缺失味觉的Z先生
原始的模板公式写的也比较怪异,也存在一些 BUG,而且不是很符合程序员的习惯,因此修改了一下:
123456789101112131415Plan=AND((需求跟踪!$C1<>0),(需求跟踪!$D1<>0),AND(需求跟踪!$C1<=需求跟踪!A$4,需求跟踪!A$4<=需求跟踪!$D1))Actual=AND((需求跟踪!$C1<>0),(需求跟踪!$D1<>0),(需求跟踪!$E1<>0),OR(AND((需求跟踪!$F1<>0),AND(MAX(需求跟踪!$C1,需求跟踪!$E1)<=需求跟踪!A$4,需求跟踪!A$4<=MIN ...
换行符引发的 sudo 故障
调试日志123# vi /etc/sudo.confDebug sudo /var/log/sudo_debug.log all@debugDebug sudoers.so /var/log/sudo_debug.log all@debug
123456789# tailf /var/log/sudo_debug.logDec 10 21:10:16 sudo[3697781] -> sudo_check_suid @ ./sudo.c:866Dec 10 21:10:16 sudo[3697781] <- sudo_check_suid @ ./sudo.c:910Dec 10 21:10:16 sudo[3697781] -> save_signals @ ./signal.c:79Dec 10 21:10:16 sudo[3697781] <- save_signals @ ./signal.c:86Dec 10 21:10:16 sudo[3697781] -> init_signals @ ./signal.c:125Dec 10 21:10: ...
mount/umount 的 root 检测
mount/umount 命令在应用层做了强制的权限检测,通过赋予普通用户进程 CAP_SYS_ADMIN capability 不能解决普通用户进程没有权限执行 mount/umount 命令的问题,需要为普通用户添加 sudo 权限。
123456789101112131415161718192021222324252627282930$ export LIBMOUNT_DEBUG=0xffff$ umount /media74375: libmount: don't print memory addresses (SUID executable).74375: libmount: INIT: library debug mask: 0x100ffff74375: libmount: INIT: library version: 2.34.074375: libmount: INIT: feature: selinux74375: libmount: INIT: feature: smack74375: ...