新手安装archlinux适合什么人,无线连接时候出现的,这是怎么回事

启动引导使用GRUB,并假设第一分区是/dev/sdb1。先挂载分区
sudo mount /dev/sdb1 /mnt
然后安装BIOS引导
sudo grub-install --target=i386-pc --boot-directory=/mnt/boot --recheck /dev/sdb
再安装EFI引导
sudo grub-install --target=x86_64-efi --efi-directory=/mnt --boot-directory=/mnt/boot --removable --recheck
假设其他文件都存放于第二分区(/dev/sdb2),并包含以下目录/文件
-- images/archlinux.iso
-- images/ubuntu-gnome.iso
则建立/mnt/boot/grub/grub.cfg文件,并写入以下内容
insmod search_fs_uuid
set rootuuid=[第二分区的UUID]
set rootpath=/dev/disk/by-uuid/$rootuuid
search --no-floppy --set=rootpart --fs-uuid $rootuuid
insmod vbe
insmod efi_gop
insmod efi_uga
insmod font
if loadfont ${prefix}/fonts/unicode.pf2
insmod gfxterm
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm
menuentry 'Slax' {
set syspath=/slax
set root=$rootpart
linux $syspath/boot/vmlinuz from=$syspath vga=normal load_ramdisk=1 prompt_ramdisk=0 printk.time=0 slax.flags=perch,xmode
initrd $syspath/boot/initrfs.img
menuentry '[LiveCD] Archlinux' {
set isopath=/images/archlinux.iso
loopback loop ($rootpart)$isopath
linux (loop)/arch/boot/x86_64/vmlinuz archisodevice=/dev/loop0 img_dev=$rootpath img_loop=$isopath
initrd (loop)/arch/boot/x86_64/archiso.img
menuentry '[LiveCD] Ubuntu (GNOME)' {
set isopath='/images/ubuntu-gnome.iso'
loopback loop ($rootpart)$isopath
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isopath locale=zh_CN.UTF-8
initrd (loop)/casper/initrd.lz
其中[第二分区的UUID]可以通过以下命令获取:
sudo blkid /dev/sdb2
其它ISO的启动可以参考Archwiki中给出的例子。
June 27, 2017
首先打开 Steam 的大屏幕模式啦~
然后把控制器设置中的 “PlayStation 4 控制器支持” 打开。
有那个心情的话可以去调整一下偏好设置(
支持控制器的游戏会有一个控制器图标 ?
需要的话就调整游戏对应的控制器设置
但是咱不承接按键配置服务(如果有人送咱想设置的游戏的话咱倒是可以试试 ?
可以试试一个叫
的小工具,
不管是下载还是安装都在那了 ?
其它发行版应该也可以 ?
可以试试一个叫
的小工具,
Arch 的话可以从 AUR 里装(
接着在 ~/.config/ds4drv.conf 写个配置文件,可以看看
写完了就启动一下试试?
对咱又水了一篇 ?
June 05, 2017
最近稍微有点时间折腾了下 Cisco 的三层交换,尝试搭建了一套数据中心用的流量统计/监控/报告系统。过程不是很复杂,但是也只算利用了一套高级软件组合的一点点功能。之后打算继续研究更多的功能实现,不过也要看有没有时间了…
准备工作首先确认出口路由设备支持 netflow/sflow 的对应版本。一般 Cisco 的路由器或者三层交换都是支持的。
然后准备一个常见的 Linux 系统,虚拟机或者物理机都可以。
出口路由设备能够连通到该 Linux 系统,并且 flow collector 设置到该 Linux 系统的 IP 地址和对应端口。
FastNetMon fastnetmon,只需要一条简单的脚本命令。
然后将所有要监控的网段加入 /etc/networks_list。一行一个,例如:
12310.1.0.0/16192.168.254.0/248.8.0.0/16
按照安装文档打开两个终端,分别启动主进程和客户端
1/opt/fastnetmon/fastnetmon
1/opt/fastnetmon/fastnetmon_client
如果没有问题,应该在客户端上可以看到收到的 flow 数据。
先关闭 fastnetmon 进程,修改配置文件打开 Graphite 支持:
1234graphite = ongraphite_host = 127.0.0.1graphite_port = 2003graphite_prefix = fastnetmon
InfluxDB InfluxDB,官方提供了各种包管理器的安装方式。
配置文件一般位于 /etc/influxdb/influxdb.conf,需要根据环境做安全相关设置(侦听地址、端口、鉴权、etc)并打开 Graphite Simulation
1234567891011121314151617[[graphite]]
enabled = true
bind-address = "127.0.0.1:2003"
database = "flow_dc1"
protocol = "tcp"
consistency-level = "one"
name-separator = "."
batch-size = 5000
batch-timeout = "1s"
templates = [
"fastnetmon.hosts.* app.measurement.cidr.direction.function.resource",
"fastnetmon.networks.* app.measurement.cidr.direction.resource",
"fastnetmon.total.* app.measurement.direction.resource"
顺序重启 InfluxDB 和 fastnetmon。检查 flow 数据是否记录到 InfluxDB:
1234567891011$ influxConnected to http://localhost:8086 version 1.2.4InfluxDB shell version: 1.2.4& use flow_dc1Using database flow_dc1& select mean(value) from networks where direction = 'incoming' and resource = 'bps' group by *name: networkstags: app=fastnetmon, cidr=10_1_0_0_24, direction=incoming, resource=bpstime mean0
GrafanaGrafana 是一款非常强大且易用的数据可视化工具。 Grafana 然后修改配置文件的必要部分,配置文件一般位于 /etc/grafana/grafana.ini。
完成后重启 Grafana,将浏览器指向 Grafana 的 HTTP 服务器地址即可看到登录界面。如果内部使用的话,建议关闭匿名访问和注册功能。
使用默认的 admin / admin 登录,按照引导完成配置、添加数据源(Data source),数据源即是 InfluxDB 的 HTTP API 地址。如果 Grafana 中限制了数据源白名单,需要将 InfluxDB 的 HTTP API 地址和端口加到白名单里。
添加面板、Graph,在 Graph 编辑模式里写入类似这样的查询语句:
1SELECT mean("value") FROM "networks" WHERE "direction" = 'incoming' AND "resource" = 'bps' AND "cidr" =~ /^10_1_0_0_16/ AND $timeFilter GROUP BY time($interval) fill(previous)
即可看到有图表出现。根据需求完善查询语句和图表配置即可简单实现各种可视化效果。例如流量和数据包的实时报告:
总结通过配合 FastNetMon,InfluxDB 和 Grafana 即可快速实现一套基于 NetFLOW / sFLOW 的流量统计报告系统。但是 FastNetMon 的功能远不止流量统计,Grafana 也有大量插件和灵活的用法可以满足更多需求。如果配置合理,此方案也可适用于 40Gbps+ 接入的中型数据中心且成本低廉。以及——
InfluxDB 真的很快!
Grafana 的图表真的很省资源!
Chronograph 卡死了我的浏览器!(i7-7700K / Chrome)
以及一大早手工修好了 K812 的耳机线,省掉了 2 万日元的线材费用非常开心最近稍微有点时间折腾了下 Cisco 的三层交换,尝试搭建了一套数据中心用的流量统计/监控/报告系统。过程不是很复杂,但是也只算利用了一套高级软件组合的一点点功能。之后打算继续研究更多的功能实现,不过也要看有没有时间了…
May 30, 2017
这个应该不用多说了吧 ? 简而言之 MBR 就 dd UEFI 就格式化完直接把 ISO 里的文件
复制到 U 盘上咯~
如果有 Windows 的话就用 rufus ?
然后启动进去进行必要的配置
不过因为只是修复而已,连上网设置好镜像就行(如果汝原来的系统里的 pacman 没坏的
话,就连上网就行咯~)
然后把原来的 Arch 挂载到某个目录 (例如 /mnt )。
当然是 arch-chroot 一把梭咯 ?
arch-chroot /mnt
然后遇到啥问题就治啥咯~
用 live 的 pacman 操作原来的系统的话,记得带上 --root 和 --dbpath 选项。
例如这样重装 pacman :
pacman -S pacman --root /mnt --dbpath /mnt/var/lib/pacman
或者这样隔空滚系统(雾:
pacman -Syu --root /mnt --dbpath /mnt/var/lib/pacman
或者这样重装所有包(大雾:
pacman -S $(pacman -Qq --dbpath /mnt/var/lib/pacman) --root /mnt --dbpath /mnt/var/lib/pacman
如果没法治疗的话,还可以重装啊(跑 ?
May 17, 2017
可能以后还会更新…… ?
一上来或者一言不合就菊苣啦大佬啦大神啦一类的叫。
嗯地球上最不会灭绝的物种就这些了……
/me 提问然后没人搭理,一种被阿卡林附身的感觉 ?
就算不知道说不知道也好啊(虽然有人认为不知道就保持沉默没什么问题……
解决问题时跑题跑的漫无边际,最后问题也没解决……
先解决当下的问题再来优化好不好 ……
新人来提问然后被甩一脸提问的智慧然后被吓跑
别忘了咱和汝曾经也是新手过嘛,态度温和点呗……
虽然大家都很忙不想在朽木上浪费时间……
太早的给某人下判断,例如笨蛋智障一类的
在主题群里跑题跑的漫无边际 ?
Don't feed ……
the trolls ! ?
没有共同语言……
那咱进去干什么……
好吧一时就想起来这些…… ??
May 15, 2017
由于 Arch Build System 的相关服务器端脚本的维护开销日益增高,我们决定放弃 abs 及其相关的通过 rsync 获取 PKGBUILD 的服务。
extra 仓库中的另一个工具 asp 能够提供类似 abs 的功能。它的命令 asp export pkgname 可以作为直接替代。关于它的更多用法细节请参考。以及可以通过 Subversion sparse checkout 实现类似的功能,。如果想要获取所有的 PKGBUILD ,我们建议 clone
我们已经从 extra 仓库移除了 abs 包,并且计划在本月月底停止运行相应的 rsync 接入点( rsync://rsync.archlinux.org/abs )。
May 08, 2017
去买块树莓派,吃了 装好 Arch Linux ARM :
用 hostapd 做好热点。
在树莓派上设置好 shadowsocks 的自动分流。
不过要修改 ss-redir 的配置文件,让 ss-redir 监听在 0.0.0.0 上 ?
这时连接汝的 AP 时应该能正常访问没被墙的网站,树莓派上也能访问被墙的网站( curl 一下试试?)
如果汝和咱一样用了
的话,打开那个脚本 (应该在 /opt/shadowsocks-auto-redir/shadowsocks-auto-redir )。
然后找到这一行 ,在下面加上一行:
# Redirect to ss-redir port
LOCAL_PORT=`jq -r ".local_port" $CONFIG_PATH`
do_iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port $LOCAL_PORT
# do_iptables -t nat -A PREROUTING -i &汝 AP 的接口名称& -p tcp -j REDIRECT --to-ports $LOCAL_PORT
# 这一行大概就是把来自汝 AP 的 TCP 连接转发给 $LOCAL_PORT 端口的 ss-redir 来处理?
do_iptables -t nat -A PREROUTING -i wlan0_ap -p tcp -j REDIRECT --to-ports $LOCAL_PORT
感觉自己还是用要学习一个 iptables 呐~
保存以后重新启动一下服务来试试效果呗~
May 04, 2017
Minecraft 的 lag 问题已经司空见惯,各种控制资源消耗和卡顿的插件也层出不穷。但是它们几乎都非常用力地在一个点上:控制实体数量。
这并不无道理,因为 Minecraft 中最消耗资源的部分就是实体。但是暴力控制实体数量会导致刷怪塔无法正常工作、掉落物清理速度过快等问题,在生存服务器中可能引发玩家的强烈不满。
所以,开发组从另一个角度做出了一些尝试。
启发生物实体的数量巨大,主要集中的地区显然不是野外的自然刷怪区,而是玩家聚集的刷怪场、村民工程、动物养殖场等。如果不限制生物的数量和密度同时降低资源消耗,那么只能从生物实体的特性入手了。
Minecraft 最近的版本中引用了 NoAI 的 NBT Tag,带有此标签的生物将不会进行 AI 计算。换句话说,除了占用服务器内存中的一点数据,几乎不会对这个生物实体有任何其他的 CPU 算力消耗。
也就是说,实体消耗的算力资源,绝大部分都是 AI 计算的消耗。
方案抓上一票人做了一些测试,结果证实生物失去 AI 后大幅降低了 CPU 的算力消耗。这是个 positive 的信号,但是接下来的测试则遇到了问题。
对于养殖场,等生物数量变化不大(或者说只是定期来清理并重新养殖一次)的设施,生物失去 AI 的影响很小,只有在重新繁殖时需要恢复 AI。但是刷怪塔则因为生物没有 AI,同时也被强制不受重力影响而几乎无法使用,即便同时设置 NoGravity 为 false 也无效。
提到了 Spigot 的一个 nerf-spawner-mobs,开启时刷怪笼生成的生物将不会拥有 AI,但是会被外界影响(例如水流和火球等)而移动。这个选项是全局的,因此不需要开启,只需要反射 spigot 中设置该功能的方法即可。
于是整个方案的流程便是当服务器卡顿时抑制生物密集区的生物 AI 从而降低资源占用,同时最大程度上保证玩家对生物的需求。「服务器卡顿」的考量以服务器 TPS 而非实体数量为准,当服务器 TPS 高于一定值时即认为服务器没有超负荷,不会有任何操作,最大程度上利用硬件的性能。
实现插件主要由开发组的
编写,源代码以 MIT 协议发布在
插件每隔一段时间扫描服务器的 TPS 确认运行状况,如果 TPS 低于阈值则触发 AI 控制,TPS 高于一定值且持续一段时间即认为服务器已恢复正常运行状态,自动恢复被抑制的实体 AI 减少对生存体验的影响。
实现过程中额外添加了一些额外可能被生存服务器用到的功能:
per-world 控制,如果玩家需要建造以仇恨为基础的小黑塔,可以关闭对末地的控制。
实体总量和单区块实体密度在 AI 抑制时纳入考虑,更加精准抑制资源消耗较高的区块。
测试 插件在
服务器中应用测试。由于近期玩家数量爆炸式增长(日常在线 5 人到 ~30 人甚至 50 人),各种实体控制插件均告无效。yasui 插件应用后被证实数次发挥作用,没有任何实体数量限制的前提下将服务器 TPS 稳定在 19 以上,服务器实体承载数量从 ~2500 提到至接近 5000,并且还有继续提高的可能(数次触发中最高一次单世界实体记录是 4808,其他世界中仍有大约 2000 实体未被计入)。
吐槽:你们贼能刷Minecraft 的 lag 问题已经司空见惯,各种控制资源消耗和卡顿的插件也层出不穷。但是它们几乎都非常用力地在一个点上:控制实体数量。
这并不无道理,因为 Minecraft 中最消耗资源的部分就是实体。但是暴力控制实体数量会导致刷怪塔无法正常工作、掉落物清理速度过快等问题,在生存服务器中可能引发玩家的强烈不满。
所以,开发组从另一个角度做出了一些尝试。
May 03, 2017
&- 官方的文档……
首先先装上 nodejs 和 npm (装过 VisualEditor 的应该就有了啦)
还有 Mathoid 的依赖,在 Arch 上大概是这些:
# pacman -S librsvg pkg-config
然后从 AUR 装
然后新建个文件夹 喜闻乐见 npm install ......
npm install mathoid
cd node_modules/mathoid
node server.js
没问题的话 Mathoid 就应该跑在
上了,算了抄个 systemd 系统单元好了……
Description=Mediawiki Mathoid Service
Documentation=https://www.mediawiki.org/wiki/Mathoid
Wants=local-fs.target network.target
After=local-fs.target network.target
WantedBy=multi-user.target
Type=simple
User=nobody
Group=nobody
WorkingDirectory=/path/to/mathoid
ExecStart=/usr/bin/node /path/to/mathoid/server.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog
&- 官方的文档……
然后找个地方 clone 一下 RESTBase 的版本库,然后 喜闻乐见 npm install ...... ,
再把样例配置文件复制一份出来备用:
cd restbase
npm install
cp config.example.yaml config.yaml
接着改些字段,注意 yml 和 Python 一样要求一致的缩进 ?
# 跳过前面的一大把注释……
- name: restbase
module: hyperswitch
port: 7231
salt: secret
default_page_size: 125
user_agent: RESTBase
ui_name: RESTBase
ui_url: https://www.mediawiki.org/wiki/RESTBase
ui_title: RESTBase docs
x-request-filters:
- path: lib/security_response_header_filter.js
x-sub-request-filters:
- type: default
name: http
# 设置允许哪些来源访问。
# 至少要把汝 wiki 的 API 和 Parsoid 的位置写进去。
# 一会儿还要把 Mathoid 的位置写进去
- pattern: http://localhost/w/api.php
forward_headers: true
- pattern: http://localhost:10044
forward_headers: true
- pattern: http://localhost:8000
forward_headers: true
# 这行是默认的,大概是允许所有 HTTPS 连接?
- pattern: /^https?:\/\//
# 汝 wiki 的域名,像设置 Parsoid 时一样。
/{domain:wiki.yoitsu.moe}:
x-modules:
- path: projects/example.yaml
# 汝 wiki api.php 的位置
apiUriTemplate: https://wiki.yoitsu.moe/w/api.php
# RESTBase URI,默认像这个样子……
baseUriTemplate: "{{'http://{domain}:7231/{domain}/v1'}}"
# 咱搞的像这个样子(暂时的)
baseUriTemplate: "{{'http://localhost:7231/{domain}/v1'}}"
# 汝的 Parsoid 的位置
host: http://localhost:8000
# 只有需要 Mathoid 时需要这一段,把汝的 Mathoid 的位置写进去。
host: http://localhost:10044
backend: sqlite
dbname: db.sqlite3
pool_idle_timeout: 20000
retry_delay: 250
retry_limit: 10
show_sql: false
# 要搞 Mathoid 的贴上这一段。
# 咱不知道为啥能用 ……
/{domain:wikimedia.org}:
x-modules:
- path: projects/wikimedia.org.yaml
# 汝 wiki api.php 的位置
apiUriTemplate: https://wiki.yoitsu.moe/w/api.php
# RESTBase URI,默认像这个样子……
baseUriTemplate: "{{'http://{domain}:7231/{domain}/v1'}}"
# 咱搞的像这个样子(暂时的)
baseUriTemplate: "{{'http://localhost:7231/{domain}/v1'}}"
# 汝的 Parsoid 的位置
host: http://localhost:8000
# 汝的 Mathoid 的位置
host: http://localhost:10044
backend: sqlite
dbname: db.sqlite3
pool_idle_timeout: 20000
retry_delay: 250
retry_limit: 10
show_sql: false
# Finally, a standard service-runner config.
name: restbase
name: restbase
level: info
保存然后 npm start ?
如果汝不是通过远程访问执行的命令,可以在浏览器上打开
来进行测试.试着加载
或者祭出 curl :
curl /汝设置的域名/v1/page/html/汝wiki上的一个页面
成功的话会看到汝那个页面的 HTML 代码。
再抄个 systemd 系统单元好了……
Description=Mediawiki RESTBase Service
Documentation=https://www.mediawiki.org/wiki/RESTBase
Wants=local-fs.target network.target
After=local-fs.target network.target
WantedBy=multi-user.target
Type=simple
User=nobody
Group=nobody
WorkingDirectory=/path/to/restbase
ExecStart=/usr/bin/node /path/to/restbase/server.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog
然后启动这两个服务。
# $wgVisualEditorRestbaseURL 大概像 http://汝RESTBase服务的位置/汝wiki的域名/v1/page/html/
$wgVisualEditorRestbaseURL = "http://localhost:7321/wiki.yoitsu.moe/v1/page/html/";
# $wgVisualEditorFullRestbaseURL 大概像 http://汝RESTBase服务的位置/汝wiki的域名/
$wgVisualEditorFullRestbaseURL = "http://localhost:7321/wiki.yoitsu.moe/";
# 首先加载 Math 扩展
require_once "$IP/extensions/Math/Math.php";
# 设置渲染方式为源代码和 MathML
$wgMathValidModes = array( 'source' ,'mathml');
# 设置默认使用 MathML
$wgDefaultUserOptions['math'] = 'mathml';
# 汝的 Mathoid 服务的地址
$wgMathMathMLUrl = 'http://localhost:10044/';
# 如果汝用了咱上面那种糊法,$wgMathFullRestbaseURL 这么写 ??♀
$wgMathFullRestbaseURL= 'http://localhost:7231/wikimedia.org/';
如果需要的话运行下维护脚本。
最后的效果大概像这样:
两个编辑器之间的切换更顺畅了 ?
公式出来了 ?
下面的乐谱靠的是
?? 不过介于 RESTBase 本身还在开发,所以小心翻车……
May 01, 2017
? 好像真没啥特别的(毕竟才建起来?)
硬塞一个特点的话就是 Writer 都是狼??
算了以后慢慢塑造好了……
哇汝想来了啊 ? 勇气可嘉……
如果有 Telegram 的话 :
或者 Twitter :
Twitter 字数限制比 Mastodon 少啦~
或者 Mastodon :
的 instance ?
然后转发到 Mastodon 的机器人是咱最近糊出来的,所以可能会炸…… ?
[xmppbot] [Lisa] KenOokamiHoro: 老板问我今天晚上加班么我说不加,问我为啥,我说有约。问我是上回周五约我那个么,我说不是,我每周五都有不同的人约。老板想了一下说:你约完把他们都杀了么。
[[HoroServ]] 他们都被吃掉了
[ヨイツの賢狼ホロ ?(???*)] ???
[Chino ? (Frantic1048 )] 这很萌狼(
接入 IRC / RSS 支持?
April 22, 2017
首先要把 openssh 装上啦,具体看发行版了呗(比如有些是把客户端和服务端拆分成
openssh-client 和 openssh-server 一类的,有的就直接是一个大包 openssh 了呗~ )
然后服务器上生成一下主机密钥咯,这个操作大概启动 sshd (ssh daemon 的缩写?)服务
时多半就会自动完成了吧…… 大概像这样?
有 Systemd 的发行版:
# systemctl start sshd
有 sysVinit 或者 upStart 的发行版:
# /etc/init.d/sshd start
然后记下来服务器的 IP 地址咯~
ssh [&用户名&@]&主机名或者IP地址&
如果没有用户名的话,就会用汝当前的用户名作为连接到服务器时使用的用户名咯~
下面的例子里咱其实是自己连自己了……
第一次连接时大概像这样:
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:ZrEikKJj6wqLk8Cqgs6JWXGX3FgS2iQI6aK73GTCHVk.
Are you sure you want to continue connecting (yes/no)?
大概的意思就是“咱好像不记得汝要去的这个地方呐~”,毕竟是第一次连接嘛。
如果汝在连接其它人的服务器的话,可以让他/她/它把服务器的指纹发来确认一下。
如果确认了以后,就输入 yes 让 ssh 客户端记下来。
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
horo@localhost's password:
这里输入密码。记得输入密码时就是什么都没有,不用担心键盘坏了啦~
Last login: Thu Mar
9 23:00:10 2017
[horo@Yoitsu_SurfaceBook horo] $
这样大概就是登录成功了呗,如果工作做完了以后,记得关闭连接呐~
[horo@Yoitsu_SurfaceBook horo] $ exit
Connection to localhost closed.
为啥要用密钥登录?其实咱也说不清楚……
大概是因为不容易泄漏和不容易暴力破解?
首先生成一对密钥:
$ ssh-keygen -t rsa -b 4096
其中的 -t rsa 表示加密算法的类型是 RSA
其中的 -b 4096 表示密钥是 4096 bit
注意不同加密算法的位数是没有可比性的啦~
对于 RSA 加密算法而言, &2048 bit 应该足够安全了呗~
(然而默认是 1024 bit 的,只好手动加点……)
整个过程大概像这样:
[horo@Yoitsu_SurfaceBook ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
# 密钥存在哪?
Enter file in which to save the key (/home/horo/.ssh/id_rsa):
# 为私钥设置一个密码
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/horo/.ssh/id_rsa.
Your public key has been saved in /home/horo/.ssh/id_rsa.pub.
The key fingerprint is:
# 这是密钥的指纹啦~
SHA256:nySil+IhkH0yDg1eYFIOdY8Zq7j3vxo6Wlab9znx17Q horo@Yoitsu_SurfaceBook
The key's randomart image is:
+---[RSA 2048]----+
|=.* o . S .
| = = + o.+ .
| +.= * .... . E
|....+oo.o. .
+----[SHA256]-----+
把这对密钥的公钥( /home/horo/.ssh/id_rsa.pub )添加到 authorized_keys 里:
$ cat /home/horo/.ssh/id_rsa.pub & /home/horo/.ssh/authorized_keys
因为 sshd 默认会从 authorized_keys 里寻找接受哪些密钥连接啦~
把私钥 (/home/horo/.ssh/id_rsa )复制到汝自己的电脑上咯~
然后连接服务器时,用 -i 参数指定使用哪一个私钥文件:
$ ssh [&用户名&@]&主机名或者IP地址& -i &私钥文件的路径&
如果汝遇到了这样的错误:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WARNING: UNPROTECTED PRIVATE KEY FILE!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0755 for '/home/horo/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/horo/.ssh/id_rsa": bad permissions
这表示汝的私钥的权限设置的不对啦 &_&
对于私钥文件这种只需要读取的文件来说,自己能读就足够啦~
$ chmod 400 &私钥文件的路径&
类 Unix 系统的权限位大多数都是像这样的八进制数啦,三位从左向右
分别表示文件的所有者,所属于的组,和其它人分别拥有的权限。
而其中 4 表示读,2表示写,1表示执行啦~
所以 400 = 自己只能读,所属的组和其它人看都不能看!
关于文件权限的更多内容,就先从维基百科开始咯~:
而保护私钥文件的措施,推荐这篇文章:
如果汝设置了私钥密码的话,需要在连接时输入私钥的密码(而不再是汝用户的密码了呐~)
如果可以成功登录了的话,就可以关掉密码登录了呗:
用汝喜欢的文字编辑器(和 root 权限)打开 /etc/ssh/sshd_config 文件,
找到 PasswordAuthentication 这一行,把后面的 yes 改成 no 。
如果没有的话就自己加一行 PasswordAuthentication no 咯~
顺便可以禁止用 root 登录:
找到 PermitRootLogin 这一行,把后面的 yes 改成 no 。
如果没有的话就自己加一行 PermitRootLogin no 咯~
然后保存,记得需要重新启动 sshd 服务才能生效咯~
可以稍微防止被扫描到?
用汝喜欢的文字编辑器(和 root 权限)打开 /etc/ssh/sshd_config 文件,
找到 #Port 22 这一行,去掉前面的 # 号,然后自己设定一个数。
保存,记得需要重新启动 sshd 服务才能生效咯~
另外,大多数配置文件中 # 开头的行都是为了方便记忆和理解写下的注释,
虽然程序不会用到,但是有时也很有用呐~
如果设置了不同的端口,连接时加上 -p 选项:
$ ssh [&用户名&@]&主机名或者IP地址& -i &私钥文件的路径& -p &汝所设置的端口&
其实 ssh 的选项很多啦(不过咱就会这几个……),其它的选项怎么用,
汝可以 man 一下咯~
随着命令越来越复杂,写的也越来越长,对记忆力也是个考验了呐~
所以 ssh 客户端可以通过配置文件来简化一些操作呐~
用汝喜欢的文字编辑器打开汝主文件夹下的 .ssh/config 文件,
(如果没有的话就自己建立一个咯~
然后每一个服务器这样写:
Host &这里可以起一个名字,一会儿会用到&
&服务器的主机名或 IP 地址&
PreferredAuthentications
# 偏好的验证方法,这里选择公钥验证
IdentityFile
&汝的私钥文件路径&
然后汝可以通过 ssh &刚刚设置的别名& 来连接了哦~
有时汝可能会遇到这样的错误呗~
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:S8zGzMsXj0FbOyrTM9OTalx8pbddwmMdxeVXaKQaaA0.
Please contact your system administrator.
Add correct host key in /home/horo/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/horo/.ssh/known_hosts:2
ECDSA host key for localhost has changed and you have requested strict checking.
Host key verification failed.
这表示服务器发送来的主机密钥和汝 known_hosts 中的不相同呗~
有可能是遇到了中间人攻击,或者只是汝重装了系统或者重新生成了主机密钥而已……
如果汝在连接其它人的服务器的话,最好还是确认一下为好~
要真的是汝重装了系统了的话,就把新的主机密钥记下来呗~找到 known_hosts 对应的那一行修改一下就好了啦~
其实保护服务器只靠这些还是不够啦~,可以考虑使用一些防暴力攻击的软件,或者防火墙
(例如 ufw ),当然上网搜索一些前人的姿势也大有裨益咯~
April 17, 2017
可怕,都两年没写东西了&&
前段时间奉老板命为实验室搭建 Linux 计算集群。之前实验室跑计算都是直接远程登录机房的 Windows 主机的,完全没有作业调度。听说要搞个 Linux 集群我还是蛮有兴趣的。(怎么又搞运维)
然而,实验室当初显然没有按照集群的配置来采购硬件。起步的其实只有三台计算用的服务器,没有配置存储服务器和网络设备。最初我是想至少添加一台登录+存储用的服务器吧,不然这个集群的拓扑实在有点坑。不过学长和老板觉得先用现有硬件搭建一个看看吧,所以我就拉了个旧主机将就着当登录节点了。既然如此,也没必要怂恿实验室加上万元添置 RDMA 模块了,搞个便宜的千兆交换机凑合着用就行了。
未名实验室的集群就基于这套不怎么专业的设备搭建起来了。为了充分榨干这一套设备的性能,后期我在文件系统、网络、软件配置等方面做了很多优化尝试。其中一个想法是:
集群中每台计算节点都装了四块千兆网卡,是否能够将所有网卡都利用起来,组成一个&四千兆&网卡,提高带宽?
警告:本文作者计算机网络课划水太多,文章充斥着大量非专业表述,请谨慎参考。
广义地讲,同时利用多个物理网卡发送/接收 packet,以提高网络带宽(突破单网卡带宽)和可用性的技术,都叫做链路聚合(Link aggregation)。
在网络协议栈中,不同层面都可以实现链路聚合:
物理层(layer 1):Wifi 一根天线信号不好,装两根(胡诌的);
数据链路层(layer 2):Linux 下的 Ethernet Bonding;
网络层(layer 3):操作路由,以数据包、连接或者目的主机为单位将包分散在多个端口上发送/接收,如 ECMP 以及后面会讲的软路由方法。
每种方法都有适合的应用场景,并行的粒度也不一样。比如说,作为一台网页服务器,要和世界各地大量的主机建立连接,改一改路由,让某些地区的连接走端口A上绑定的IP访问、另一些地区走端口B上绑定的IP访问,就能够均衡负载并且提高总带宽了,虽然单个连接还是不能突破单网卡带宽。
而我更在意的是局域网中两台机器之间的通信,希望单个连接也能够突破单网卡带宽。比如,集群两台机器之间要通过 NFS 或者通过 SSH 拷贝数据,我希望能够通过四块网卡的聚合达到 500MB/s 的传输速度。
此外网络拓扑也得明确一下:所有主机通过一台无网管千兆交换机相连。背板带宽足够大,不会成为瓶颈。
先约定一下标记。假定我们有三台 Linux 主机(HostA、HostB、HostC),然后每台主机分别有两块网卡 eth0 和 eth1。三台主机的 eth0 上绑定的 IP 分别为 10.0.0.10/24、10.0.0.20/24、10.0.0.30/24;eth1 上绑定的 IP 分别为 10.0.0.11/24、10.0.0.21/24、10.0.0.31/24。
Ethernet Bonding
Ethernet Bonding 是 Linux 内核支持的一种将多块物理网卡组合成一块逻辑网卡的技术。IP 绑定在逻辑网卡上,链路聚合是在数据链路层进行的。
网上有很多资料,不再赘述了。比如:
对于几种以提高吞吐量为目的的 bonding 模式(比如 balance-rr),发送包是打散到每个物理端口上的,但接收包的负载均衡是通过不断发送 ARP 广播将 IP 绑定到不同端口实现的。由于 MAC 协议的限制,同一时刻一台主机上 MAC 表中某个 IP 只会对应到一个端口,发送到这个 IP 的包也只会涌向一个端口(虽然是从两个端口发送的)。因此,bonding 不能实现我需要的链路聚合。
ECMP 和 软路由
Equal-cost multi-path routing(ECMP),等价多路径路由,简单来讲就是为同一个目的地址配置&多个&&等价的&路由。
比如添加两个 ECMP 路由,使得到 10.0.0.0/24 可以走 eth0 和 eth1 两个端口出去:
ip route add 10.0.0.0/24 nexthop dev eth0 nexthop dev eth1
或者,要经过多个默认网关接入 Internet:
ip route add 0/0 nexthop via 网关1 dev eth0 nexthop via 网关2 dev eth1
Linux 内核根据报文源/目的 IP、源/目的端口(UDP/TCP)进行 hash 决定使用哪条 ECMP 路由发包()。因此,至少对于一个 TCP/UDP 四元组,路由是固定的。另一个问题是,ECMP 只是决定发包的路由,不能做到接收包的负载均衡。如果要做收包的负载均衡,则需要发送方也配合、向两个端口发送。
由于我所有设备的所有端口是在一个局域网/交换机下,路由直接由 ARP 表决定了。同一时刻一个IP只能对应一个MAC,接收包只会从一个端口进来。所以只加入上面的 ECMP 路由、不做进一步配置的话,目前的效果是:
发包能够突破单网卡带宽,但必须建立多个连接(使得 ECMP hash 不同)
单 IP 收包还是只能从一个端口进来,不能突破单网卡带宽
所以,前面这样做 ECMP 还是没法实现我需要的链路聚合。
改进1:接收包负载均衡
其实,前面说的&同一时刻一个IP只能对应一个MAC&并不完全正确,其实每个网卡都有一个单独的 ARP 表。比如,可以通过 ip neigh show dev enp5s0 查询 enp5s0 上的 ARP 表。
这有什么意义呢?如果我们能让不同网卡拥有不同的 ARP 表记录:HostA 的 eth0 认为 10.0.0.20 在 HostB 的 eth0 上,HostA 的 eth1 认为 10.0.0.20 在 HostB 的 eth1 上&& 反之 HostB 看 HostA 亦然。这样,在做到发包的负载均衡的同时,也能够做到收包的负载均衡了。
怎么让不同网卡拥有不同的 ARP 表记录呢?最简单的方法是&& 多买几个路由器,把一组网卡(比如所有主机的 eth0)隔离在一个广播域中。不过,也可以用静态 ARP 表完成这件事:
arp -i eth0 -s 10.0.0.10 &MAC of HostA's eth0&
arp -i eth1 -s 10.0.0.10 &MAC of HostA's eth1&
arp -i eth0 -s 10.0.0.20 &MAC of HostB's eth0&
arp -i eth1 -s 10.0.0.20 &MAC of HostB's eth1&
arp -i eth0 -s 10.0.0.30 &MAC of HostC's eth0&
arp -i eth1 -s 10.0.0.30 &MAC of HostC's eth1&
虽然乍一看有点难以维护,但实际上如果端口数量完全一样,所有主机使用同一份 ARP 表就行了。
改进2:以包为单位进行负载均衡
ECMP 的负载均衡&粒度&不能满足我的需求。其实以包为单位的负载均衡非常容易做的:用 iptables 给发包随机或者依次打上 1、2、&& N(N 为网卡数)的标记;然后设定策略路由,根据标号选择路由就好了。
iptables -t mangle -A OUTPUT -d 10.0.0.0/24 -m statistic --mode nth --every 2 --packet 0 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -d 10.0.0.0/24 -m statistic --mode nth --every 2 --packet 1 -j MARK --set-mark 2
ip rule add fwmark 1 table 10000
ip rule add fwmark 2 table 10001
ip route add 10.0.0.0/24 dev eth0 table 10000
ip route add 10.0.0.0/24 dev eth1 table 10001
不过还没完,Linux 内核有一个叫 Reverse Path Filtering 的保护机制。如果开启了&严格模式&(我的 Arch Linux 上默认如此),发送包的端口和上面绑定的 IP 不一致时会被内核过滤掉。可以通过内核参数 net.ipv4.conf.&interface&.rp_filter 控制这一行为():
rp_filter - INTEGER
0 - No source validation.
1 - Strict mode as defined in RFC3704 Strict Reverse Path
Each incoming packet is tested against the FIB and if the interface
is not the best reverse path the packet check will fail.
By default failed packets are discarded.
2 - Loose mode as defined in RFC3704 Loose Reverse Path
Each incoming packet's source address is also tested against the FIB
and if the source address is not reachable via any interface
the packet check will fail.
一般设置成 2,也就是&宽松模式&就好了,这样只要验证源 IP 属于本机就行了:
net.ipv4.conf.eth0.rp_filter=2
net.ipv4.conf.eth1.rp_filter=2
现在,接收和发送双方的负载均衡都实现了,并且是 per-packet 的。如果用 iperf 测试,应该可以看到单连接就能够塞满多块网卡带宽。
到了这里,和 ECMP 也没啥关系了,纯粹是 iptables 配策略路由的普通软路由方案。
利用 TUN/TAP 设备简化软路由管理
前面用不同网卡绑定不同的静态 ARP 表绕开 ARP 广播实现了更复杂的软路由。其实也可以加一层 TUN/TAP 设备(通俗地讲就是一种&虚拟网卡&)来做真正的软路由,不用手动写 ARP 表了。
首先在每台机器上都创建一个 TUN 设备,随便绑定一个 IP:
ip tuntap add mode tun tun0
ip addr add 10.99.255.10/32 dev tun0
ip addr add 10.99.255.20/32 dev tun0
ip addr add 10.99.255.30/32 dev tun0
然后接下来就是要设置 10.99.255.[10,20,30] 这个&虚拟&网段内的路由。这完全是软件上做的,还是随机打标签+策略路由:
iptables -t mangle -A OUTPUT -d 10.0.0.0/24 -m statistic --mode nth --every 2 --packet 0 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -d 10.0.0.0/24 -m statistic --mode nth --every 2 --packet 1 -j MARK --set-mark 2
ip rule add fwmark 1 table 10000
ip rule add fwmark 2 table 10001
ip route add 10.99.255.10 via 10.0.0.10 dev eth0 table 10000
ip route add 10.99.255.10 via 10.0.0.11 dev eth0 table 10001
ip route add 10.99.255.20 via 10.0.0.20 dev eth0 table 10000
ip route add 10.99.255.20 via 10.0.0.21 dev eth0 table 10001
ip route add 10.99.255.30 via 10.0.0.30 dev eth0 table 10000
ip route add 10.99.255.30 via 10.0.0.31 dev eth0 table 10001
和上个方法对比一下,其实加了个 TUN 的区别就在于把手写的静态 ARP 表换成了手写路由表(实质上 ARP 表也是种路由表)。不过自己设定的 IP 地址终究是比乱糟糟的 MAC 地址好看一些,并且该方法完全不影响原来物理网卡上绑定的 IP 及其路由。
到这里,我需要的链路聚合已经算比较优雅地实现了吧。为了更愉快地配合 Debian 的 ifupdown 使用,我写了个 if-up 脚本进行链路聚合()。放进 /etc/network/if-up.d 里,然后这么配置一下:
iface tun0 inet static
address 10.99.255.10
netmask 255.255.255.255
fakenet 10.99.255.0/24
rspec 10.99.255.1:10.3.23.1:10.3.23.1:10.3.23.1 \
10.99.255.10:10.99.0.10:10.99.1.10:10.99.2.10:10.3.23.10 \
10.99.255.20:10.99.0.20:10.99.1.20:10.99.2.20:10.3.23.20 \
10.99.255.30:10.99.0.30:10.99.1.30:10.99.2.30:10.3.23.30
pre-up ip tuntap add mode tun tun0
post-down ip tuntap del mode tun tun
听说最近出了一个软件,可以在Linux上原生运行Andriod程序,于是迫不及待想试一试。AUR已经有人打了包,所以装起来还算方便,只是系统镜像有点大,以及要编译的包稍微有点多。安装方法主要来自。
先安装所有需要的软件包 (anbox-image要单独先装,不然一直显示'cannot resolve anbox-image')
yaourt -S linux-headers dkms anbox-image
yaourt -S anbox-modules-dkms-git anbox-git
然后加载所需要的内核模块
sudo modprobe binder_linux
sudo modprobe ashmem_linux
再启动相关服务 (这里用start,如果你想开机自启可以再enable)
sudo systemctl start anbox-container-manager.service
systemctl --user start anbox-session-manager.service
最后在菜单中寻找anbox即可打开APP管理器。内置的一些程序如日历、设置等也会显示在菜单中,可以直接打开。目前内置程序还没有Google Play等,只能用ADB安装。
如果anbox还是不能运行,可以试试重启
(?),以及试试用下面这句启动session-manager
anbox session-manager --gles-driver=host
我的台式机上不需要上述操作,但笔记本需要,可能和显卡有关。如果还有其它问题,可以看看AUR里和GitHub上的一些评论:
April 16, 2017
因为是 Linux 内核内置哒~ (好没有说服力的借口呐)
准备一个外部硬盘(放加密过程中备份的系统啦)
一个 Live USB (因为中间要格掉原来的系统……)
然后备份一下系统。
btrfs 的话可以用发送快照的方式呗~
首先创建一个只读快照:
# btrfs subvolume snapshot -r &源位置& &目标位置&
例如 btrfs subvolume snapshot -r / /root_backup 就会在 /root_backup 新建一个 / 的快照~
然后发送出去:
# btrfs send &快照名称& | btrfs receive &目标位置&
例如咱把一个硬盘挂载到了 /mnt 的话:
# btrfs send /root_backup | btrfs receive /mnt/
不是 btrfs 的话就自行发挥想象力咯~ (比如
如果汝一开始不是安装了整个 core 组的话,先把 cryptsetup 装上咯~ _(:з」∠)_
然后创建加密分区:
# cryptsetup luksFormat &设备文件的名称&
如果需要的话,可以在 luksFormat 之前加上一些选项呐:
aes-xts-plain64
AES 加密算法搭配 XTS 模式
--key-size
XTS 模式需要两对密钥,
每个的长度是256
--iter-time
单位是毫秒。该值越大,暴力破解越难;
但是相应的汝打开加密分区时就要等一下啦~
例如这样?
# cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /dev/nvme0n1p1
这将覆盖 /dev/nvme0n1p1 上的数据,该动作不可取消。
Are you sure? (Type uppercase yes):
# 上面要打大写的 YES
# 然后输入两遍加密分区的密码。
输入密码:
确认密码:
然后等一下就好咯~
# cryptsetup open &已经加密的设备文件名称& &映射名称&
解密的分区会映射到 /dev/mapper/&汝设置的映射名称& 呗~
例如咱解密 /dev/nvme0n1p1 ,然后映射到 /dev/mapper/sysroot :
# cryptsetup open /dev/nvme0n1p1 sysroot
接下来就像操作普通分区一样操作 /dev/mapper/sysroot 就好啦~
然后把刚刚备份好的系统再搬回来 _(:з」∠)_
如果汝也是用 btrfs send receive 搬回来的,别忘了让快照可写:
# btrfs property set -ts &快照的位置& ro false
相比与原来的系统,现在的变化就是分区和启动方式改变了呐~
下面咱就假设它在 /mnt 啦 ~
首先重新生成一下 fstab :
# genfstab -U -p /mnt && /mnt/etc/fstab
然后打开它,检查一下有没有问题 ( ? _ ? )
接着 chroot 进去:
# arch-chroot /mnt
因为加密了嘛,所以要让内核知道怎么解开咯~ (就是带上 encrypt HOOK 啦……
打开 /etc/mkinitcpio.conf :
为了用键盘加上 keyboard
如果汝有用 systemd hooks 的话,把 sd-encrypt 添加到 block 和 filesystems 之间咯,像这样:
HOOKS="base systemd autodetect keyboard modconf block sd-encrypt filesystems fsck"
不是的话加上 encrypt 咯~
HOOKS="base udev autodetect keyboard consolefont modconf block encrypt filesystems fsck"
最后重新生成一下 initramfs :
# mkinitcpio -p linux
如果汝在用其它内核的话,用内核的名称(例如 linux-mainline ) 换掉 linux 呐~
如果汝用了 sd-encrypt HOOK,跳过看下面的 &_&
这时就需要 cryptdevices 参数啦~,大概这么写:
cryptdevices=&加密的分区&:&解密后使用的映射&
例如咱解密 /dev/nvme0n1p1 ,然后映射到 /dev/mapper/sysroot 的话:
cryptdevices=/dev/nvme0n1p1:sysroot
如果有不止一个加密分区的话,就挨个写,然后用分号分开,就像这样:
cryptdevices=/dev/nvme0n1p1:/dev/nvme0n1p2:sysext
如果汝是手动设置的 root 参数的话,记得换成刚刚写的映射位置:
root=/dev/mapper/sysroot
用了 sd-encrypt HOOK 来看啦~
首先汝需要加密分区的 UUID,lsblk -f 看一下就好啦~
然后写一个 luks.name 参数:
luks.name=&加密的分区的UUID&=&解密后使用的映射&
luks.name=160577ec-674c-4792-bdf5-3f4edd4aa00c=sysroot
如果汝是手动设置的 root 参数的话,记得换成刚刚写的映射位置:
root=/dev/mapper/sysroot
GRUB 的话可以把刚刚的内核参数加到 /etc/default/grub 的 GRUB_CMDLINE_LINUX 参数里,
然后重新生成下配置文件咯
systemd-boot 的话,把刚刚写的内核参数加进 conf 文件里的 options 参数咯~
卸载然后关闭加密分区:
# umount -R &某个挂载点&
# cryptsetup close &映射名称&
如果需要的话,擦除一下刚刚用的备份分区 ( ? _ ? )
然后重新启动就好啦~
April 15, 2017
这是个 UEFI 启动管理器,于是 BIOS 系统是不能用的 ?
首先汝的 EFI 系统分区最好足够大而且挂载在 /boot 上…… ?
用 UEFI 该知道 EFI 系统分区是啥了吧?
(不知道从哪里听说的)推荐大小是 512M ,Windows 自动创建的应该也够用( ~260M? )
Arch Linux 的话还要安装上 efibootmgr 和 dosfstools 这两个包。
# bootctl install --path=/boot
? 像这样安装 systemd-boot 咯,--path 是 EFI 系统分区的位置。
如果不在电脑的内置硬盘上安装的话,加上 --no-variables ,就不会碰本机的 efivars 啦 ?
(下面可都当作把 EFI 系统分区挂载在 /boot 了咯~
(教会 systemd-boot 去哪里找汝的 GNU/Linux 系统的内核和如何启动等其它参数咯 ?
systemd-boot 的配置文件都放在 /boot/loader 呐~ ,里面还有一个 entries 文件夹
用来存放不同的启动项。
如果存在的话,bootctl 会自动为 "Windows Boot Manager (Windows 启动管理器)"
(\EFI\Microsoft\Boot\Bootmgfw.efi), "EFI Shell" (\shellx64.efi) 和
"EFI Default Loader" (\EFI\Boot\bootx64.efi) 增加启动选项哦。于是就不用写这三个了呐~
基本配置 /boot/loader/loader.conf 像这样:
&- 默认启动选项的文件名(没有 .conf 哦
&- 选择启动选项的时间(如果没有这一项的话,启动时就不会弹出菜单
而是直接启动默认启动项呐~不过启动时按住按键还是会显示启动菜单的啦?
&- 要不要允许在启动选项前按 e 键来更改启动选项呢?
一个 systemd-boot 配置文件大概像这样:
在启动管理器中显示的标题
内核版本,只在有多个 title 时需要.
machine-id
通过 /etc/machine-id用于区分不同设备的名称, 只在有多个title 和 version 时需要
要启动的EFI应用程序的位置,以 EFI 系统分区为相对路径哦;
例如 /vmlinuz-linux (记住 systemd-boot 不会找 EFI 系统分区以外的分区上的文件 &_&
传递给 EFI 应用程序或内核启动的参数,可选.
比如启动 linux 内核就需要 initrd=efipath 和 root=dev 选项呐~
不过汝要是启动 Linux 内核的话,可以不用 efi 而这么写
& vmlinuz的位置 &
path-to-initramfs
initrd 会自动转换成 efi path 和 options initrd=path 咯~
– 这个语法只是为了方便,在功能上并没有区别的啦 (つ°ω°)つ
首先用 lsblk 确定汝的根分区是哪一个设备:
MAJ:MIN RM
SIZE RO TYPE
MOUNTPOINT
├─nvme0n1p1 259:1
├─nvme0n1p2 259:2
├─nvme0n1p3 259:3
├─nvme0n1p4 259:4
├─nvme0n1p5 259:5
├─nvme0n1p6 259:6
└─nvme0n1p7 259:7
比如咱的是 /dev/nvme0n1p7 (就是哪一个的 MOUNTPOINT 是 / 咯) ?
然后获得它的 PARTUUID ?
# blkid -s PARTUUID -o value /dev/nvme0n1p6
d39fe55a-0aa1-455e-84d7-b
所以下面咱就用 d39fe55a-0aa1-455e-84d7-b 作为咱的 PARTUUID 咯~
汝的一定和咱的不一样,所以别一个字不差的照抄! ?
如果汝的 / 既不是 LVM 又没加密的话:
Arch Linux
/vmlinuz-linux
/initramfs-linux.img
root=PARTUUID=d39fe55a-0aa1-455e-84d7-b rw
可以把 title 换成汝喜欢的名字,如果汝用了其它内核(例如 linux-mainline ),
记得修改一下 linux 和 initrd 选项。
如果需要加载 Intel microcode 的话,就再来一行 initrd 咯~
如果还有其它的内核参数,加在 rw 后面咯~
? 等等!如果汝 LVM 逻辑卷组的外面没有一个单独的 /boot 的话就不能用 systemd-boot 了~
Arch Linux (LVM)
/vmlinuz-linux
/initramfs-linux.img
root=/dev/mapper/&VolumeGroup-LogicalVolume& rw
记得把 VolumeGroup 和 LogicalVolume 换成汝自己的 LVM 逻辑卷的卷组和卷名称啊~
当然用 UUID 也可以啦~
Arch Linux Encrypted
/vmlinuz-linux
/initramfs-linux.img
cryptdevice=PARTUUID=d39fe55a-0aa1-455e-84d7-b:&mapped-name& root=/dev/mapper/&mapped-name& quiet rw
mapped-name 是解密后的分区映射到的位置咯~,只要 cryptdevice 和 root 里的一样就行!~
Arch Linux
/vmlinuz-linux
/initramfs-linux.img
root=PARTUUID=d39fe55a-0aa1-455e-84d7-b rw rootflags=subvol=ROOT
记得用汝自己的子卷名称换掉 rootflags=subvol=ROOT 里的 ROOT 啦 ~
例如 EFI Shell ?
UEFI Shell x86_64 v2
/EFI/shellx64_v2.efi
April 14, 2017
说 blog 要关门啥的好像不是不可能...... ?
其实最近又开始玩物丧志了……
? 没错就是它, beatmania IIDX INFINITAS ?
(然而还是很菜就是了,另外这不是让这长草的借口 ?
其实是想写点啥的,例如 ssh 的用法什么的……不过好像大家都会的样子……
换成 GitLab 了,于是评论就废了 (其实是懒得整 Gitlab 的API ?
另外也没有用其它评论框的想法(还是懒…… 算了还是先用着Disqus了 ?
所以找咱的话,邮件/Twitter 都可以啦~
也想自己写一个……叫什么名字好呢?
不知不觉已经用Dokuwiki写了八年的博客。最初的博客软件并没有太多选择,能符合我期望的轻量级、维基语法、访问权限控制的几乎只有。
最初的几年
最初用Dokuwiki写博客并不是一件简单的事。
当时的Dokuwiki有着一个并不算美观的默认主题,其它主题中适合博客的也是少之又少。它作为维基本身也不支持博客功能,需要通过一系列插件来辅助,而折腾这些插件的各种配置也是一件麻烦事。
我是参照一个中文独立博客上的文章把博客建立起来的,后来一次去看时,那个博客已换到了WordPress。
发展的几年
Dokuwiki作为博客的能力在随后几年得到了一定提升。
2012年的能够自适应屏幕,美观,且只需稍作修改就能适应博客的需求。同时新的BlogTNG插件提供了整体的博客解决方案,不用再折腾一个个独立的插件。Dokuwiki自身也有很多进步,比如更方便的多媒体管理等。
那个时候我很快就对网站进行了更新,还写了关于用BlogTNG写博客的一系列文章。不过好景不长,BlogTNG这个“下一代博客引擎”没多久就停止开发了。
BlogTNG停止后,我不想再因为插件的问题迁移来迁移去,于是按照最基本的功能需求写了,新插件的配置和使用是极其简单的。
2015年Dokuwiki又推出了改自WordPress主题的,更加美观好用。但Writr是整体偏左右侧大量留白的,在大屏幕上不好受,所以这几天我从WordPress改了来用。
新的趋势 ?
随着Markdown不断兴起,各种用更轻量级的博客软件也不断出现,比如著名的Jekyll。用WordPress的都越来越少,更何况Dokuwiki,但我并没有切换的打算。一是这些软件在功能上不能满足我的要求,二是我不喜欢Markdown。
其实前几天我还看了一个新的纯文本CMS——,感觉非常不错,差点都要叛变了。但实际使用后发现它要求每篇文章都要放到单独的文件夹里,并且文件名是你要用的模板名字而不是文章标题等。比如你要写一个题为“about”的博文,在Grav里就是这样的
01.something/
不知道你是什么感觉,反正我是觉得简直不能再丑了,想象一下一大堆只包含单个文件的文件夹放在你面前的感觉…
看来Dokuwiki还会陪伴我很长时间。
April 13, 2017
之前的Writr虽然是个不错的主题,但用的时间也有点久了,而且是左对齐的,在大屏幕上总要斜到一侧看,于是打算从WordPress的主题里改一个新主题出来,最终就选择了Twenty Fifteen。
但由于Dokuwiki和WordPress的机制有些差异,有些地方难以做到完全一致,不过目前的效果还是我比较满意的。新主题的代码地址如下:
默认情况下,文章是没有底部信息的(如发布时间、作者、评论数),并且文章列表是显示在同一个白色区块内的,而不是像原主题那样每篇一个白色区块。如果想要和原主题更像,需要在所用的博客插件上作出一定的修改。
如果你用的是miniblog插件,直接用
&miniblog twentyfifteen&
替换原来的文章列表显示就可以了。
如果用的是别的博客插件,可以参考主题的README对插件进行相应的修改。
April 06, 2017
前段时间Dokuwiki更新后无法显示页面,在php.ini里打开PHP错误信息显示后“There is no suitable CSPRNG installed on your system”。
搜索后发现是random_compat进行了更新,移除了openssl_random_pseudo_bytes()函数,目前需要使用/dev/urandom。详情参见。
目前的解决方法是将/dev/urandom增加到PHP的open_basedir路径中。
之前拍的几张很满意的照片,感觉做壁纸不错,是内蒙古的胡杨林。第二张稍稍PS过。
April 05, 2017
Wiki 写的挺详细的 (咱顺手糊了翻译…… ?
只比 Arch Linux 少了个无线网卡诶(?其实本来 Arch 就没剩下多少……,找个 USB 无线网卡插上凑合一下……
不少官方源的包和
冲突, 被批判了一番…… ,然后被卸载了。
Firefox 和 ThunderBird 因为 Mozilla 的商标问题换成了 Iceweasel 和 IceDove ,然而 Firefox 那蜜汁 Emoji 显示…… ?
March 28, 2017
自从家里的宽带升级到光纤后多了光猫这个设备,家中网络变成了这样的连接方式:光猫-》路由器(tplink)-》其它设备。同时网络也出现了一个莫名其妙的问题——每次停电/断电重启后就没法上网。
最初发现这个问题时我做了很多尝试,发现了这些特点:
路由器的宽带连接状态显示拨号成功,能获取IP和DNS。
电脑直接连光猫,可以拨号成功。
输入光猫IP地址显示691帐号密码错误,但路由器系统日志显示认证成功。
看起来问题是出在路由器上。我在网上努力的搜索了一番,什么重启路由器,光猫路由器IP冲突,MAC地址克隆等等都试了一遍也是没办法。最终只发现两个途径可以暂时解决这个问题:恢复路由器出厂设置、691错误页面输入用户名和密码。
昨天这个问题又出现了,我决定再看看有没有什么没注意到的地方,彻底解决这个麻烦。这次我更仔细查看了路由器的系统日志,终于有了新发现。
successfully .. dial mode 5
xian vnet ....
这表示路由器是用“特殊拨号模式5”拨号的。于是我在LAN设置里把拨号模式从“自动选择拨号模式”改成“正常拨号模式”,成功了!这次应该是找到了问题的根源,彻底解决了。
这个问题的原因我推测是这样的。
TPLINK为了突破一些运营商对拨号客户端的限制内置了多种拨号模式,默认是自动选择的。即从正常模式开始尝试,如果不成功就依次尝试其它特殊模式直到拨号成功。
而断电重启后,由于光猫和路由器开机的时间差,路由器正常模式拨号不成功开始尝试其它模式,试到“特殊模式5”时得到了认证成功的反馈并获取到了IP。虽然这个模式下没法上网,是不正确的,但路由器并不知道。它把这次“成功”记录了下来,以后每次都直接用来拨号,而不再尝试正常模式。于是就出现了我遇到的这种问题。
我发现小米和华为路由器的论坛上也有很多人问这个问题,莫非都是特殊拨号模式搞得鬼……
March 21, 2017
昨晚我大概没有把硬盘插紧,零点(一堆计划任务执行时)在 dmesg 里看到了大量 ext4/SATA 错误。今天开机时 BIOS 直接提示没有可引导的设备。下面记录了我所有的测试和恢复步骤:
用备份盘开机,首先发现 /dev/sda 存在,但没有任何 /dev/sda*。判断是分区表损坏。
执行 testdisk 快速扫描找回分区表,因为盘里只有一个分区,这一步很顺利。继续操作写回分区表。
此时 /dev/sda1 已经出现,尝试 mount,失败。提示 ext4 没有 journal。
执行 fsck.ext4 /dev/sda1,期间提示包括 root node 不是 directory 等一系列错误,一路 y 下去重建了 root node,并把一堆目录丢到了 /lost+found。
重新 mount,成功挂载到 /mnt。
进去查看,发现只有一个 ./lost+found。果然 / 目录里的信息丢失了。
进入 ./lost+found,里面有二十来个目录。一个个进去查看。
根据目录内容,将 home、var、usr、etc、srv、opt、root、boot 猜出来,并移动回对应的 /mnt/*。剩下的多是空目录,放弃。
尝试 arch-chroot,失败,想起来还需要重建 / 里的一些 symlink 和空目录。
mkdir dev media mnt net proc run sys,然后创建 {s,}bin -& usr/bin,lib{,64} -& usr/lib 的 symlink。
再次 arch-chroot,成功。
执行 pacman -S filesystem 以防万一。
运行 grub-install 恢复引导。
运行 pacman -Qkq 比对文件,发现只有 visual-studio-code 包内容有丢失,暂时不管。
重启,成功进入系统,重新安装 visual-studio-code。
至此,虚惊一场的数据丢失已经完全恢复,总共历时 1 个小时(前面大量的时间花在了让备份盘能启动起来,上一次备份出现了一点差错……)。
最后赞美一下坚强的 ext4!
March 16, 2017
升级到 ca-certificates-utils
包的过程需要手动操作,因为原本由 post_install 创建的一个符号链接现在移动到打包过程中了。
因为删除该链接可能会导致无法正常下载安装包,所以请进行如下三步升级操作:
# pacman -Syuw
# 用 -Sw 选项仅下载升级所需的包
# rm /etc/ssl/certs/ca-certificates.crt
# 手动移除冲突的文件
# pacman -Su
# 继续升级
February 28, 2017
得益于 Fedora 社区和 xorg-server 上游开发者的不懈努力,现在不需要任何 libgl/libglx 的修改就能同时(side-by-side)安装 mesa-17.0.0-3 和 nvidia-378.13 驱动了。
这一变更的第一步是我们已经通过移除诸多 libgl 相关的包,删除了 xorg-server-1.19.1-3 中 libglx 的符号链接及其关联的 mesa/nvidia 驱动。这是艰难的一步,因为这一步破坏了 optimus 的兼容性,并且需要手动更新 xorg-server 的配置。
接下来是我们现在所处的第二步,我们提供了一个新的
配置文件,它将带来 optimus 系统下“开箱即用”的 xorg-server 配置。
请广泛测试现在的新配置并通过我们的
反馈您遇到的问题。
February 21, 2017
从 AUR 安装
然而这个内核有两个问题?:
如果是在键盘和屏幕分离时启动会 Kernel Panic
如果没设置好接下来的 ipts 会在关机或重启时 Kernel Panic
首先把刚刚从 Windows 偷来的文件复制到相应的位置上:
# mkdir -p /usr/lib/firmware/intel/ipts
# cp /path/to/Windows/INF/PreciseTouch/Intel /usr/lib/firmware/intel/ipts/
然后链接相应的文件(如果提示目标已存在,就删掉再试一次咯?
# ln -s iaPreciseTouchDescriptor.bin /lib/firmware/intel/ipts/intel_desc.bin
# ln -s SurfaceTouchServicingDescriptorMSHW0076.bin /lib/firmware/intel/ipts/vendor_desc.bin
# ln -s SurfaceTouchServicingKernelSKLMSHW0076.bin /lib/firmware/intel/ipts/vendor_kernel.bin
# ln -s SurfaceTouchServicingSFTConfigMSHW0076.bin /lib/firmware/intel/ipts/config.bin
/me 有 79 ,其中 0076 可用,0078 没法加载,0079 触屏方向相反了?
好了,重启一下试试??
February 19, 2017
February 18, 2017
在(需要登陆)中纠结使用 Planet 还是博客的时候就已经在关注 Planet 这个东西。
非常奇特,本身并不存储什么数据,但是用这样一个简单的方式在极低的成本下将大量的用户和内容结合到了一起。
终于决定要建立一个社区星球的时候,我才发现它连主题模板都不支持响应式才不是我想写个好看点的主题结果折腾一天无果(ノ=Д=)ノ┻━┻
总之,使用的是 Ubuntu 仓库内的 planet-venus 包,遇到了各种问题…
莫名其妙无法获取 feed,浏览器访问正常,用 curl 正常
莫名其妙无法读取 feed 内容,其他 feedparser 均正常
对文章内使用相对链接的内容无能为力
模板语言落后,不要跟我说 old fashion
输出路径一直是 cwd,不知道是不是 feature。但是这导致我的 home 下面到处都是 output 目录
强迫症犯了。遂决定自己实现一个因为逻辑很简单啊不过就是把 RSS 抓下来排个序再丢出去么
但是到具体的细节,还是有不少需要考量的东西。
压缩和编码有些网站打开了 gzip 压缩,有些网站使用了非 UTF-8 编码…只是暴力读取的结果就是页面上一半正常一半乱码。
给出了使用 zlib 和 iconv 的,这个问题就迎刃而解啦。
相对路径和内容安全Planet Venus 似乎是会解析处理文章内不带有协议的链接和图片,以使这些资源能够在 planet 的页面中直接通过原地址访问。但是问题在于,planet venus 似乎只是暴力给所有非完整 URL 形式的资源地址都强行加上协议和主机名。于是就出现了这种情况——
原文地址 http://www.example.com//example.html
原文中引用的资源 images/1234.jpg
看起来没毛病,但是 Planet Venus 解析过来就是 http://www.example.com/images/1234.jpg
这似乎看起来也没毛病… 然!而!正确的地址是 http://www.example.com//images/1234.jpg
…呵呵哒。
先不管为什么会有这么奇怪的资源路径,但是 Feedparser 却可以正确解析到带有跟路径的地址。也就是上面的资源地址,Feedparser 解析完之后就是正确的 //images/1234.jpg。
但是只有正确的相对路径还不够,因为 planet 是单独的站点,直接把 HTML 往页面中插,结果就是浏览器会去请求 planet//images/1234.jpg 然而 planet 的服务器上并不会有这个资源。
于是这个问题先放着,来看另一个问题。
聚合的一个特点是,几乎无法控制来源内容的安全性——因为其他的网站服务器都不是自己维护的,其他人能否保证自己的网站不被入侵、被跨站…都是未知数。如果有订阅的网站被入侵挂了马,阅读/订阅聚合 planet 的用户也会中招。
解决这个问题,常见的办法就是过滤掉不安全的 HTML tag。于是这里引入了 。
其实我一开始打算用 regex 直接切掉不过还是不够 robust 所以乖乖去找包了… 但是惊喜的是这个包居然可以实现按规则替换!这就顺利解决了之前的问题,可以将 Feedparser 解析得到的路径加上正确的协议和主机地址。
123456789101112131415161718192021222324252627282930313233343536373839(html, {
transformTags: {
'img': function (tagName, attribs) {
if (attribs && attribs.src) {
if (attribs.src.startsWith('/') && attribs.src.charAt(1) !== '/') {
return {
tagName: tagName,
attribs: {
src: host + attribs.src
} else if (attribs.src.startsWith('//') ||
attribs.src.startsWith('http://') ||
attribs.src.startsWith('https://')) {
tagName: tagName,
attribs: attribs
} else {
tagName: tagName,
attribs: {
src: host + '/' + attribs.src
return {
tagName: tagName,
attribs: attribs
}});
解决了文章内容相对路径的问题,要过滤特定的标签或者标签属性则是这个包本来就要做的事情了,小菜。
处理完文章对象之后,用 Array.prototype.sort 带一个 compare function 通过更新日期排序,接下来就可以简单渲染页面和 RSS 文件啦。
其他一些不太常见的功能,例如 http proxy 的支持(在特殊的网络环境下可能用到),长文章仅展示 summary 并提示继续阅读,avatar 的支持,模板和输出目录保持和配置文件的相对路径,等。
然后作为深有体会——
123CSSISAWESOME
因此打死不写前端的家伙选择直接套用了 YUI Library 的 purecss 框架做一个还算看得过去的模板。至少… 几番折腾之后把响应式和 pre 等难缠的宽度搞定了顺便玩了下 media query。
于是代码 -&
以及已经在使用的
从开坑到基本完善大概花了 15 个小时… 果然长时间不写代码手生才不是冻得手打字都变慢了呢在(需要登陆)中纠结使用 Planet 还是博客的时候就已经在关注 Planet 这个东西。
非常奇特,本身并不存储什么数据,但是用这样一个简单的方式在极低的成本下将大量的用户和内容结合到了一起。
终于决定要建立一个社区星球的时候,我才发现它连主题模板都不支持响应式才不是我想写个好看点的主题结果折腾一天无果(ノ=Д=)ノ┻━┻
总之,使用的是 Ubuntu 仓库内的 planet-venus 包,遇到了各种问题…
莫名其妙无法获取 feed,浏览器访问正常,用 curl 正常
莫名其妙无法读取 feed 内容,其他 feedparser 均正常
对文章内使用相对链接的内容无能为力
模板语言落后,不要跟我说 old fashion
输出路径一直是 cwd,不知道是不是 feature。但是这导致我的 home 下面到处都是 output 目录
强迫症犯了。遂决定自己实现一个因为逻辑很简单啊不过就是把 RSS 抓下来排个序再丢出去么
但是到具体的细节,还是有不少需要考量的东西。
February 08, 2017
最近要给网站上 CDN 于是折腾了下在 NGINX 部分获取客户端真实 IP 的方案。
嘛… 意想不到的简单就是…
安装 realip 模块如果是 Debian/Ubuntu 系统,直接安装 nginx-extras 这个包即可。包含了很多有用的模块,不需要再自己编译。
如果是其他发行版,且没有提供额外模块的包的话,需要自己编译 NGINX。编译参数加 --with-http_realip_module 即可。
获得前端服务器地址常见的 CDN 前端 IP 都可以从 CDN 提供商处获得,例如 CloudFlare 的 IP 地址段在。
如果需要找到 Google Cloud Platform 的 IP 地址段,可以使用 查询。
1$ dig @8.8.8.8 _cloud-netblocks.googleusercontent.com TXT
12345678910111213141516171819_cloud-netblocks.googleusercontent.com. 3599 IN TXT "v=spf1 include:_cloud-netblocks1.googleusercontent.com include:_cloud-netblocks2.googleusercontent.com include:_cloud-netblocks3.googleusercontent.com include:_cloud-netblocks4.googleusercontent.com include:_cloud-netblocks5.googleusercontent.com ?all"
这里面的 _cloud-netblocks1.googleusercontent.com 等地址即是用于保存 GCP IP 段的地址。继续查询:
1 @8.8.8.8 _cloud-netblocks1.googleusercontent.com TXT
12345678910111213141516171819_cloud-netblocks1.googleusercontent.com. 3599 IN TXT "v=spf1 ip4:8.34.208.0/20 ip4:8.35.192.0/21 ip4:8.35.200.0/23 ip4:108.59.80.0/20 ip4:108.170.192.0/20 ip4:108.170.208.0/21 ip4:108.170.216.0/22 ip4:108.170.220.0/23 ip4:108.170.222.0/24 ?all"
于是得到了一堆 IP 地址。
设置 RealIP 模块文件 /etc/nginx/snippets/realip.conf,请注意这个位置在其他发行版未必存在,放在 NGINX 配置目录下即可。
1234set_real_ip_from
192.168.1.0/24;set_real_ip_from
192.168.2.1;set_real_ip_from
2001:0db8::/32;real_ip_header
X-Forwarded-F
然后在 vhost 配置文件中引用这个配置。
1include snippets/realip.
搞定,重启 NGINX 即可获得客户端真实 IP。
GCP 的 X-Forwarded-For 的客户端 IP 在第一个 , 的前面,所以一般需要 split(',')[0]。最近要给网站上 CDN 于是折腾了下在 NGINX 部分获取客户端真实 IP 的方案。
嘛… 意想不到的简单就是…
February 04, 2017
因为好像大家都推荐?
按惯例先上 ArchWiki :
和 Prosody 自己的文档:
首先安装 Prodosy (和它的依赖):
# pacman -S prosody lua51-sec
lua51-sec 为 Prosody 提供了加密支持。所以还是装上它呗~
然后修改下配置文件 /etc/prosody/prosody.cfg.lua :
顺便说一句 Lua 的注释是每一行前面的连字号呐~
下面写些咱做的修改?
在 modules_enabled 中取消启用 version 和 uptime 模块,顺便启动些其他的模块。
如果需要允许在客户端上注册的话,把 allow_registration 设置成 true 。
开启 TLS 加密:
--- 私钥文件的路径
key = "/etc/prosody/certs/privkey.pem";
--- 证书文件的路径
certificate = "/etc/prosody/certs/fullchain.pem";
--- 要点是证书和私钥要对 prosody 用户可读?
--- 咱一开始就是没搞对然后 prosody 默默的以不加密模式运行了 ?
--- 可以使用的协议,Prosody 0.10以上版本,可以使用"tlsv1_2+";
--- 若是较旧版本,可以使用"sslv23"开启所有协议支持,
--- 然后在options中关闭除TLSv1.2之外的协议支持。
--- 但是咱因为兼容性需要用的还是 tlsv1+ ?
protocol = "tlsv1+";
--- 加密选项,
options = {
--- 旧版加上这几行关掉老协议
"no_tlsv1",
"no_tlsv1_1",
"no_sslv2",
"no_sslv3",
--- 剩下的其实是 prosody 的默认选项?
"no_ticket",
"no_compression",
"cipher_server_preference",
"single_dh_use",
"single_ecdh_use"
--- 为客户端到服务器(c2s)和服务器到服务器(s2s)打开认证
verify = { "peer", "peer" };
--- ciphers 是所使用的加密算法,写法就是 openSSL 的 cipher string ?
--- 这是默认配置
ciphers = "HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL";
--- 某个全是前向安全算法的配置 ?
--- 有没有大佬推荐个更好的配置啊 ?
ciphers = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
--- dhparam 文件的路径,要对 prosody 用户可读?
dhparam = "/etc/prosody/certs/dhparams.pem";
-- Force clients to use encrypted connections? This option will
-- prevent clients from authenticating unless they are using encryption.
-- 对客户端到服务器强制启用加密
c2s_require_encryption = true
-- 对服务器到服务器强制启用加密
s2s_require_encryption = true
-- Force certificate authentication for server-to-server connections?
-- This provides ideal security, but requires servers you communicate
-- with to support encryption AND present valid, trusted certificates.
-- NOTE: Your version of LuaSec must support certificate verification!
-- For more information see https://prosody.im/doc/s2s#security
-- 是否验证远程服务器的证书?
s2s_secure_auth = true
-- Many servers don't support encryption or have invalid or self-signed
-- certificates. You can list domains here that will not be required to
-- authenticate using certificates. They will be authenticated using DNS.
-- 为某些不资瓷加密或者没设置好的辣鸡服务器换用DNS验证……
--s2s_insecure_domains = { "gmail.com" }
-- Even if you leave s2s_secure_auth disabled, you can still require valid
-- certificates for some domains by specifying a list here.
-- 如果 s2s_secure_auth = false ,可以在这里设置那些服务器一定启用验证
--s2s_secure_domains = { "jabber.org" }
-- Select the authentication backend to use. The 'internal' providers
-- use Prosody's configured data storage to store the authentication data.
-- To allow Prosody to offer secure authentication mechanisms to clients, the
-- default provider stores passwords in plaintext. If you do not trust your
-- server please see https://prosody.im/doc/modules/mod_auth_internal_hashed
-- for information about using the hashed backend.
-- 认证方式,"internal_hashed" 一般情况下就够了。
authentication = "internal_hashed"
某些其它设置……
--- 新用户注册通知,会发到管理员的帐号上。
registration_notification = "User $username just registered on $host from $ip"
--- 如果启用了 welcome 插件,在这里自定义欢迎消息
welcome_message = ""
然后测试下配置文件对不对(啥输出都没有就正常?)
lua -p /etc/prosody/prosody.cfg.lua
一切正常的话就启动服务试试呗~
# systemctl start prosody
如果没开启允许客户端注册的话,用 prosodyctl 注册账户
# prosodyctl adduser &JID&
?网页标题:Prosody - ArchWiki
?网页标题:自建 XMPP 的二三事 - El Virilea via Kralisch}

我要回帖

更多关于 arch linux 更新命令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信