分类目录归档:Linux

修改 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 

然后就可以解决问题了。

 

如何查看 HBA 卡下的硬盘的 SMART 信息

盒子的盘挂了,但是这个盒子不是 SWR 的所以不太方便直接查看 SMART 信息。emm, 实际上还是很方便的。

我这个盒子是的 HWR 实际上通过一张 HBA 卡完成,信息是这样的:

root@dedi-par-28324:~# lspci|grep LSI
01:00.0 Serial Attached SCSI controller: LSI Logic / Symbios Logic SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (rev 03)

通过查看 SCSI 的信息,我们能看到卡下面连接的两块硬盘:

root@dedi-par-28324:~# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 01 Id: 00 Lun: 00
  Vendor: Dell     Model: Virtual Disk     Rev: 1028
  Type:   Direct-Access                    ANSI  SCSI revision: 06
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: WDC WD2003FYYS-1 Rev: 1D02
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi0 Channel: 00 Id: 01 Lun: 00
  Vendor: ATA      Model: WDC WD2003FYYS-1 Rev: 1D02
  Type:   Direct-Access                    ANSI  SCSI revision: 05

如果要看 SMART 信息的话,只需要加载 sg 这个驱动就可以了(sg 为 Linux SCSI Generic driver 的缩写)

modprobe sg
echo sg >> /etc/modules

然后盘会挂在 sg1 sg2 这样的位置下面,用 # smartctl -a /dev/sg1 这样的命令就能看到 SMART 信息了。

在 $HOME 目录安装 Deluge 客户端

注意:这个教程是在 PulsedMedia 盒子上安装 Deluge 的实践,存在大量 platform-specific 的内容,在其他商家的盒子上尝试时要加以修改。

PulsedMedia 盒子的宿主机是 Ubuntu 14.04,所有自带的软件也是基于该发行版,自带的 Python 为 2.7.9,且缺乏大量的库。如果我们要安装 Deluge,需要从头解决一系列依赖问题。

在 User Space 编译安装的方法

比较清真的做法是创建 $HOME/.local 目录,然后在下面创建对应的 bin, lib 和 include 目录,然后再创建 usr 目录,并创建另一套 bin, lib 和 include。

在完成文件夹创建以后,在 .bashrc 中修改自己的 $PATH, $LD_LIBRARY_PATH, $C_INCLUDE_PATH, $CPLUS_INCLUDE_PATH 这几个环境变量:

export PATH=/home/<user>/.local/bin:/home/<user>/.local/usr/bin:$PATH
export LD_LIBRARY_PATH=/home/<user>/.local/lib:/home/<user>/.local/usr/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/<user>/.local/include:/home/<user>/.local/usr/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/<user>/.local/include:/home/<user>/.local/usr/include:$CPLUS_INCLUDE_PATH

<user> 修改为自己的 Unix 用户名

在修改了这些环境变量之后,配合编译时的 –prefix 参数以及 pip/python 的 –user 参数就可以将程序安装在自己的 $HOME 目录下

Deluge 依赖的安装

pip

对,你没看错,这机器 pip 都没有,好在这个相对来说还是比较简单,Python 官方也提供了对应的 py 程序

wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py -O - | python - --user

Boost

libtorrent 编译需要 boost,我们选择 Boost 1.65.1 这个经过大量测试的版本

wget https://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_65_1.tar.gz
tar xzvf boost_1_65_1.tar.gz
cd boost_1_65_1
./bootstrap.sh --prefix=$HOME/.local
./b2 install -j $(nproc)

Geoip

这也是 libtorrent 依赖的库之一

git clone https://github.com/maxmind/geoip-api-c.git
./bootstrap
./configure --prefix=$HOME/.local
make -j $(nproc)
make check
make install

libtorrent

终于可以安装 libtorrent 了,这个和之前正常安装的区别不大,唯一的区别在于要指定 –prefix 和 –with-boost-libdir

git clone https://github.com/arvidn/libtorrent.git libtorrent-1.0.11
git checkout RC_1_0
./autotool.sh
./configure --enable-python-binding --with-libiconv --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11 --prefix=$HOME/.local --with-boost-libdir=$HOME/.local/lib
make -j $(nproc)
make install

Deluge 的 py 依赖

这个没什么好说的

pip install attr chardet click colorama pyopenssl pam pyasn1 pyasn1-modules serial service_identity Twisted zope.interface setuptools notify pygame mako automat constantly hyperlink incremental pyxdg --user

但是有三个库,intltool, libsrvg 和 xdg-utils 没有,我们需要另行安装

intltool

wget http://ftp.gnome.org/pub/gnome/sources/intltool/0.40/intltool-0.40.6.tar.gz
tar zxvf intltool-0.40.6.tar.gz
cd intltool-0.40.6
./configure --prefix=$HOME/.local
make && make install

libsrvg

该库依赖 librsvg2-common librsvg2-2 libglib2.0-0 和 libgdk-pixbuf,其中前三个可以直接用 apt-get download 命令取得,后一个不知为何没办法在 apt 上找到,只能去补佳乐的 package 网站上寻找,地址在这里。我们用的版本是 2.31.1-2+deb8u7。

使用 dpkg -x 命令可以将 .deb 包释放在指定目录下,但是不能完成 apt 安装的配置过程,好在这几个 library 只是文件而已,所以这么做并没有什么问题

apt-get download librsvg2-common librsvg2-2 libglib2.0-0
wget http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u7_amd64.deb
dpkg -x libgdk-pixbuf2.0-0_2.31.1-2+deb8u7_amd64.deb ~/.local
dpkg -x libglib2.0-0_2.42.1-1+b1_amd64.deb ~/.local
dpkg -x librsvg2-2_2.40.5-1+deb8u2_amd64.deb ~/.local
dpkg -x librsvg2-common_2.40.5-1+deb8u2_amd64.deb ~/.local

注意 .deb 的名字可能随着版本升级而改变,所以复用的时候要注意一下

xdg-utils

和上面一样,用 apt 取得包以后再释放

apt-get download xdg-utils
dpkg -x xdg-utils_1.1.0~rc1+git20111210-7.4_all.deb ~/.local

Deluge

最后,正常安装 deluge 即可

wget http://download.deluge-torrent.org/source/deluge-1.3.15.tar.gz
tar xzvf deluge*.tar.gz
python setup.py build
python setup.py install --user

之后 deluged 和 deluge-web 会被安装在 $HOME/.local/bin 下面,由于之前已经修改了环境变量,所以直接运行就可以了

如果要让 deluged 工作在不同的端口,使用 deluged -p 23333 这样的命令就行,然后在 deluge-web 中改一下连接的 daemon 端口就行了

至此,deluge 应该已经可以正常运行了。

 

关于 Docker 中 tty 尺寸不太对的问题

不知道为啥就是不行,不过本来就对 docker 这玩意没啥好感。

$ docker exec -it foo /bin/bash
foo@649fb21d747c:~$ stty size
0 0
foo@649fb21d747c:~$ reset -w
foo@649fb21d747c:~$ stty size
24 80
foo@649fb21d747c:~$ # That was still wrong. Now resize the terminal to get a SIGWINCH.
foo@649fb21d747c:~$ stty size
69 208
foo@649fb21d747c:~$ exit
exit
$ docker exec -it foo /bin/bash # Try it again.
foo@649fb21d747c:~$ stty size
69 208
foo@649fb21d747c:~$ # Doesn't happen anymore for this session.

 

Docker 的生命周期

Docker 这东西的文档过于不好用了,或者说我没看对地方,总之就是我一直都不怎么会用。直到我看到了这张图:

这下子就清楚很多了。我们一般用 docker exec 命令来在里面运行一个 bash,然后再继续进行操作,这个操作需要 container 在 running 状态下才能执行。

总结一下最简单的使用场景,pull 一个 imgae以后,启动一个 container,然后再把它删掉:

docker pull <image_name>
docker run -itd --name <container_name> <image> # Started a docker in background
docker exec -ti <container_name> <command>
docker stop <container_name>
docker rm <container_name>

然后就行了

一个完整的 BT 客户端安装记录

博客里面此类文章版本实在太多,每次我自己装一遍都要参考两三篇文章也实在是蛋疼,于是整理一下。

Compiler and Depencency

首先是一些依赖包的安装:

# gcc-8 Prerequisites (optional)
add-apt-repository ppa:ubuntu-toolchain-r/test
# Compiler
apt install gcc-8 g++-8 # (optional)
apt install build-essential checkinstall pkg-config automake libtool git
# Libtorrent Dependency
apt install libboost-dev libboost-system-dev libboost-python-dev libboost-chrono-dev libboost-random-dev libssl-dev libgeoip-dev
# Deluge Dependency
apt install python-pip python-attr python-chardet python-click python-colorama  python-openssl python-pam python-pyasn1 python-pyasn1-modules python-serial python-service-identity python-twisted-bin python-twisted-core python-zope.interface python-twisted python-openssl python-setuptools intltool geoip-database python-notify python-pygame python-glade2 librsvg2-common xdg-utils python-mako
apt install python-automat python-constantly python-hyperlink python-incremental # Only on Ubuntu 18.04+ (16.04 do not have these packages)
# qBittorrent Dependency
apt-get install qtbase5-dev qttools5-dev-tools libqt5svg5-dev

libtorrent

考虑到双栈 IP 汇报的问题,仍然使用 libtorrent 1.0.11

首先应该打上 std=c++11 的 patch:

diff -uNr libtorrent/bindings/python/compile_flags.in libtorrent-cpp11/bindings/python/compile_flags.in
--- libtorrent/bindings/python/compile_flags.in	2018-04-18 06:49:46.350053702 +0000
+++ libtorrent-cpp11/bindings/python/compile_flags.in	2018-04-18 07:58:13.883000009 +0000
@@ -1 +1 @@
-@COMPILETIME_OPTIONS@ @CPPFLAGS@ @LIBS@ @BOOST_CPPFLAGS@ @BOOST_SYSTEM_LIB@ @BOOST_PYTHON_LIB@ @PTHREAD_LIBS@ @OPENSSL_LIBS@ @OPENSSL_LDFLAGS@ @OPENSSL_INCLUDES@ -I@top_srcdir@/include
+@COMPILETIME_OPTIONS@ @CXXFLAGS@ @CPPFLAGS@ @LIBS@ @BOOST_CPPFLAGS@ @BOOST_SYSTEM_LIB@ @BOOST_PYTHON_LIB@ @PTHREAD_LIBS@ @OPENSSL_LIBS@ @OPENSSL_LDFLAGS@ @OPENSSL_INCLUDES@ -I@top_srcdir@/include
diff -uNr libtorrent/bindings/python/setup.py libtorrent-cpp11/bindings/python/setup.py
--- libtorrent/bindings/python/setup.py	2018-04-18 06:49:46.350053702 +0000
+++ libtorrent-cpp11/bindings/python/setup.py	2018-04-18 07:59:26.123112215 +0000
@@ -104,7 +104,7 @@
 		library_dirs = parse_cmd(extra_cmd, '-L'),
 		extra_link_args = ldflags.split() + arch(),
 		extra_compile_args = parse_cmd(extra_cmd, '-D', True) + arch() \
-			+ target_specific(),
+			+ target_specific() + ['-std=c++11'],
 		libraries = ['torrent-rasterbar'] + parse_cmd(extra_cmd, '-l'))]
 
 setup(name = 'python-libtorrent',

然后是编译:

git clone https://github.com/arvidn/libtorrent.git libtorrent-1.0.11
git checkout RC_1_0
./autotool.sh
./configure --enable-python-binding --with-libiconv --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11
# if compile on armhf (SoYouStart ARM)
# ./configure --enable-python-binding --with-libiconv --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11 --with-boost-libdir=/usr/lib/arm-linux-gnueabihf
make -j$(nproc)
checkinstall
ldconfig

Deluge

wget http://download.deluge-torrent.org/source/deluge-1.3.15.tar.gz
tar xzvf deluge*.tar.gz
python setup.py build
python setup.py install --install-layout=deb

注意这个最好别用 checkinstall 安装,可能会导致一些不可预知的错误。

qBittorrent

git clone https://github.com/qbittorrent/qBittorrent.git
# git clone https://github.com/c0re100/qBittorrent-Enhanced-Edition.git
git checkout <branch> # e.g. v4_1_x; v3_3_x
./configure
# ./configure --with-boost-libdir=/usr/lib/arm-linux-gnueabihf
make -j$(nproc)
checkinstall

systemd Example

deluged.service

$ cat /etc/systemd/system/deluged.service 
[Unit]
Description=Deluged
After=network-online.target

[Service]
ExecStart=/usr/bin/sudo -u <username> /usr/bin/deluged -d
ExecStop=/bin/kill -9 $(cat /run/deluged.pid)
Restart=always
PIDFile=/run/deluged.pid
TimeoutStopSec=300
RestartSec=3

[Install]
WantedBy=multi-user.target

deluge-web.service

$ cat /etc/systemd/system/deluge-web.service 
[Unit]
Description=Deluge-web
After=network-online.target deluged.service
Wants=deluged.service

[Service]
ExecStart=/usr/bin/sudo -u <username> /usr/bin/deluge-web
ExecStop=/bin/kill -9 $(cat /run/deluge-web.pid)
Restart=always
PIDFile=/run/deluge-web.pid
RestartSec=3

[Install]
WantedBy=multi-user.target

References

https://github.com/qbittorrent/qBittorrent/wiki/Compiling-qBittorrent-on-Debian-and-Ubuntu
https://dev.deluge-torrent.org/wiki/Installing/Source
https://github.com/amefs/QB/blob/master/setup/sources/libtorrent-rasterbar-RC_1_0.patch

关于 VMware 在 Linux Kernel 4.13+ 上无法正常启动的问题

在 Ubuntu 18.04 上使用 VMware 时,遇到了一个很奇怪的问题,在正常安装好了以后,运行 VMware 却报错:

/usr/lib/vmware/bin/vmware-modconfig: Relink `/lib/x86_64-linux-gnu/libbsd.so.0′ with `/lib/x86_64-linux-gnu/librt.so.1′ for IFUNC symbol `clock_gettime’

经查询以后,发现是大概是 VMware 自己代码写太差造成的问题,这个问题在 12.5+ 的版本都存在,需要对内核模块进行 patch 以后才能正常工作。

经过 patch 的内核模块在这里:https://github.com/mkubecek/vmware-host-modules

在这个 repo 中,不同的 branch 对应了不同版本的 VMware 的内核模块代码,切换到自己需要的版本以后,这样应用:

git clone https://github.com/mkubecek/vmware-host-modules.git
git checkout <branch>
make
make install
modprobe -r vmmon
insmod /lib/modules/$(uname -r)/misc/vmmon.ko
insmod /lib/modules/$(uname -r)/misc/vmnet.ko 
rm /usr/lib/vmware/lib/libz.so.1/libz.so.1
ln -s /lib/x86_64-linux-gnu/libz.so.1 /usr/lib/vmware/lib/libz.so.1/libz.so.1  # see https://communities.vmware.com/thread/572259
vmware-networks --start  # see https://forum.chakralinux.org/viewtopic.php?id=8579

之后正常运行 VMware 就可以了。

参考资料:

https://askubuntu.com/questions/966585/ubuntu-17-10-upgrade-broke-vmware-workstation-12-5
https://github.com/mkubecek/vmware-host-modules