All posts


May. 3, 2021

解决Docker中部署PHP-FPM出现"File not found."的问题

场景:在Docker里跑PHP-FPM,把TCP Socket开在localhost:9999上,用本机的Nginx去访问。 问题:访问存在的index.php文件时,显示File not found.。 看一下/var/log/nginx/errors.log,发现有这样的错误信息: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream 于是确定是通过FastCGI调用PHP-FPM时,传递的文件名有误。这就涉及到PHP的工作原理了:Nginx提供 HTTP服务,对于客户端对PHP文件的请求,Nginx将构造一个对应的CGI调用,通过配置的TCP套接字或者Unix 套接字,将请求发送给PHP。请求中有一个参数SCRIPT_FILENAME标识了客户端请求的脚本文件的本地 路径。由于我将PHP环境放在了Docker内部,PHP通过Docker Volume访问重定向后的本机路径,这个路径 和外部的Nginx看到的路径不一样,从而导致了Nginx能看到这个PHP脚本文件、而PHP不能。 需要修改Nginx站点的配置文件,一般我们都会从网上抄来这么一行配置: fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 如果Nginx和PHP在一个Docker环境/文件系统环境里,或者Docker内外,你的网页本地路径一样, 那么这样配置就不会出现问题。现在我们只需要手动设置一下Nginx通过CGI传递的文件路径,将这个路径 改为Docker内部重定向后的路径。 我的PHP volume配置: volumes: - /opt/myapp/html:/var/www/html 可见,外部路径是/opt/myapp/html,而Docker内部路径是/var/www/html,所以我们只需要把Nginx 里的那行配置改成: fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 就可以了。当你修改了Docker内部容器的布局后,还需要改一下Nginx的这里的配置。

Mar. 13, 2021

为LUKS分区启用Trim

参考这篇文章 运行lsblk --discard确认Trim是否开启:如果分区对应的DISC-GRAN和DISC-MAX一项为0,则说明Trim未在该分区启用 修改grub的内核启动参数(sudo vi /etc/default/grub),找到GRUB_CMDLINE_LINUX_DEFAULT这一项,在cryptdevice一项后添加:allow-discards,并在末尾添加rd.luks.options=discard,最终的结果应形如GRUB_CMDLINE_LINUX_DEFAULT="cryptdevice=UUID=********-****-****-****-************:luks-********-****-****-****-************:allow-discards root=/dev/mapper/luks-********-****-****-****-************ rd.luks.options=discard"。保存退出。 运行sudo update-grub,应用编辑后的grub配置文件。 重启,重新运行lsblk --discard查看,此时的结果应如下: NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO mmcblk0 0 16M 13.9G 0 └─mmcblk0p1 0 16M 13.9G 0 nvme0n1 0 512B 2T 0 ├─nvme0n1p1 0 512B 2T 0 ├─nvme0n1p2 0 512B 2T 0 │ └─luks-********-****-****-****-************ 0 **512B** **2T** 0 └─nvme0n1p3 0 512B 2T 0 └─luks-********-****-****-****-************ 0 0B 0B 0 星号标记处的数据应为非零,说明该分区已启用Trim,可以使用sudo fstrim -av来手动对所有支持的分区发送Trim指令: /boot/efi: 298.9 MiB (313450496 bytes) trimmed on /dev/nvme0n1p1 /: 606.

Mar. 8, 2021

vim中文乱码

vim在更新之后,打开包含中文的文件时,中文显示为~和字母、数字组合起来的乱码,而终端下的其他程序均显示正常,初步怀疑是vim的编码设置有误。 用set encoding和set fileencoding查看vim的内部编码设置和对待文件使用的编码类型,发现都是latin-1,于是在.vimrc文件中加入: set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1 set encoding=utf-8 来手动设置打开文件时使用的编码顺序和vim内部使用的编码类型。重启vim,中文显示正常。

Feb. 10, 2021

用新技术重构个人网站

这几年里,我的个人网站换了6个版本。不过,前面的许多版本都是小打小闹,在管理上,都很不规范。这次的更新中,我对需求进行了一次全面的分析,并尽量使用最新的技术进行实现。 需求分析 在个人VPS上,运行下列服务: 个人网站 首页 要有一个简介 能显示一些自己做的小项目 博客 轻量 使用MySQL等大型数据库的一律否决(因为博客不是Big Data) 使用Node.js等笨重运行时的一律否决(因为博客不是什么大型工程) 可以使用Markdown撰写 开源产品 高可定制性和自由度 有一款我能看中的简洁主题 花里胡哨的全部否决 其他个人小程序 (不是微信的那个!) Kimikuri的服务端 一些Web程序(如密码生成器等) 其他应用程序(由于安全原因,隐去) 实现分析 这些需求,完全可以由一台有独立IP的VPS实现。 经过多方考虑,我最终采用了如下方案: 一个装有Debian的VPS Nginx作为Web前端 Let’s Encrypt/Cloudflare作为HTTPS提供者 Docker作为后端容器 Hugo作为静态博客生成器 GitHub私有仓库作为博客内容存储器 Webhookd作为博客更新触发器,自动从GitHub拉取博客更新,存放在VPS上 该方案的优势 轻量 拒绝NodeJS、拒绝PHP。 Hugo是一个Go编写的静态博客生成器,除了在更新内容时由Webhook调用之外,平时不需要运行,只需要让HTTP服务器展示静态页面。而Hexo需要在后端跑一个NodeJS引擎,懂的都懂,不懂的我也没法和你解释。 博客多端同步 在台式机上没有写完,可以直接以草稿的形式把当前内容commit到私有仓库,在笔记本上pull然后继续撰写。 撰写完毕后,可以将博文改为非草稿,然后commit,博客内容可以自动更新。 安全性 博客内容的传输使用Git,因此可以使用HTTPS/SSH。博客网站前端使用HTTPS为公网提供服务,前后端通信完全发生在本机回环地址,外部无法直接访问。 可扩展性 后端可以自由增加新内容,比如放一个CI上去,只需要增加一个新的容器、一个新的Nginx规则。

Feb. 9, 2021

Hello Hugo

Hello, Hugo! This is a test post. Open a terminal, type hugo. Then, it just works.

Jan. 13, 2021

SSH的正向代理/反向代理

Jan. 6, 2021

NAT穿透相关知识

根据RFC-3489,NAT有四种实现方式: Full Cone: A full cone NAT is one where all requests from the same internal IP address and port are mapped to the same external IP address and port. Furthermore, any external host can send a packet to the internal host, by sending a packet to the mapped external address. Restricted Cone: A restricted cone NAT is one where all requests from the same internal IP address and port are mapped to the same external IP address and port.

Jan. 5, 2021

在Windows Server上搭建OpenVPN服务器

引用维基百科对OpenVPN的解释:

OpenVPN is a virtual private network (VPN) system that implements

techniques to create secure point-to-point or site-to-site connections

in routed or bridged configurations and remote access facilities.

在Windows上搭建OpenVPN服务器

下载+安装

Dec. 25, 2020

使用Gradle构建.jar插件时的依赖配置问题:build.gradle

这个错误发生的原因是:在调试环境下(IDE内),引用的第三方library是存在于debug classpath内的(参考这篇文章),而在运行时,由于被引用的第三方library没有被包含到生产环境中,所以会出现问题。常规java项目只需要将此library放到我们的classpath里,或者导出时使用shadow等方式将依赖一起打包到.jar文件中,得到所谓的fat jar。由于我们是要写fabric插件,让服务器管理员手动配置classpath显然是不方便的,所以采用第二种方法。 通过参考其他配置文件,我使用这样的解决方法:在dependencies节中增加对应的include项,值与implementation相同,这一项会指示Gradle将该库一起打包到输出的jar中。这样一来,我们执行gradlew build就可以生成一个像其他插件一样可以直接使用的.jar文件了。

Dec. 8, 2020

Ubuntu下借助chroot搭建系统级隔离的FTP服务

(其实这是一个系统安全课程的实验,大多数流行的ftp服务端实现均已内置了基于chroot的目录隔离以及低权限启动daemon进程的安全措施,本实验选择ftp服务纯属偶然或者老师觉得比较方便,其实更常见的应用是搭建chroot隔离的HTTP、nodejs等web应用) chroot提供了一种系统级的文件系统隔离方案,能够将一个进程及其所有子进程所能访问的文件系统范围限制到某个目录树内。由chroot运行的程序无法访问到文件系统中位于它的根目录以外的任意文件,这由命令的名字“change root”可以看出。 这种严格而有效的限制是基于kernel所提供的同名系统调用实现的,用户在终端中所执行的命令chroot只是对这个系统调用的简单包装,它可以帮助用户启动一个chrooted的进程。借助该命令,用户可以方便地将某个程序“隔离”到某个目录下,假如有攻击者获取了该进程的控制权,它仍不能(其实不一定!)逃逸出这个目录,攻击者无法访问其它敏感数据、从而减小了攻击的威胁面。因此,被限制后的程序的活动范围又被称作“监狱”。 0x1 环境搭建 (1) 安装vsftpd 前面已经说过,chroot之后的进程只能看到某个目录下的文件、并将该目录视作它的根目录。这就意味着,该进程所需要的所有动态链接库、动态链接器、配置文件等依赖文件,都需要存放在该目录(指chroot系统调用所指定的目录)下。 本实验以vsftpd程序为例。该程序是一个易用的FTP服务端程序,在Ubuntu上可使用命令sudo apt-get install vsftpd进行安装。 安装后,使用sudo service vsftpd start启动FTP服务器。这时候,你应该可以在浏览器中使用ftp://localhost访问本机的FTP服务器了,这说明vsftpd安装无误。 (2) 配置vsftpd 编辑文件/etc/vsftpd.conf,允许匿名登录、解除vsftpd对用户根目录的限制(以便体现出我们手动chroot的效果),重启vsftpd服务,检查配置是否生效。这时,用户可以通过访问“..”来逃逸家目录。 (3) 配置监狱环境 本实验最难的环节来了:由于我们要在“监狱”内配置vsftpd,这需要我们把vsftpd所需的所有依赖均安装妥当。 (3.1) 用户登录信息 vsftpd会使用linux系统集成的身份验证机制进行登录,所以需要将/etc/passwd文件拷贝到监狱内。(在监狱目录下执行命令cp /path/to/file ./ --parent,下同) (3.2) vsftpd的二进制依赖 vsftpd的二进制文件位于/usr/sbin/vsftpd,需要将其拷贝到监狱内,并将其所使用的动态链接库全部拷贝到监狱内。 (3.3) 其它系统级依赖 vsftpd使用getpwnam函数获取系统级用户的信息,这个函数又依赖于nsswitch……我解决这一依赖问题的方法是:把/lib全部拷贝到监狱内。这一方案的副作用在于,浪费了一些磁盘空间,同时有泄露敏感二进制文件的可能(私有商业代码编译的私有库)。(这一方案也顺便解决了监狱内bash输入命令时退格键功能异常的奇怪现象,推测是少了某些二进制库,虽然bash能启动,但是没有报错) 题外话:至于我为啥发现vsftpd依赖getpwnam,是因为在配置好其他依赖后,运行vsftpd报错找不到用户(我指定的是nobody),然而这个用户一定存在!于是我就把错误消息贴到vsftpd代码库里搜索,找到了错误来源: twoprocess.c: const struct vsf_sysutil_user* p_user = str_getpwnam(p_user_str); if (p_user == 0) { die2("cannot locate user entry:", str_getbuf(p_user_str)); } secutil.c: p_user = str_getpwnam(p_user_str); if (p_user == 0) { die2("cannot locate user entry:", str_getbuf(p_user_str)); } 错误来自str_getpwnam函数返回0,继续追溯,这个函数调用了getpwnam,这是一个系统库API,继续追溯,发现是缺少一些lib,全部拷贝过去,问题解决。

Dec. 1, 2020

配置GitHub向通过Nginx反向代理的Jenkins发送WebHook

这样看来,似乎没有公网IP地址就没法使用WebHook了。实际上,还是有解决方案的。我有一个公网的反向代理,这个反向代理所代理的服务可以访问到Jenkins服务器。我们只需要让这个反向代理去代理一个Nginx,让Nginx把一个子目录转发到Jenkins所提供的REST API、其余目录仍不变,不就可以把Jenkins的Hook开到公网去了? 由于Nginx会过滤一些非标准请求头,而Jenkins需要用到一些自定义的请求头,所以需要在server一节中添加 ignore_invalid_headers off; 来禁用Nginx的过滤。 最后再添加代理规则: location /real-hook-path/ { proxy_pass http://path-to-your-jenkins-hook/; proxy_set_header X-Real-IP $remote_addr; proxy_method POST; } 就可以了。

Sep. 14, 2020

为IDA 7.0安装keypatch 2.2

keypatch是基于keystone-engine这个汇编引擎的。所以,要在IDA里使用keypatch,需要先安装keystone-engine。

keystone-engine是基于python的,所以你只需要pip install keystone-engine即可。需要注意的一点是,**需要先搞清楚IDA在用你电脑上的哪个python。**一般来说,IDA需要Python 2,我的电脑上安装了Python 2.7,所以IDA使用的是这个,而不是我常用的Python 3。一般来说,需要调用特定python的pip时,常使用python -m pip install keystone-engine

Jan. 1, 0001

把Manjaro作为主力操作系统使用

0. 前言 很久以前就用过桌面版的Ubuntu了,记得当时的版本还是14.xx。不过随着使用的深入以及Windows 10做的实在是越来越垃圾,我终于决定将我的物理机系统换为一个Linux。经过多方面考虑,我决定采用Manjaro这个基于Archlinux的发行版。 1. 安装Manjaro 首先打开官网,看看最新版的版本号是多少(避免因为意外下到旧版)。官方会给出三个DM的版本:Xfce、GNOME、KDE。这里我建议主流配置的电脑使用GNOME(Ubuntu 18+的默认桌面)或者KDE(BackTrack的默认桌面),这两个桌面都很漂亮(真的很漂亮),而且功能也非常多,适合刚接触Linux桌面的人使用。Xfce则轻量很多,虽然基本功能都有,但是配置起来要麻烦一些,适合高级用户使用。 看完最新打包的镜像版本后,我们可以找一个镜像站(清华的、中科大的、哈工大的、搜狐的等等),从镜像站里下载要比从官网下载快很多。 拿到镜像后,就可以写入到U盘里或者刻录到光盘里,得到一个启动介质,可以通过该介质进入Live CD、安装到硬盘。 启动的时候,可以选择是使用开源驱动或者专有驱动启动。因为我是AMD的APU,没有独显,所以驱动很方便,直接使用开源驱动启动就可以了。如果你是N卡用户,就选择使用专有驱动启动,这样Manjaro会帮你选择最适合你显卡的驱动程序。 安装流程没啥好说的,常规操作,键盘布局选CN就行,加密按需启用。需要注意的是,LUKS加密在我这里会出现开机偏慢的问题,具体表现在释放密钥过于慢。解决办法是创建一个迭代次数更少的密钥、并把旧的密钥删除。具体步骤可以搜一下。 2. 配置桌面环境 Manjaro的桌面环境还是很友好的,你可以按照自己的喜好去选择适合自己口味的主题。不过在此之前,应该先把基础的工具给配置好。 2.1. 科学上网 第一件事就是科学上网:我用的是qv2ray这个软件,可以从Archlinux的AUR源下载。不过这个GUI的作者因为怕被请去喝茶,并没有把v2ray核心内置到qv2ray里面,所以需要额外下载v2ray核心。具体方法可以参照其官方教程。 由于我们用的是Manjaro,而qv2ray是为Archlinux设计的,其适配的是最新的Archlinux的lib,由于Manjaro有额外的测试机制,会使得从Archlinux同步来的更新延迟一周左右才发布。因此,在Manjaro上可能会出现系统的运行时版本过旧而导致的二进制不兼容问题。解决方案就是没问题就不升级qv2ray。qv2ray的维护者也说了,自己不会去关照Manjaro用户,毕竟咱们是二次衍生版本。而Manjaro这样做的好处就是系统更加稳定了,除了qv2ray这样的AUR软件外,其余软件更加稳定。 2.2 中文输入 Manjaro没有自带中文输入法,这里我用的是fcitx这个框架搭配其自带的中文输入法。或者你也可以安装一个搜狗拼音来用。安装完毕后,重启系统,可以在右键任务栏的图标里打开设置菜单,里面可以设置切换输入法的快捷键。 2.3 中文字体 Manjaro和绝大多数Linux发行版一样,默认的中文字体都很丑,且字形不对(是日文汉字字形)。可以装一个文泉驿字体,在系统设置和浏览器设置里把它设置为默认的汉字字体。字体文件可以直接放到/usr/share/fonts里,然后执行fc-cache来刷新字体缓存。重启系统后,中文显示应该就正常了。 2.4 开发环境 常用的开发工具基本都可以在系统商店里安装,具体过程搜索即可。 2.5 高DPI显示设置 各个桌面环境都支持200%缩放,如果你是4K高分屏,那么基本上设置成200%就可以了。但是,目前Linux对125%、150%这种缩放比例的支持不太好,我已知支持最好的是Unity,但是那个需要自己去安装,过于麻烦。其次就是GNOME和KDE了,这两个的支持也都很不错。最次的我感觉是Xfce,基本上只能调节字体大小,不过调完一遍后也能接受,基本够用了。 2.6 以腾讯QQ、微信为首的中国特色流氓软件 这种软件,建议直接VirtualBox走起,里面装个Windows,然后跑QQ。这是最完美体验的解决方案。稍微轻量一些的是用深度打包的Wine QQ,在AUR源里也有提供,自行安装即可。不过中文字体需要另外设置,而且可能遇到收不到图片的问题,也需要自己再设置。微信的话,建议使用网页版。不过既然都用Linux了,为什么不用Telegram呢? 2.7 迁移到Firefox 在Windows下面装一个Firefox,将Chrome或者新Edge的设置导入进来,再注册一个Firefox账户,同步过去即可。 3. 配置其他杂项设置 3.1 视频终端字体大小 如果你的显示器DPI高于标准值,那么文字终端的字符应该会很小。可以在/etc/vconsole.conf里设置FONT=latarcyrheb-sun32来使用一个稍微大点的字体,每次开机系统初始化后,字体就会变大了。 3.2 全盘备份 推荐使用系统自带的Timeshift工具,有基于rsync和基于文件系统的写时复制两种模式。 3.3 Windows 远程桌面 Remmina是一个不错的替代品~~,虽然我还没有用过~~。 启用共享剪切板支持:sudo pacman -S parcellite xdotool 3.4 文件搜索(Xfce) Xfce的thunar没有内置的文件搜索功能(是因为其 do one thing and do it well 的 Unix哲学)。不过我们可以使用catfish来进行局部/全盘搜索,速度比Windows自带的要高到不知道哪里去了。在编辑-配置自定义动作里创建一个新的动作,绑定一个热键(如Ctrl-F),命令设置为catfish --path=%f,并且允许选中文件夹时触发,即可做到方便的搜索了。 3.5 Minecraft 推荐使用HMCL或者MultiMC来启动Minecraft,这两个启动器都是全平台的,且在Linux下的使用体验非常好。但是,有一个比较严重的问题我还没有解决:无法在游戏内输入中文。参考这篇文章,由于使用了GLFW,理论上在1.

Jan. 1, 0001

把Manjaro作为主力操作系统使用

0. 前言 很久以前就用过桌面版的Ubuntu了,记得当时的版本还是14.xx。不过随着使用的深入以及Windows 10做的实在是越来越垃圾,我终于决定将我的物理机系统换为一个Linux。经过多方面考虑,我决定采用Manjaro这个基于Archlinux的发行版。 1. 安装Manjaro 首先打开官网,看看最新版的版本号是多少(避免因为意外下到旧版)。官方会给出三个DM的版本:Xfce、GNOME、KDE。这里我建议主流配置的电脑使用GNOME(Ubuntu 18+的默认桌面)或者KDE(BackTrack的默认桌面),这两个桌面都很漂亮(真的很漂亮),而且功能也非常多,适合刚接触Linux桌面的人使用。Xfce则轻量很多,虽然基本功能都有,但是配置起来要麻烦一些,适合高级用户使用。 看完最新打包的镜像版本后,我们可以找一个镜像站(清华的、中科大的、哈工大的、搜狐的等等),从镜像站里下载要比从官网下载快很多。 拿到镜像后,就可以写入到U盘里或者刻录到光盘里,得到一个启动介质,可以通过该介质进入Live CD、安装到硬盘。 启动的时候,可以选择是使用开源驱动或者专有驱动启动。因为我是AMD的APU,没有独显,所以驱动很方便,直接使用开源驱动启动就可以了。如果你是N卡用户,就选择使用专有驱动启动,这样Manjaro会帮你选择最适合你显卡的驱动程序。 安装流程没啥好说的,常规操作,键盘布局选CN就行,加密按需启用。需要注意的是,LUKS加密在我这里会出现开机偏慢的问题,具体表现在释放密钥过于慢。解决办法是创建一个迭代次数更少的密钥、并把旧的密钥删除。具体步骤可以搜一下。 2. 配置桌面环境 Manjaro的桌面环境还是很友好的,你可以按照自己的喜好去选择适合自己口味的主题。不过在此之前,应该先把基础的工具给配置好。 2.1. 科学上网 第一件事就是科学上网:我用的是qv2ray这个软件,可以从Archlinux的AUR源下载。不过这个GUI的作者因为怕被请去喝茶,并没有把v2ray核心内置到qv2ray里面,所以需要额外下载v2ray核心。具体方法可以参照其官方教程。 由于我们用的是Manjaro,而qv2ray是为Archlinux设计的,其适配的是最新的Archlinux的lib,由于Manjaro有额外的测试机制,会使得从Archlinux同步来的更新延迟一周左右才发布。因此,在Manjaro上可能会出现系统的运行时版本过旧而导致的二进制不兼容问题。解决方案就是没问题就不升级qv2ray。qv2ray的维护者也说了,自己不会去关照Manjaro用户,毕竟咱们是二次衍生版本。而Manjaro这样做的好处就是系统更加稳定了,除了qv2ray这样的AUR软件外,其余软件更加稳定。 2.2 中文输入 Manjaro没有自带中文输入法,这里我用的是fcitx这个框架搭配其自带的中文输入法。或者你也可以安装一个搜狗拼音来用。安装完毕后,重启系统,可以在右键任务栏的图标里打开设置菜单,里面可以设置切换输入法的快捷键。 2.3 中文字体 Manjaro和绝大多数Linux发行版一样,默认的中文字体都很丑,且字形不对(是日文汉字字形)。可以装一个文泉驿字体,在系统设置和浏览器设置里把它设置为默认的汉字字体。字体文件可以直接放到/usr/share/fonts里,然后执行fc-cache来刷新字体缓存。重启系统后,中文显示应该就正常了。 2.4 开发环境 常用的开发工具基本都可以在系统商店里安装,具体过程搜索即可。 2.5 高DPI显示设置 各个桌面环境都支持200%缩放,如果你是4K高分屏,那么基本上设置成200%就可以了。但是,目前Linux对125%、150%这种缩放比例的支持不太好,我已知支持最好的是Unity,但是那个需要自己去安装,过于麻烦。其次就是GNOME和KDE了,这两个的支持也都很不错。最次的我感觉是Xfce,基本上只能调节字体大小,不过调完一遍后也能接受,基本够用了。 2.6 以腾讯QQ、微信为首的中国特色流氓软件 这种软件,建议直接VirtualBox走起,里面装个Windows,然后跑QQ。这是最完美体验的解决方案。稍微轻量一些的是用深度打包的Wine QQ,在AUR源里也有提供,自行安装即可。不过中文字体需要另外设置,而且可能遇到收不到图片的问题,也需要自己再设置。微信的话,建议使用网页版。不过既然都用Linux了,为什么不用Telegram呢? 2.7 迁移到Firefox 在Windows下面装一个Firefox,将Chrome或者新Edge的设置导入进来,再注册一个Firefox账户,同步过去即可。 3. 配置其他杂项设置 3.1 视频终端字体大小 如果你的显示器DPI高于标准值,那么文字终端的字符应该会很小。可以在/etc/vconsole.conf里设置FONT=latarcyrheb-sun32来使用一个稍微大点的字体,每次开机系统初始化后,字体就会变大了。 3.2 全盘备份 推荐使用系统自带的Timeshift工具,有基于rsync和基于文件系统的写时复制两种模式。 3.3 Windows 远程桌面 Remmina是一个不错的替代品~~,虽然我还没有用过~~。 启用共享剪切板支持:sudo pacman -S parcellite xdotool 3.4 文件搜索(Xfce) Xfce的thunar没有内置的文件搜索功能(是因为其 do one thing and do it well 的 Unix哲学)。不过我们可以使用catfish来进行局部/全盘搜索,速度比Windows自带的要高到不知道哪里去了。在编辑-配置自定义动作里创建一个新的动作,绑定一个热键(如Ctrl-F),命令设置为catfish --path=%f,并且允许选中文件夹时触发,即可做到方便的搜索了。 3.5 Minecraft 推荐使用HMCL或者MultiMC来启动Minecraft,这两个启动器都是全平台的,且在Linux下的使用体验非常好。但是,有一个比较严重的问题我还没有解决:无法在游戏内输入中文。参考这篇文章,由于使用了GLFW,理论上在1.