关于 Xshell 5 到期不能使用的问题

辣鸡韩国人。辣鸡韩国人。辣鸡韩国人。(XShell 的开发商 NetSarang 是韩国公司)

Xshell 5 的家庭/学校授权的免费版还不错,是全功能的,但是 6 以后只能同时开 4 个标签页,这个对我这种习惯多标签操作的人来说十分不合适。所以我们得想办法折腾一下。目前有这几个办法:

  1. 修改 nslicense.dll
    找个反汇编软件,打开 nslicense.dll
    搜索16进制
    7F0C81F98033E1010F8680
    修改为
    7F0C81F98033E101E98100
    修改为
    7F0C81F98033E1010F8380
    都可以
    附上修改好的下载
  2. 使用 Xmanager 破解版
    在我用的时候,有这些序列号可用(现在已经不行了):
    Serial:160501-116212-999918
    Serial:160501-116315-999718
    Serial:160501-116681-999470
    Serial:160501-116172-999838
    Serial:160501-116524-999046
    Serial:160501-116476-999086
    然后去官方用这些序列号下载 Xmanager 5,断网安装,用以上序列号激活,之后,修改 hosts文件

    127.0.0.1 transact.netsarang.com
    127.0.0.1 update.netsarang.com
    127.0.0.1 www.netsarang.com
    127.0.0.1 www.netsarang.co.kr
    127.0.0.1 sales.netsarang.com

    就可以正常使用
    考虑到这些序列号已经被官方屏蔽,这里放出下载

  3. 换 PuTTY/KiTTY
    开源拖拉机又不是不能用。就我自己而言,使用 Xshell 主要图以下几点:字体好看、代理方便、多标签、SSH KeepAlive、保存用户名密码、有较长的向上翻页
    实际上,这些功能在 PuTTY/KiTTY 里面都有
    Window -> Lines of Rollback 调整保存历史行数
    Window -> Appearance -> Font settings 调整字体和反锯齿方案,可以有 Consolas 和 ClearType
    Connection 中可以调 KeepAlive 包
    Connection -> Data 可以保存登录用户名,KiTTY 还可以保存密码
    Connection -> Proxy 可以设置代理
    Connection -> SSH -> Auth 可以设置 Private Key
    如果要修改默认设置,在空白情况下改好了以后,在 Sessions 里面点击 Default Settings 然后按保存
    多标签可以通过一个外壳 MTPuTTY 实现
    该有的都有了,拥抱开源吧
  4. Xmanager Keygen
    https://github.com/DoubleLabyrinth/Xmanager-keygen

Hetzner Cloud Volume 功能的使用

Hz cloud 什么都好,就是盘太小,最基础的实例只有 20G 盘,相比 Scaleway 的 50G 还是差了点。不过考虑到它 CPU 也好,盘也快,所以想把建在 Scaleway 上面的本博客搬到 Hz cloud。正好最近 Hz cloud 出了 Volume 的功能可以自己加硬盘,在星菊的帮助下,使用 LVM 完成了 Volume 和自带分区合并的功能。

要做到这点,需要分两步,一个是在 Rescue 模式下将系统安装在 LVM 分区上,第二步是在系统中扩展 LVM 分区。

安装系统时,需要在后台进入 Rescue 模式,Hz 家的 Rescue 都一样,在选定 image 以后会弹出配置文件让你编辑,在分区那里需要这么写:

PART /boot ext4 512M
PART lvm vg0 all
LV vg0 root / ext4 all

之后双击 Esc 退出,正常安装就行,之后 LVM 分区就挂载在 / 这里了。

然后重启进入系统,在 Volume 页面创建之后 attach 到之前的实例。通常来说,系统会安装在 /dev/sda,新的 Volume 在 /dev/sdb。执行以下命令将分区合并:

pvcreate -ff /dev/sdb
vgextend vg0 /dev/sdb
lvresize -l +100%FREE vg0/root
resize2fs /dev/vg0/root

做了如下几件事:

  1. 在 /dev/sdb 上创建 Physical Volume
  2. 将 Volume Group vg0 扩展到 /dev/sdb 上
  3. 扩展 Logical Volume vg0/root 到所有的可用空间
  4. 扩展 /dev/vg0/root 上的文件系统

我们可以通过 pvdisplay vgdisplay 和 lsblk 看到效果:

root@sb1 ~ # pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               vg0
  PV Size               <37.65 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              9637
  Free PE               0
  Allocated PE          9637
  PV UUID               ZbfxjP-RNf5-ScPU-eclg-dMjj-0WKg-T3FA2p

  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               vg0
  PV Size               750.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              191999
  Free PE               191999
  Allocated PE          0
  PV UUID               ZphGg0-2XcJ-Kjzy-gfBX-7pSp-Wo4L-fbVkD5

root@sb1 ~ # vgdisplay
  --- Volume group ---
  VG Name               vg0
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               787.64 GiB
  PE Size               4.00 MiB
  Total PE              201636
  Alloc PE / Size       9637 / 37.64 GiB
  Free  PE / Size       191999 / <750.00 GiB
  VG UUID               7It9l8-70zz-03Uk-8md3-mPBZ-o7fe-clN3QX

root@sb1 ~ # lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda            8:0    0  38.2G  0 disk
├─sda1         8:1    0   512M  0 part /boot
└─sda2         8:2    0  37.7G  0 part
  └─vg0-root 253:0    0 787.7G  0 lvm  /
sdb            8:16   0   750G  0 disk
└─vg0-root   253:0    0 787.7G  0 lvm  /
sr0           11:0    1  1024M  0 rom

在完成了所有命令之后,可以在 lsblk 中看到 / 已经扩充到了 787.7G

关于公网分流任务使用 qBittorrent + libtorrent 内存泄漏的一些想法

出现的问题是,在 Linux qb 挂了 400+ 公网种子的情况下,使用 libtorrent 1.1 作为后端,在运行三至四天以后就会内存使用量不断增加,直到占用了几乎所有的可用内存,系统崩溃为止。

在 qb 的这个 Issue 中(https://github.com/qbittorrent/qBittorrent/issues/8630),有人在 Windows 上观察到了一样的现象,报告在 Enable OS cache 的情况下最终会导致内存泄漏。

在 https://github.com/qbittorrent/qBittorrent/issues/8295 和 https://github.com/arvidn/libtorrent/issues/1997 这两个 Issue 中,有人提到是 libtorrent 本身的 IO 和缓存实现存在问题,导致磁盘 IO 效率过低。但是这两个问题也都是在 Windows 上观察得出的,目前提供的方法是关闭 OS Cache,打开 libtorrent 的 coalesce reads & writes 选项,以在 Windows 上达到较好的 IO 性能表现(这个选项在 Linux 上是不必要的,因为 Linux 有 pwritev() 的实现,不需要通过 pwrite() 进行模拟——arvidn)。

但是在 Linux 上,这个问题仍然没有任何解决的迹象。在我看来,假定 libtorrent 自身的内存管理不存在问题,没有内存泄漏的情况,那么内存占用应该存在于两个方面:一是在 libtorrent 1.1 解决了 IO 性能问题以后引入的新 bug,即 lt 可以同时打开大量的 File Descriptor 且不陷入死锁,那么由于使用 buffered IO 的问题,在系统内核层面上消耗了大量的内存;另一个可能性是 TCP Socket buffer,libtorrent 1.1 相比 1.0 修正了大量 TCP Socket 连接卡死的问题(甚至出现了 too many open files 的情况,参见之前的文章,这个现象在 lt 1.0 从未出现过),大量 peer 和 tracker 连接使用的 TCP Socket 在内核层面占用了大量的内存,进而出现内存占用高的问题。

目前先禁用 OS Cache 进行下一步测试,观察是否还会出现内存占用过高。如果有,那么应该是 TCP 造成的问题了。(在看了 IBM 关于 Linux Direct IO 的这篇文章后,我对 IO Buffer 这个方向不报太大希望,因为无论怎么看 Buffered IO 的实现也不像会把自己噎死的样子)

红米 5A 刷欧洲版 MIUI 记录

老年人的第一次刷机。

最近把红米备机拿出来用了,升到了 ADUI 10,感觉还不错,但是广告实在太多。想起来当年被卡 15 天解 BL 锁的限制早过了很久了,就想着把这破系统刷了吧。

查了一圈发现 MIUI EU 版是相对干净的系统,可以在这里取得。

准备工作

解锁 Bootloader
MIUI EU 版刷机包
Android Debug Bridge
第三方 Recovery TWRP
Root 包 Magisk

刷机步骤

  1. 解锁 Bootloader
    1. 进入“设置 -> 开发者选项 -> 设备解锁状态”中绑定账号和设备;
    2. 手动进入 Fastboot 模式(关机后,同时按住开机键和音量下键);
    3. 通过USB连接手机,点击 “解锁”按钮;
  2. 刷入 TWRP
    1. 在 Bootloader 模式下,运行 fastboot flash recovery <twrp_image>刷入 TWRP
    2. fastboot reboot 重启设备,注意此时需要立即按下音量上 + 电源以进入 Recovery 模式,否则 MIUI 会覆盖刷入的自定义 Revocery
  3. Recovery 成功刷入设备后,将手机关机,在关机状态下按住电源键和音量上键,进入 Recovery 模式,滑动 Swipe to Allow Modifications 进入主菜单。点击 Wipe,点击 Format Data,输入 yes 完成格式化,返回上一菜单,点击 Advanced Wipe,选择 Dalvik,Cache,System,Data 和 Internal Storage 分区,并滑动 Swipe to Wipe 进行擦除,然后返回 Recovery 主菜单
    1. 注意可能在 Wipe /data 分区时可能会出现错误:TWRP Unable to mount '/data',如果出现该错误,在 Fastboot 模式下运行 fastboot format userdata清理 /data 分区之后再进行操作
  4. 在电脑磁盘列表中找到手机,复制 ROM 至手机,复制完成后在 Recovery主菜单中,点击 Install,点击 ROM 包,滑动 Swipe to confirm Flash 进行刷入,重启设备
    1. 任意方法刷入 ROM 后,命令窗口中结束 adb 服务adb kill-server
  5. 重启进入 Recovery 模式,按照刷 ROM 的方式刷入 root 包

然后大功告成

参考资料

https://www.zhihu.com/question/50231539/answer/530627637
https://www.reddit.com/r/Nexus6P/comments/3qnzz0/twrp_unable_to_mount_data/

 

优化 wine 的字体显示

有时候总有一些不得不在 Linux 下跑一些 Windows 程序的需求,所以我们会用到 wine,但是 wine 默认并不是给中文用户设计的,因此我们需要一些办法来解决中文显示乱码和效果差的问题。

中文乱码,主要表现是非 ASCII 字符全部都显示为方框,这个是没有字体造成的,需要在 ~/.wine/drive_c/windows/Fonts 下面安装中文字体,一般来说,装好宋体、黑体和微软雅黑这些常用的就能用了,如果想装点别的,自然也可以。这里提供了一些打包好的基础字体下载:

cd ~/.wine/drive_c/windows/Fonts
wget https://down.gloriousdays.pw/Fonts/wine_fonts.tar.xz
tar xJvf wine_fonts.tar.xz
rm wine_fonts.tar.xz

搞定了字体以后,很快就会发现这些字体的显示效果十分差,完全没有做 AA 的意思,我们用 winetricks 解决这个问题:

apt install winetricks
winetricks settings fontsmooth=rgb

重新打开 exe 程序即可

使用 zram 进行内存压缩

对于像 KS-3 这样只有 4GB 内存的小内存服务器,如果想在上面跑一些比较复杂的服务,经常会遇到内存不足的问题。一般说到内存不足,第一反应都是加 swap 空间,但是对于机械硬盘的场景,添加盲目添加 swap 空间并不是一个好的选择,因为这样会显著增加系统整体的 latency。这个时候 zram 就可以派上用场了。

zram 是在 Linux Kernel 3.2 加入的一个模块,其功能是在内存中开辟一块空间,用来存储压缩后的内存数据,这样可以在牺牲一定的 CPU Cycle 的情况下,在内存中存储尽量多的数据而不需要写入到磁盘。

对于 Ubuntu 系统,开启 zram 的方法很简单,只需要安装 zram-config 这个包之后重启即可。zram 默认会将系统内存的一半作为 zram,然后根据 CPU 核心数平均分配到每个 zram 设备。比如在我的 KS-3 上,通过 zramctl 查看 zram 的情况,是这样的:

# zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram3 lz4           491M   4K   63B    4K       4 [SWAP]
/dev/zram2 lz4           491M   4K   63B    4K       4 [SWAP]
/dev/zram1 lz4           491M   4K   63B    4K       4 [SWAP]
/dev/zram0 lz4           491M   4K   63B    4K       4 [SWAP]

注意到这里的压缩算法,有两种算法 lzo 和 lz4 可选,默认是 lzo。根据 Benchmark,lz4 的压缩和解压性能在压缩率和 lzo 持平的情况下显著高于后者,因此我们应该采用 lz4 而非 lzo 以获得更高的系统效率。

虽然 zramctl 可以帮助调整 zram 的情况,但是我们还是应该在系统启动时就将这些东西配置好。zram-config 安装好后会默认添加 zram-config.service,这个 service 是运行 /usr/bin/init-zram-swapping 这个脚本以配置对应的 zram 设备,默认情况下,其配置设备的内容应该是这样:

#!/bin/sh

# load dependency modules
NRDEVICES=$(grep -c ^processor /proc/cpuinfo | sed 's/^0$/1/')
if modinfo zram | grep -q ' zram_num_devices:' 2>/dev/null; then
  MODPROBE_ARGS="zram_num_devices=${NRDEVICES}"
elif modinfo zram | grep -q ' num_devices:' 2>/dev/null; then
  MODPROBE_ARGS="num_devices=${NRDEVICES}"
else
  exit 1
fi
modprobe zram $MODPROBE_ARGS

# Calculate memory to use for zram (1/2 of ram)
totalmem=`LC_ALL=C free | grep -e "^Mem:" | sed -e 's/^Mem: *//' -e 's/  *.*//'`
mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

# initialize the devices
for i in $(seq ${NRDEVICES}); do
  DEVNUMBER=$((i - 1))
  echo $mem > /sys/block/zram${DEVNUMBER}/disksize
  mkswap /dev/zram${DEVNUMBER}
  swapon -p 5 /dev/zram${DEVNUMBER}
done

如果我们要默认使用 lz4 算法,那么应该将最后一段改成这样:

# initialize the devices
for i in $(seq ${NRDEVICES}); do
  DEVNUMBER=$((i - 1))
  echo lz4 > /sys/block/zram${DEVNUMBER}/comp_algorithm
  echo $mem > /sys/block/zram${DEVNUMBER}/disksize
  mkswap /dev/zram${DEVNUMBER}
  swapon -p 5 /dev/zram${DEVNUMBER}
done

注意算法设置一定要在配置空间大小之前,否则不能正确修改。

修改过后,运行 systemctl restart zram-config 就可以载入新的配置。

参考资料:

https://askubuntu.com/questions/1044976/make-zram-use-lz4-compression-algorithm
https://github.com/lz4/lz4
https://sites.google.com/site/easylinuxtipsproject/speed#TOC-Only-768-MB-RAM-or-less:-enable-zRam
http://tuxdiary.com/2015/07/28/zram/
https://wiki.archlinux.org/index.php/improving_performance#Zram_or_zswap

 

修改 Linux 默认的 IO Scheduler

RHEL 系我不知道怎么弄,我也没有机器是这个

在 /etc/default/grub 中,找到 GRUB_CMDLINE_LINUX_DEFAULT="" 这行,可能原来后面双引号中间有参数,这个各个机器不同,如果要修改默认的 CFQ Scheduler,那么在这里加上 elevator=noop 这样的内容,且和之前的旧内容有一空格。之后 update-grub2 重启即可。

之后 cat /sys/block/sda/queue/scheduler 就可以看到当前使用的调度器

IO Scheduler 有三个选择 cfq noop 和 deadline

参考资料:

https://www.ibm.com/developerworks/cn/linux/l-lo-io-scheduler-optimize-performance/index.html
https://askubuntu.com/questions/78682/how-do-i-change-to-the-noop-scheduler
Red_Hat_Enterprise_Linux-6-Performance_Tuning_Guide-en-US
Red_Hat_Enterprise_Linux-7-Performance_Tuning_Guide-en-US

iKoula 盒子的一些记录

之前听人整天听人吹 iKoula 网络好,但是因为性价比太低一直没买,这次黑五总算有性价比还行的型号,就买了台,真香

我这台是 109 段的 G 管,首先要配置一下 IPv6,运行这样一个脚本:

serveripv4=$( ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:" )
interface=$( ifconfig -a | grep -B 1 $serveripv4 | head -n1 | awk '{print $1}' | sed "s/:$//" )
AAA=$( echo $serveripv4 | awk -F '.' '{print $1}' )
BBB=$( echo $serveripv4 | awk -F '.' '{print $2}' )
CCC=$( echo $serveripv4 | awk -F '.' '{print $3}' )
DDD=$( echo $serveripv4 | awk -F '.' '{print $4}' )

cat>>/etc/network/interfaces<<EOF
iface $interface inet6 static
address 2a00:c70:1:$AAA:$BBB:$CCC:$DDD:1
netmask 96
gateway 2a00:c70:1:$AAA:$BBB:$CCC::1
EOF

然后 systemctl restart networking.service 就行了。

如果你像我一样运气不好,拿到了一块 WD 绿盘,IntelliPower 这种垃圾技术的盘,那么还得想办法拯救一下。绿盘默认 8 秒会把磁头停到启停区,这时候如果去读盘,就会卡一下,我们通过 idle3ctl 关闭这个功能:

sudo apt-get install idle3-tools
sudo apt-get install idle3-tools # Show current idle3 value
sudo idle3ctl -s 138 /dev/sda # setting to 300 seconds
# The man page for idle3ctl states that values between 1 and 128 add 0.1 seconds, values between 129 and 256 add 30s: 128 * 0.1 + (138 - 128) * 30 = 312.8 seconds
sudo idle3ctl -d /dev/sda # Disable parking, recommended

之后就是网卡,iKoula 的桌面主板用的是 RTL8168 这块开 BBR 会掉速 4MB 的螃蟹卡,我们需要更新驱动

由于 Realtek 的官网不太好使,我备份了驱动到自己的站点

apt update && apt install build-essential libelf-dev linux-headers-$(uname -r)
wget https://down.gloriousdays.pw/Tools/0012-r8168-8.046.00.tar.bz2
tar xjvf 0012-r8168-8.046.00.tar.bz2
cd r8168-8.046.00
./autorun.sh || modprobe r8169

这样就会安装上 R8168 的驱动了,之间会断网 3-5 分钟,之后重连即可,不需要 screen,但是如果一定要用也行。

使用 ethtool 查看驱动情况,如果是 r8168 就已经完成:

# ethtool -i eth0
driver: r8168
version: 8.046.00-NAPI
firmware-version:
expansion-rom-version:
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

如果 10 分钟还连不上,去后台手动重启。

参考资料:

https://wdullaer.com/blog/2015/04/05/hack-your-wd-greens/

 

关于 BT 客户端 Too many open files 的问题

感谢星菊对这个问题提供的帮助

换用 libtorrent 1.1 以后,由于 arvidn 改善了 IO 线程的问题,因此总是出现 too many open files 错误,在多方询问以后,终于解决了这个问题。

如果去查这个问题,通常会建议修改 limits.conf,修改 ulimit -n 参数,在 sysctl.conf 中添加 fs.file-max 参数等等,然而都不能解决这个问题。

实际上,目前以 systemd 作为启动工具的发行版,都存在两套限制体系,一个是 limits.conf,负责限制命令行模式启动的程序,另一个是 /etc/systemd/system.conf,限制以 systemd service 方式启动的程序。因此如果要解决这个问题,需要所有的地方都进行修改。

在 /etc/systemd/system.conf 中,加上:

DefaultLimitNOFILE=999998
DefaultLimitNPROC=999998

在 /etc/sysctl.conf 中,加上:

fs.file-max = 2097152
fs.nr_open = 2097152

在 /etc/security/limits.conf 中,加上:

*         hard    nofile      999999 
*         soft    nofile      999999 
root      hard    nofile      999999 
root      soft    nofile      999999 

然后就可以解决问题了。