使用 ksmbd 搭建 samba 共享服务

ksmbd 是内核的一个提供 samba 协议服务的模块,从 5.15 并入内核主线,去年的 6.6 稳定下来,据作者自己的测试能比用户态的 samba 快 40% 以上。使用 ksmbd 的另一原因是 debian 安装 samba 的时候会装一大堆不需要的依赖,不知道打包配置是怎么写的。

要使用 ksmbd 需要先安装 ksmbd-tools

配置文件是 /etc/ksmbd/ksmbd.conf,格式和选项和用户态的 samba 服务一样,下面是我的一个配置,允许内网无密码读写:

; see ksmbd.conf(5) for details

[global]
workgroup = ousvr
log file = 

阅读全文…

使用 mutt 收发邮件

由于本人用的是 gmail,下面是 gmail 的配置(以 # 开头的行是注释):

1. 使用 gmail

# ~/.muttrc

# ================  IMAP ====================

set imap_user = "<your-mail-name>@gmail.com"
set imap_pass = '<your-app-password>'

# ================  SMTP  ====================

set smtp_url = "smtp://<your-mail-name>@smtp.gmail.com:587/"
set smtp_pass = '<your-app-password>'
set ssl_force_tls = yes # 

阅读全文…

给 linux kernel 提交 patch 的步骤

这里记录一下给 kernel 提交 patch 的过程,比较零碎。

1. 生成 patch

首先需要把修改提交到本地。

1.1 单个 patch

commit 内容一般包含三个部分:第一行的格式一般是 module: summary,说明对哪个模块做了什么修改;接下来是说明为什么修改;最后是签名,通常是通过 git commit -s 来添加。

然后是生成要发送的 patch:

$ git format-patch --subject-prefix='PATCH' -1

--subject-prefix 是为邮件添加的前缀,通常有下面几个:

  • PATCH:常规的且正式的 patch;
  • RFC:不是要正式提上去的,希望一起讨论这个 patch,用来说明方向,看看意见;
  • RESEND:重新发送之前的 patch。

最后的 …

阅读全文…

用 tar 备份 linux

像我这种把 debian 当做 arch 来用的人,把系统搞挂是常有的事,虽然备份和恢复的步骤不复杂,还是想记录一下。

name=`date +%Y%m%d`
tar -zcpf $name.tar.gz --exclude=/proc/* --exclude=/dev/* --exclude=/sys/* --exclude=/run/* --exclude=/tmp/* --exclude=/mnt/* --exclude=/media/* --exclude=/home/* -P /

这里的一连串 --exclude 就是不需要备份的目录。和以前不同,以前只要系统不启动,这些目录大都是空的,直接 tar 根目录就行,备份正在运行的系统的话就要排除这些目录了。

恢复的步骤是先用 livecd 挂载根目录(以 sda1 为例):

mount /dev/sda1 sda1

然后解压备份的内容:

cd sda1
tar -xf 20240206.tar.gz

然后挂载一下运行时的目录:…

阅读全文…

在 x86 上调试 linux kernel

记录一下在 x86 上编译调试 6.7-rc7 的过程。

编译内核

从 kernel.org 或者 github 下载内核源码然后开始配置:

cd linux
export ARCH=x86
make x86_64_defconfig
make menuconfig

需要启用 debug 支持以及禁用随机地址(否则不能打断点)

Kernel hacking  --->
    [*] Kernel debugging
    [*]   Miscellaneous debug code
    Compile-time checks and compiler options  --->
        Debug information 

阅读全文…

关于 pthread cond 的注意事项

最近在使用 pthread condition variable 的时候出现了问题,经过排查发现是 pthread_cond_signal() 放在了 pthread_mutex_unlock() 之后调用导致的。本来不是个什么复杂的问题,但是由于自己一直以来的忽略,觉得有必要记录一下。

先来看下很多文章中都用到的关于 pthread_cond_ 系列函数的例子:

/* ----- producer ----- */

pthread_mutex_lock(&mutex);               /* 1 */
queue.push(item);                         /* 2 */
pthread_cond_signal(&cond);               /* 3 */
pthread_mutex_unlock(&mutex);             /* 4 */

/* ----- consumer ----- */

pthread_mutex_lock(&mutex);               /* 

阅读全文…

使用 freebsd 搭建家用 nas

最近拍摄的照片和视频有点多,手机存不下,准备搞个家用 nas 来存,经过一番对比之后准备上 freebsd,这里记录下一些重要配置。

freebsd 安装和设置

本文使用的是 13-RELEASE。要注意的地方主要是分区的时候选手动,分区表格式选“GPT”,文件系统格式填“freebsd-zfs”,系统会单独分一个 512KB 的 /boot,剩下的全分给 /

更新系统(例如更新到 13.2):

freebsd-update upgrade -r 13.2-RELEASE
freebsd-update install

更新完系统后可以执行

pkg upgrade

来更新其它软件包。

如果更新后执行 pkg 报错,可以使用以下命令来修复:

pkg-static install -f pkg
pkg upgrade -f

修改 /boot/loader.conf 启用 aio:…

阅读全文…

gdb 笔记

一些零散的 gdb 备忘都记录在这里。

gdb 前端

gdb 自带了一个 tui 的前端,使用 -tui 选项即可启动。tui 界面比较简单,上半部分是代码,下半部分是 gdb 命令窗口,而且代码也没有高亮。另外还有使用 vim 操作方式的 cgdb,以及有一个用 python 写的 web 前端 gdbgui。当然在 emacs 中也集成了一个叫 gud 的 debugger mode(参考资料 1)。

gdb 自定义命令

建立 ~/.gdbinit 文件,里面写上要定义的命令,gdb 启动的时候会读取这个文件里的命令,这样在调试过程中就可以使用这些自定义命令了。定义命令的方式为:

define mycmd
...

阅读全文…

《Time, Clocks, and the Ordering of Events in a Distributed System》中文版

分布式系统中的时间,时钟,以及事件顺序

原文:Time, Clocks, and the Ordering of Events in a Distributed System
作者:Leslie Lamport
发表日期:1978 年 07 月
译者:ou@https://ouonline.net/

摘要

本文研究了“分布式系统中一个事件在另一个事件之前发生”这个概念,并用它来定义事件的偏序关系。给出了用于同步逻辑时钟系统的分布式算法,该算法可以用来确定事件的全序关系。用解决同步问题的方法来说明全序的使用。这个算法被专门用来同步物理时钟,并得出时钟同步的最大偏离范围。

引言

时间的概念是我们思维的基础。它源自一个更基础的概念,即事件发生的顺序。如果某事发生在我们的时钟读数为 3:15 之后并且在其读数变为 3:16 之前,我们就说 3:15 发生了某事。事件的时间顺序概念充斥着我们对系统的思考。例如,在航空公司的预定系统中,我们指定如果在航班满员之前提出预定请求,那么应该允许该请求。然而,我们会看到,在考虑分布式系统中的事件时,必须仔细重新检查这个概念。

一个分布式系统由空间上分离的不同进程的集合组成,这些进程通过交换消息来互相通信。一个互相连接的计算机的网络,例如 ARPA,就是一个分布式系统。单个计算机也可以被看作是一个分布式系统,其中的中央控制单元,存储单元和输入输出通道都是独立的进程。如果消息传输延迟与单个进程中事件发生的间隔相比不能忽略,则这个系统就是分布式的。

我们将主要关注空间上分离的计算机系统。但是,我们的许多结论将会更通用。特别地,单台计算机上的多进程系统会遇到与分布式系统类似的问题,因为某些事件的发生顺序不可预测。

在分布式系统中,有时候无法决定两个事件中的哪一个先发生。因此,“先发生”关系只是系统中事件的偏序关系。我们发现这个问题经常出现,是因为人们没有完全意识到这个事实以及它的含义。

在本文中,我们讨论了由“先发生”关系定义的偏序,并给出了一种分布式算法,用于将偏序扩展为所有事件的一致全序。这个算法可以为实现分布式系统提供有用的机制。我们通过一个解决同步问题的简单方法来说明它的用法。如果由这个算法得到的顺序和用户感知的顺序不同,则可能会发生意外的异常行为。通过引入真实的物理时钟可以避免这种情况。我们介绍了一种用来同步这些时钟的简单的方法,并推导出它们漂移的不同步程度的上限。

偏序

如果事件 a 发生的时间早于事件 b,大部分人可能会说 …

阅读全文…

《Reconfiguring a State Machine》中文版

重新配置状态机

原文:Reconfiguring a State Machine
作者:Leslie Lamport, Dahlia Malkhi, Lidong Zhou
发表日期:2010 年 01 月 29 日
译者:ou@https://ouonline.net/

摘要

重新配置意味着更改分布式系统中的执行任务的进程。我们介绍几种方法(包括一些新方法),用来重新配置一个使用状态机方式来实现的系统。本文将讨论这些方法与之前的重新配置算法之间的关系——特别是在组通信中的视图变更。

目录

  • 1 引言
  • 2 状态机
    • 2.1 准备工作
    • 2.2 垃圾回收
    • 2.3 重新配置的简单方法
    • 2.4 正确性
  • 3 重新配置的复杂方法
    • 3.1 停止状态机
      • 3.1.1 “停止标记”法

阅读全文…