使用binfmt_misc和QEMU编写跨架构容器
经过“非常简单”的开发过程,咱终于把binfmt_misc支持加入了ruri新版本中:
117 files changed, 562 insertions(+), 60 deletions(-)
可以看到修改并不多,嗯。(心虚)好了我们还是来讲讲binfmt_misc的应用吧:
简介:binfmt_misc是一个内核级别的除对标准同架构ELF以及#!开头的脚本外的可执行文件进行exec(2)的支持,需要内核开启CONFIG_BINFMT_MISC。需要注意的是binfmt_misc只是将某个支持的可执行文件配置为打开另一种不受支持的格式的文件的解释器,以做到扩展其他格式可执行文件支持。那么它有什么用呢?如果我们需要在aarch64的平台上打开一个x86_64的ELF文件,我们需要:
1qemu-x86_64-static a-x86-64-elf-binary
但如果我们将$(which qemu-x86_64-static)注册为x86_64 ELF格式的解释器,我们就可以直接运行:
1a-x86-64-elf-binary
这对于跨架构容器尤为重要,因为这样就可以直接执行命令了。
...
安装Linux后必须要做的n件事
这次不是好久不见了喵~最近一次配置GNU/Linux系统是今天,昨天给我的小米平板5刷了map220v大佬的ubuntu包,终于不用吃灰了喵~感谢map220v大佬喵~话不多说开始正文:
软件安装:桌面我一般用kde-plasma,这个不必多说了,推荐几款常用软件:
htop:显示进程信息(TUI)
conky-all:显示系统占用(GUI)
batcat:高亮版cat
latte-dock:比kde自带的更好看的dock和panel
onboard:屏幕键盘
spectacle:截图工具
cloc:代码行数统计
VSCode:不用多说
常用开发/日常软件:git wget aria2 curl make cmake clang clang-tidy clang-format gdb binutils openssh zip unzip gzip p7zip nano manpages zsh android-tools zsh
VSCode插件:
C/C++:C语言官方扩展
Codesnap:创建代码截图
filesize:显示文件大小
Jetbra ...
Nothing Phone(2)的灯带驱动研究笔记
最近整了部Nothing Phone(2),bl秒解的设定是真的舒服,所以买来第一时间就透了一遍(指root了)。然后半夜睡不着,就打算研究一下这个灯带是怎么调用的。然后就开始了,一段孤独的旅程充满烦恼~
内核源码:很不幸,除了知道了灯带型号是aw20036之外没啥收获,原因无他,单纯看不懂代码,注释都不怎么写这不欺负萌新吗。。。仓库里相关代码文件甚至具有可执行权限,看来开发者也是和咱一样只知道无脑777的杂鱼呢。在leds目录下有个TODO文件(这是忘了配置gitignore吗?),然后看到一段离谱的留言:
1234* Command line utility to manipulate the LEDs?/sys interface is not really suitable to use by hand, should we havean utility to perform LED control?
好家伙,你还有脸说呢!!!你倒是说说具体怎么用啊!!!
正式尝试:找到接口位置:好吧内核源码看不懂,咱来到user-space(笑)。首先find|grep找到sysfs接口在/ ...
Clang/GCC安全编译与代码优化选项(合集)
好久不见喵~实在想不出开头就不想了,本期文章咱们来讲讲Clang/GCC的安全编译与代码优化选项。注意:优化选项建立在代码正确的前提下,且最好不要在使用GDB等工具调试时开启任何优化选项。
LTO(Link-Time Optimization):中文是链接时优化,最初由LLVM实现,可做到在编译时跨模块执行代码优化,功能有:
函数自动内联
去除无用代码
全局优化
LTO有大型LTO(monolithic LTO)和增量LTO(ThinLTO)两种实现,其中ThinLTO内存占用较少。虽然对于小型项目几乎无影响,但Google的内核源码由于默认是大型LTO,曾将咱的电脑整OOM了三回啊三回。据说ThinLTO有时反而有更好的性能,具体咱不清楚。编译参数(二选一):
1234# monolithic LTO:-flto# ThinLTO:-flto=thin
PIE(Position-Independent Executables):中文是位置无关可执行程序,配合内核的ASLR(Address Space Layout Randomization,地址空间随机化)功能将代码段 ...
C语言实现简单的pstree(子进程查询)功能
前言:最近开发ruri打算加个容器进程信息显示,由于ruri是C语言写的便决定还是用C实现。于是查半天。。。没查到一点相关内容。都欺负萌新是吧呜呜呜~然后就去看man proc了,有个特殊的文件/proc/${pid}/task/${tid}/children能记录子进程号,不过需要内核开启相关配置才行。。。。欺负萌新是吧呜呜呜~行吧,还是自己写唔喵。
已知条件:子进程pid永远大于父进程pid,即:pid>ppid/proc/${pid}列表可以列出所有运行中进程的pid号。/proc/${pid}/stat(status)文件可以解析出每个进程的ppid。其中stat更适合C语言等程序解析,status更适合脚本/人类解析。具体内容可以看man proc。“这题我知道,选D,钝角”“寄!”(死亡微笑)
开始编程:我们可以先去看看内核是如何存储进程信息的:
12345678910111213141516struct task_struct ...
终端控制码表by沨鸾
建议先用printf/echo -e测试下。更改光标风格,仅在Termux有效:
123"\e[2 q""\e[6 q""\e[4 q"
输出RGB颜色,TTY下无效:
12"\033[38;2;<R>;<G>;<B>m" #前景"\033[48;2;<R>;<G>;<B>m" #背景
256色:
12"\033[38;5;<num>m" #前景"\033[48;5;<num>m" #背景
常见:
12345678910111213141516"\n" #换行"\b" #光标退格"\a" #响铃(手机是震动)"\033c" #清屏"\033[?25l" #隐藏光标& ...
Re:从零开始的容器安全——ruri开发笔记
前言:ruriv2.0刚发了rc1(现在是3.1-rc1了都),之前一直咕咕咕着的开发笔记差不多也该写写了喵~笔记主要讲容器及安全原理,使用C语言实现。头图是项目最早的版本,真是怀念呢喵,那时候咱连数组都不会用,现在ruri代码都突破4k行了。
容器基本原理:Linux挂载点/设备文件:众嗦粥汁,Linux下的/proc,/sys与/dev均在开机时由init或其子服务创建,部分系统同时会将/tmp挂载为tmpfs,它们都需要被手动挂载到容器才可保证容器中程序正常运行。其中,/proc为procfs,/sys为sysfs,/dev为tmpfs。你还需要在容器中创建/dev下的设备节点文件。部分文章在创建chroot/unshare容器时都会直接映射宿主机的/dev目录,这是十分危险的,正确的做法是参照docker容器默认创建的设备文件列表去手动创建这些节点。当然了,docker也会将/sys下部分目录挂载为只读,ruri借鉴了其挂载点,详情可以去看ruri ...
开源项目规范化指北
前言:又是迟来的更新喵~说实话咱自ruri开始开发以来就一直在想规范化问题了,虽然大概率不会有人帮咱写代码,(termux-container拆成三个项目结果都是咱自己维护可真寂寞),不过一个规范的项目自己看着也会心情愉悦嘛喵~话不多说咱还是开始今天的正文。(虽然可能会很水)
项目使用方法规范化:尤其对于只有命令行的项目,一个易懂的命令格式/调用方法十分重要。曾有人问过,如果有人对Qemu说:“你不觉得自己的使用方法很难吗?”,Qemu会如何回答?博主:“我又没让你用”。可那只是因为它是Qemu,要是咱写的东西需要这么复杂的命令行,估计这辈子都没人用了喵呜~所以,建议还是Keep it simple&stupid吧(可不是像archlinux一样直接拒绝萌新使用啊喵!!!)
文档规范化:如果是在Gayhub这种国际社区发布,墙裂建议默认Readme为英文文档(机翻就算了,老外自己有谷歌翻译的说)。当然国内社区的话随意。但文档内容一定要说明重点,如项目介绍,使用方法,使用的外部项目等。
选择合适的许可证:自己写的代码的话随意,如果有 ...
在Linux下优雅的调试C语言
最近在开发ruri时遇到不少问题,咱也是第一次写C,早知道头顶这么发凉就去用某邪教了呜喵~至于学习C语言的心得嘛,
123456789陷入无法察觉的overflow沦落于oom-killer之下的死尸就连无法看懂的魔数也错以为是莫名能跑的奇迹被泄漏的内存所填满内核惶恐逐渐失去的可维护性终于咕咕而终「bug还在↗↘↗↘↗↘↗➔➔↘↘」
(高速退学)好了好了,C语言还是有许多优点的,只是可能入门成本高些罢了,如果善用测试工具的话还是没有那么糟糕的,话不多说我们开始今天的正文。
首要前提:代码没bug的就不要调试了,编程第一法则不就是能跑的代码不要动嘛喵~过早的优化是万恶之源,测试时不要开-O2,且尽量使用-O0 -fno-omit-frame-pointer -z norelro -z execstack -no-pie -fno-stack-protector -Wall -Wextra -pedantic -Wconversion来测试。至于O3。。。除非编码特别规范否则几乎是炸屎。那如果有bug呢?首先得能过编译器,编译器都报error的代 ...
浅谈android设备sysfs接口硬件调用之手电筒,马达,呼吸灯
这篇文章我们来介绍下几个sysfs接口的调用。事实上,驱动接口一般有两种方式调用:ioctl()和read()/write()。前一种要么能读懂内核源码,要么照抄strace用户空间驱动得到的调用,因此不做研究。需要注意的是,由于安卓内核碎片化过于严重,各个厂商之间的代码差异过大,因此直接和内核交互来调用驱动并不是一个通用思路。但是对于某些特定设备的驱动调用却是个简单可行的方法,比如nothing phone的灯带。
手电筒:一般是个led类设备,小米10ultra的手电筒被注册到了/sys/class/leds/flashlight/下,当然也有部分设备叫led0或者其他,nothing的手电筒驱动咱还没找到,咱好笨喵呜~目录中有两个文件对我们有用:brightness和max_brightnessmax_brightness的内容是个固定值,定义了灯的最大亮度。brightness的内容是个无符号整形数值,定义了灯的亮度,向其写入一个不大于max_brightness的合法数值,灯会亮,数越大灯越亮,写入0关闭手电筒。什么 ...