linux 的 unshare 命令

最近有一个需求,就是要在服务器端执行用户传过来的命令。为了防止用户运行一些恶意指令,我们需要构造一个沙箱来运行。这种隔离的需求第一反应就想到了之前写过的 使用 overlayfs 和 chroot 搭建临时环境,但是这需要 root 权限。有没有办法在不需要 root 的情况运行 mountchroot 呢?简单搜了下就找到了想要的答案。

unshare 是 linux 下的一个命令,通过构造一个新的 namespace 来和现有的环境隔离。基本用法很简单,就是一些选项,然后再加上要运行的命令即可,看起来有点像一个精简版的 docker。而且和 docker 一样的是,只要运行的命令退出了,在命令运行期间做的操作都会被自动清除。这个完美符合我们对沙箱的要求。

先来做个测试。通过 unshare 把当前用户映射成 root,并创建一个新的 mount namespace

unshare -rm /bin/bash

运行之后发现我们的用户变成了 root!另外一个不容易发现的内容就是,在我们所创建的这个 mount namespace 中进行 mount

阅读全文…

iterm2 快捷键修改

不知道怎么说起,先列一下起因的关键词:mac 键盘,iterm2,emacs。这里面的每一个词都是我要解决的问题起源,也是有这篇文章的原因。这里的环境是 Ventura 13.6.6,iterm2 3.5.0,后面软件有更新的话可能配置路径不一样。

注意这里修改的是默认的配置文件,就不一一强调了。

首先是一个很多人都会遇到的问题:在 iterm2 中用 emacs(或者说在 iterm2 的命令行中用 emacs-style key binding)的时候 meta 键的映射。这个在网上已经有很多人写过了,就是在 iterm2 的 Settings -> Profiles -> Keys -> General 中,把其中的 Left Option key 的选项改为 Esc+,这样在终端中 option 键的行为就和其它键盘的 meta 行为一样了。

但是因为 mac 键盘中左边 …

阅读全文…

使用 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

阅读全文…

gdb 笔记

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

gdb 前端

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

gdb 自定义命令

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

define mycmd
...

阅读全文…