分类目录归档:System Maintenance

关于 Linux Kernel 4.15 + gcc 7.3 编译内核模块时无法找到 stdarg.h 的问题

这是一个非常奇怪的错误,出现在 Ubuntu 18.04 上,默认安装的内核版本是 4.15,gcc 是 7.3,在编译内核模块时报错:

In file included from ./include/linux/list.h:9:0,
                 from ./include/linux/module.h:9,
                 from /root/Software/newbbr/tcp_tsunami.c:59:
./include/linux/kernel.h:6:10: fatal error: stdarg.h: No such file or directory
 #include <stdarg.h>
          ^~~~~~~~~~
compilation terminated.

gcc 认为找不到 stdarg.h。看这个错误的位置,个人认为应该不是我配置的问题或者是我代码的问题,搜索了一下,也有很多在 4.15 内核上出现的同样错误。目前没有什么很好的解决方案,暂时性的方案是在编译的 Makefile 里面加一行:

ccflags-y=-I/usr/lib/gcc/x86_64-linux-gnu/7/include

如果是 gcc 8,就相应把版本改成 8 就可以了

将 Linux 上的 VSCode 改为 Consolas 字体

Linux 上的 VSCode 写起代码来总让人觉得莫名烦躁,而 Windows 上面的 VSC 就赏心悦目很多,想了很久之后终于发现是默认字体的问题。Windows 上面的 VSC 默认是 Consolas 字体,在 Ubuntu 上面大概是 Droid Sans 家族的某种版本,实在是不好看,所以换掉。

首先要在 Ubuntu 上安装 Consolas:

wget https://down.gloriousdays.pw/Fonts/Consolas.zip
unzip Consolas.zip
sudo mkdir -p /usr/share/fonts/consolas
sudo cp consola*.ttf /usr/share/fonts/consolas/
sudo chmod 644 /usr/share/fonts/consolas/consola*.ttf
cd /usr/share/fonts/consolas
sudo mkfontscale && sudo mkfontdir && sudo fc-cache -fv

这样就装好了。用 fc-list 可以看所有安装的字体。

之后在 VSC 的 preference 中修改对应的项:

"editor.fontFamily": "'Consolas', 'Droid Sans Mono', 'monospace', monospace, 'Droid Sans Fallback'"

这样就可以了

20181130 Update:

如果没有 root 权限,由于 ~/.fonts 实际上就是用户个人的字体文件夹,因此我们在 $HOME 文件夹下也可以做到同样的事情:

wget https://down.gloriousdays.pw/Fonts/Consolas.zip
unzip Consolas.zip
mkdir ~/.fonts
cp consola*.ttf ~/.fonts
cd ~/.fonts
mkfontscale
mkfontdir
fc-cache -fv ~/.fonts

之后用 fc-list 可以看到新安装的字体,在 VSCode 中也可以进行调整。

无 root 权限的服务器使用的一些记录

在没有 root 权限的服务器上安装 pip

假设有这么一台服务器,你没有 root 权限,然后预配置的 tensorflow 环境很神奇地调用不了 GPU,只有 pip2 没有 pip3,python2 python3 都试过了都没法用 GPU,pip list 也显示安装了 tensorflow-gpu,且给你用户的人信誓旦旦地告诉你我这配置没问题,但是你就是用不了 GPU,那么怎么办呢?

解决方法还是比较简单的,首先在用户态安装一个 pip(本文要装 pip3)

wget https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py --user

这时候 pip3 会被安装到 ~/.local/bin 下面,如果你的 PATH 里面有这个路径的话,直接 pip3 就可以运行。

然后就很简单了,该干嘛干嘛,比如安装 virtualenv 等等,只不过这时候你安装任何 python 包的时候,要加上 –user 参数,才能安装到 $HOME 下面,例如 pip3 install virtualenv –user。

我之前提到的那台服务器呢,在装了 pip3 以后,list 一下发现根本就没有 tensorflow-gpu,只有 tensorflow;pip2 里面有,但是调用不了显卡,搞不懂 IT 究竟是怎么配置的。最后我也懒得烦了,直接 virtualenv,装一个 tensorflow-gpu,问题就解决了。

安装一个简单的 deb 包(没有 dependency 问题那种)

apt download <package>
dpkg-deb -x package_x.y.z_x86_64.deb my-private-root
#dpkg-deb -e package_x.y.z_x86_64.deb my-private-control

然后就装在了你自己的 $HOME 下面。

如果你装的是 screen,且你对 /var/run/screen/ 也没权限的话,这么干:

mkdir ~/.screen && chmod 700 ~/.screen
export SCREENDIR=$HOME/.screen

然后把对应的内容添加到 .bashrc 里面去让你每次都可用,比如说:

PATH=~/usr/bin:$PATH
export SCREENDIR=$HOME/.screen

 

Ubuntu 18.04 LTS 盒子环境的部署

本文测试环境为 Hetzner E3-1245V2 独服,系统为官方的 Ubuntu 18.04 Minimal 模板。本文需要综合上一篇盒子配置文章阅读。

写在前面

经过长期的测试,考虑到双栈 IP 的需求,Deluge / qBittorrent 需要 libtorrent 1.0.11 版本才能正常汇报双栈 IP,所以本文很多操作都为了这个目标而设。

Deluge 1.3.15 官方 PPA 仍然没有更新 18.04 对应的二进制包,所幸 Ubuntu 官方源里面就是 1.3.15,理论上可以使用。但是考虑到使用 apt 安装会导致安装官方源中自带的 libtorrent 1.1.5 的依赖,因此选择完全编译安装 libtorrent 与 Deluge。

Wine 官方源也没有增加 Ubuntu 18.04 的支持,Ubuntu 官方源中有对应的 wine64 软件包,因此选择安装该包而非 Wine 官方的版本。

E3-1245V2 有自带 Intel 集显,考虑到 X11VNC 配合 Xorg 使用可以支持完整的键盘操作(VNCserver 存在无法输入 tab、WinKey 的问题,还有 24bit 显示导致 VMware 颜色错乱的问题),本文中选择安装 X11VNC。考虑到通用性,仍应参考上一篇文章使用 VNCserver。

环境的部署

本文所有编译环境采用最新的 gcc-8.1 完成,注意 Boost 需要最高 1.65.1 版本,这个和目前 Ubuntu 源中的版本一致。

# gcc-8 Prerequisites
add-apt-repository ppa:ubuntu-toolchain-r/test
# Compiler
apt install gcc-8 g++-8 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-automat python-chardet python-click python-colorama python-constantly python-hyperlink python-incremental 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
# qBittorrent Dependency
apt-get install qtbase5-dev qttools5-dev-tools libqt5svg5-dev

libtorrent 1.0.11 的编译

综合参考 Deluge 的文档与 qBittorrent 的文档。

git clone https://github.com/arvidn/libtorrent.git libtorrent-1.0.11
git checkout $(git tag | grep libtorrent-1_0_ | sort -t _ -n -k 3 | tail -n 1)
./autotool.sh
./configure --enable-python-binding --with-libiconv --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11
make -j$(nproc)
checkinstall
ldconfig

注意 libtorrent 1_0_x 的代码需要修改才能正常地引用 Boost,毛球说 RC_1_0 分支不存在本问题,未作测试。

//修改include/libtorrent/export.hpp
//那两个hpp文件在boost/config/detail/下,而不是boost/config/下

#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG)
#  include <boost/config/detail/select_compiler_config.hpp>
#endif
#ifdef BOOST_COMPILER_CONFIG
#  include BOOST_COMPILER_CONFIG
#endif

#if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG)
#  include <boost/config/detail/select_platform_config.hpp>
#endif
#ifdef BOOST_PLATFORM_CONFIG
#  include BOOST_PLATFORM_CONFIG
#endif

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

注意这种方式安装的 Deluge 默认在 /usr/local/bin 下,而不是像 deb 安装一样在 /usr/bin。如果需要安装在 /usr/bin 下,安装时添加参数 –install-layout=deb。

其他软件的部署

add-apt-repository ppa:transmissionbt/ppa
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
dpkg --add-architecture i386 
apt install --install-recommends xorg x11vnc transmission-daemon sshfs nodejs firefox fonts-noto xfce4 wine-stable
apt install gtk3-engines-xfce xfce4-goodies xfce4-power-manager

Xorg 配置文件

位置在 /usr/share/X11/xorg.conf.d/20-intel.conf

Section "Device"
   Identifier  "Intel Graphics"
   Driver      "intel"
   Option      "AccelMethod"  "sna"
   Option      "TearFree"     "true"
EndSection

Section "Monitor"
    Identifier      "External VGA"
    Modeline        "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -Hsync +Vsync
    Option          "PreferredMode" "1600x900_60.00"
EndSection

Section "Screen"
    Identifier    "Screen0"
    Device        "Device0"
    Monitor       "Monitor0"
    DefaultDepth  24
    SubSection "Display"
        Depth 24
        Modes "1600x900"
        Virtual 1600 900
    EndSubSection
EndSection

X11VNC 与 Xorg 的 systemd 启动脚本

# xserver.service
[Unit]
Description=Xserver
After=network-online.target

[Service]
ExecStart=/usr/bin/sudo /usr/bin/startx -- :0
Restart=always
Type=simple
RestartSec=3

[Install]
WantedBy=multi-user.target
# x11vnc.service
[Unit]
Description=X11vnc
After=network-online.target xserver.service
Wants=xserver.service

[Service]
ExecStart=/usr/bin/sudo /usr/bin/x11vnc -rfbport 25901 -rfbauth /root/.vnc/passwd  -display :0 -forever -nevershared -bg -repeat -nowf -o /root/.vnc/x11vnc.log
Restart=always
Type=forking
RestartSec=3

[Install]
WantedBy=multi-user.target

x11vnc 需要首先创建 ~/.vnc/passwd 文件,这个 VNCserver 运行的时候也会自动创建,我懒得重新建立就没研究这个,改日有空再写吧。

Xorg 默认启动的文件为 ~/.xinitrc

#!/bin/sh

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
. /etc/X11/Xsession
exec startxfce4

参考资料

https://wiki.archlinux.org/index.php/Xinit_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://wiki.archlinux.org/index.php/X11vnc_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://blog.csdn.net/songbaiyao/article/details/72858087

https://wiki.archlinux.org/index.php/Xorg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://wiki.archlinux.org/index.php/Intel_graphics_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://serverfault.com/questions/174003/how-can-opengl-graphics-be-displayed-remotely-using-vnc

https://askubuntu.com/questions/537787/enable-3d-hw-acceleration-on-vmware-workstation-10-on-ubuntu-14-04

https://github.com/qbittorrent/qBittorrent/wiki/Compiling-qBittorrent-on-Debian-and-Ubuntu

https://dev.deluge-torrent.org/wiki/Installing/Source

关于 qBittorrent 编译的一些问题

您可能是开源软件的受害者!

您可能是开源软件的受害者!

您可能是开源软件的受害者!

重要的事情说三遍。

实际上这次也没做什么理论上很麻烦的事情,就是 clone 一个 qBittorrent 4.0.4.3 的源码,配合 libtorrent 1.0.11 编译一下,理论上不应该有什么问题的对吧。然而就是出问题了……

编译的过程很顺利,安装 Deluge PPA 的 libtorrent-rasterbar-dev 和一些 boost 库之后开始编译,然后到了 linking 的过程就报错了:src/base/bittorrent/private/filterparserthread.cpp:99: reference to `boost::asio::ip::address_v4::address_v4(std::array<unsigned char, 4u> const&)'

按照 GitHub Issue #6721,这个问题可能是因为 std::arrayboost::array 这两个名称的选择在 libtorrent 和 qbittorrent 里面不同,在没有使用 stdc++11 编译的时候,使用的是 boost::array,反之使用 std::array,考虑到 qbittorrent 默认需要 C++ 11,所以 libtorrent 应该使用同样的 CXXFLAGS 编译才能在 linking 的时候不报错。因此既然出现了现在这个问题,就证明 Deluge PPA 的 libtorrent 是没有使用 C++11 编译的。

之前在编译 qb 3.3.16 的时候并没有出现这个错误,可能是 qb3 不要求 C++11 的原因。

那么如果要解决这个问题,就必须从源码开始编译 libtorrent。考虑到 lt1.1.x 至今无法解决 U2 的双栈 IP 汇报问题,因此只能采用 lt1.0。

git clone https://github.com/arvidn/libtorrent.git
cd libtorrent
git checkout $(git tag | grep libtorrent-1_0_ | sort -t _ -n -k 3 | tail -n 1)
./autotool.sh
./configure --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11

在编译完成之后,checkinstall 安装,然后再去编译 qb 就应该可以了。

关于 Boost 版本

Boost 版本的选择也有一些讲究,Ubuntu Package 默认的是 1.58 版本的 boost,qb 经过测试,最高只能使用 1.65.1 版本的 boost,如果想要使用新一些的版本,只能自己编译。

我在编译 1.65.1 的时候,遇到了一个以前从来没有的问题,找不要 pyconfig.h,这个文件本应该存在于 /usr/include/python 或者 python2.7 或者 python3.5 的目录下(取决于默认 Python 版本),但是我那个 Python 2 就是没有这个文件,因此将 Python 默认改为 3.5(sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 10)才让 boost 的编译器找到对应的 Python 头文件。如果出现这样的问题需要注意。

使用 echo -e '#include <boost/version.hpp>\nBOOST_VERSION' | gcc -x c++ -E - 这个命令可以查看当前 include 的 boost 版本。

Python 版本切换的注意点

如果安装了 Deluge,然后再切换到 Python3,可能会让 Python 找不到 Deluge 的包,然后无法运行,解决方法是修改 /usr/bin/deluged 和 /usr/bin/deluge-web 的第一行,用 python2.7 运行。或者也可以编译完 boost 以后再把默认 python 改回来。

 

Syncthing 配合 Nextcloud 搭建私有云

写在前面

首先感谢 youlun 大佬介绍了 Syncthing 这个好用的文件同步工具,一次性解决了 Nextcloud 同步残废的问题。

有人可能会问,Nextcloud 不就已经可以搭建私有云平台了吗,为什么还要借助 Syncthing 这样一个同步工具呢?如果文件量不大的话,可能这并不是什么大问题,但是由于 Nextcloud 即使是使用它的客户端,也只能通过网页方式上传,在遇到较大的文件的时候,就会遇到各种各样的限制,比如上传超时或者是文件过大不能上传等等。但是 Syncthing 就不存在这样的问题,可以顺畅地进行文件同步。那么,有没有办法让二者配合工作,即 Syncthing 负责文件同步,Nextcloud 负责网页端的界面和移动端访问的功能呢?答案是有的,而且非常可行,考虑到没有现成的教程,因此在这里记录一下。

LNMP 环境部署

WebServer 环境依然使用了 LinuxEye 的 LNMP 一键包,需要注意的问题是 PHP 选择 7.1 版本(Nextcloud 13.0.1 的依赖),以及需要通过 addon.sh 安装 fileinfo 这个 PHP 模块。

Nextcloud 安装

在部署完成环境之后,添加一个 nginx vhost,现在最新版的一键包中已经加入了 Nextcloud 的 Rewrite Rule,这个给我们的安装带来了极大的方便,再也不用去折腾那些重写规则了。

然后需要调整一下 Zend OPcache 的设置,不然在下载源码之后无法进入配置。具体步骤为在 /usr/local/php/etc/php.d/ 文件夹中找到 opcache 的 .ini 配置文件,将里面的数值按照如下的错误信息调整:

之后在官网下载 tar.bz2 的安装包,解压之后拷贝进 wwwroot,注意这里需要将所有的文件权限改为 www:www,默认一般是登录的用户,会造成无法访问,之后在 MariaDB 中创建一个数据库,在初始化的时候填进 Nextcloud 中,这一步还是比较方便的。

然后更改一下 Nextcloud 的配置,消除缓存的警告。在 <site root>/config/config.php 中添加如下字段即可:

'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
   'host' => 'localhost',
   'port' => 6379,
),

至此 Nextcloud 应该就可以正常使用了。

Syncthing 的配置

首先需要安装 Syncthing,官方文档中给出了 Ubuntu .deb 的链接,按照它配置即可。

这时候就会遇到一个问题,Syncthing 需要以 www 用户启动才能在和 Nextcloud 一同工作时避免一些权限的问题,但是 www 用户默认是 nologin 配置的,如何登陆进这个用户完成一些初始的设置是一个比较麻烦的问题。由于 www 用户无法登录,所以不能使用一般的 su <user> 来进行用户切换,以该用户的权限启动一个 bash 又不能完成完整的用户环境切换操作。在搜索之后,以一种比较 Tricky 的方法登录了进去:

su -s /bin/bash www

这条命令的意思是 override www 默认的 shell,再登录,然后就会发现你已经切换到 www 用户下了。运行 syncthing,该做什么做什么。

Nginx 反代

Syncthing 默认监听 localhost:8384 端口,那么在远端 VPS 上,如何进行配置呢?有两个方案,一个是修改监听端口,让程序监听 0.0.0.0:8384,另外一个是通过 nginx 配置一个反代。显然,第二个方案无论是在安全性,还是便利性(不用在域名后面输入端口号)上都优于第一个,所以我们就采用第二个方案。

Nginx 配置文件的关键部分如下:

server {
  listen 80;
  listen 443 ssl http2;

  if ($ssl_protocol = "") { return 301 https://$host$request_uri; }

  location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host localhost;
          proxy_set_header X-NginX-Proxy true;
          proxy_pass http://localhost:8384;
  }
}

需要注意的一点就是 proxy header 中的 Host 字段必须改为 localhost,否则 Syncthing 发现你的访问地址不是它的监听地址,就会拒绝访问,返回“Host check error“。

之后就是正常的 Syncthing 使用,这个不难,看官方文档就可以了。

Syncthing 和 Nextcloud 配合工作

一开始我以为,把 Syncthing 的同步文件夹设置为我的 Nextcloud 的数据目录就可以完成同步,实际上 Nextcloud 的文件列表并不是实时的,需要运行 OCC 重新进行扫描,但是这样的扫描并不能保证数据完全无损,而且在使用时也不可能频繁 SSH 上去进行重扫,因此必须采取其他的方法。

关于这个问题,官方给出的答案是 External Storage,在 Nextcloud 中启用 External Storage 这个组件以后,在设置中挂载外部的文件夹,这个可以是本地,也可以是 SFTP/FTP/Amazon S3/WebDAV 等等,在这个情况下,我们选择本地,然后添加对应的文件夹就可以在 Nextcloud 文件列表中看到我们的文件了,无论是网页版还是手机都可以。

Syncthing 自动启动

在 Ubuntu 上,我们通过 systemd 服务来完成:

[Unit]
Description=syncthing
After=network-online.target

[Service]
ExecStart=/usr/bin/syncthing -no-browser -home="/home/www/.config/syncthing"
ExecStop=/bin/kill -9 $(/bin/cat /run/syncthing.pid)
Restart=always
PIDFile=/run/syncthing.pid
TimeoutStopSec=300
User=www

[Install]
WantedBy=multi-user.target

在 Windows 上,我们可以通过这样一个 .bat 完成启动:

start "Syncthing" syncthing.exe -no-console -no-browser

参考资料

https://docs.syncthing.net/
https://docs.nextcloud.com/server/13/admin_manual/
https://serverfault.com/questions/333321/executing-a-command-as-a-nologin-user
https://www.jianshu.com/p/4235cc85c32d

Ubuntu HWE Kernel 与 Linux CPU Frequency Scaling

其实 HWE Kernel 和 Frequency Scaling 是两个东西,只不过频率调节的工具是 Kernel 里面的一个组件,我因为没找到对应的 meta-package 而没有安装上正确的版本,然后发现是 HWE Kernel 和 GA Kernel 的不同版本造成的,所以想着干脆一起写篇东西解释一下这些东西的不同。

HWE Kernel

首先要说一说的是 HWE Kernel,按照官网的说法,是为了让 LTS 的 Linux 系统能够迅速支持最新的硬件,所以才命名为 HWE (HardWare Enable)。实际在使用过程中,可能也是我经验不足的原因,没碰上什么硬件太新 Kernel 不支持造成的 bug,所以这个名字怎么定义的其实意义不大。

在使用 Ubuntu 的过程中,应该都会遇到这样一种情况,Ubuntu 会帮我们自动更新内核,在 LTS 版本的 Roadmap 中,我们也可以看到不同的 point release 对应了不同的内核版本,比如 16.04.4 LTS 对应的就是 4.13 的内核。但有的时候,我们会发现,明明自己的系统已经是 16.04.4,为什么内核还是 4.4 版本呢?这是因为 HWE kernel 和 4.4 这样长期支持的 GA Kernel 其实是两个 meta-package,GA Kernel 对应的包是 linux-generic,下有 linux-image-generic 和 linux-headers-generic 这两个包,再往下才是具体的内核包。如果想要跟随 point release 更新系统的内核,那么就应该安装对应的 HWE 内核,HWE 内核是和 LTS 版本绑定的,比如 16.04 就需要加上 -hwe-16.04 后缀,那么对应的内核包就是 linux-generic-hwe-16.04,下面的包是 linux-headers-generic-hwe-16.04 和 linux-image-generic-hwe-16.04。使用这个包,就能安装最新的 4.13 内核(LTS 16.04.04)。

除了普通的 HWE 内核之外,还有一个更加激进的更新版本是 Rolling HWE Stacks,将上面的 -hwe-16.04 换成 -hwe-16.04-edge 就可以使用到这个 Stack。在这个 Stack 中可以提前使用 下一个 point release 中使用的 HWE 内核版本,就有点类似于 beta 测试的分支,这个可能会存在一定的稳定性问题,所以是否使用请自行斟酌。

CPU Frequency Scaling

接下来要说一说的是 CPU 频率调节的问题,在 Windows 上很多人应该都使用过的一个功能是电源方案,里面对 CPU 的最大频率、最小频率,散热方式等等可以做出一些自定义设置,Linux 上同样也提供了这样的功能。

在 Arch Wiki 中,对于这个问题有比较详细的介绍,在这里就简单地说一说:Linux 内核有自己的 CPU 调频实现,称为 cpufreq,这个在 3.4 的内核之后,必要的模块都会自行加载,用户也可以通过一些工具实现自己的调节。

CPU 频率的驱动程序随着 CPU 型号的不同会有很多的版本,具体可以查看 Arch Wiki 上面的说明,对于现在使用的 SandyBridge 以后架构的 CPU,通常使用 intel_pstate 来对频率进行调节。可以通过如下命令来查看 pstate 是否已经启用:

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver

如果显示的都是 intel_pstate,那么你的 CPU 调节使用的就是 p-state 驱动。

CPU 频率的手动调节通常使用 cpupower 这个工具,可以通过如下的命令安装(需要和内核版本一直,这里使用 HWE Kernel 对应的版本):

$ sudo apt-get install linux-tools-common linux-tools-generic-hwe-16.04

之后运行 $ cpupower frequency-info就可以看到 CPU 的信息,大概是这样的输出:

$ cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 1.60 GHz - 3.90 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 1.60 GHz and 3.90 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 3.70 GHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
    3700 MHz max turbo 4 active cores
    3800 MHz max turbo 3 active cores
    3900 MHz max turbo 2 active cores
    3900 MHz max turbo 1 active cores

可以发现,信息比我们从 Windows 上面获取的要多得多,不仅可以看到当前的频率,还能看到最大睿频的信息。

Scaling Governors

Scaling Governor 相当于预设的 CPU 电源方案,在文档中有 6 种不同的调速器,但是在实际使用中,通常只有 performance 和 powersave 两种。performance 相当与强制 CPU 运行在最高频率,而 powersave 可以让 CPU 按需自动调节频率。当前在使用的调速器可以通过如下命令查看:

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

通常来说默认配置是 powersave 模式,如果想调整为 performance,可以执行如下的命令:

$ sudo cpupower frequency-set -g performance

之后再进行查看,应该就是 performance 模式了,CPU 也会被固定在最大睿频上。

固定 Governor 不被修改

直接使用 cpupower 修改之后会存在一个问题,重启之后会被修改回 powersave,可以安装 cpufrequtils 将其固定:

$ sudo apt-get install cpufrequtils
$ sudo systemctl disable ondemand

一定要将 ondemand 这个服务关闭,这个服务会将 governor 设置为 ondemand 模式,但是通常 CPU 都不支持这个模式,然后就会 fallback 到 powersave。

之后在/etc/default/cpufrequtils中添加GOVERNOR="performance",重启即可。

Reference

https://wiki.archlinux.org/index.php/CPU_frequency_scaling_(简体中文)

https://wiki.ubuntu.com/Kernel/LTSEnablementStack

https://wiki.ubuntu.com/Kernel/RollingLTSEnablementStack

http://www.webupd8.org/2014/04/prevent-your-laptop-from-overheating.html

Cisco IOS 命令体系

Command Modes

Cisco 的设备配置时一般分为四种模式,分别为:

  • User EXEC (Router> )
  • Privileged EXEC (Router# )
  • Global Configuration (Rounter(config)# )
  • Interface Configuration (Router(config-if)# )

各模式间切换如下:

User EXEC -> (enable) -> Privileged EXEC -> (configure terminal) -> Global Configuration -> (Specify Interface) -> Interface Configuration

Interface Configuration -> (exit) -> Global Configuration -> (exit / end / Ctrl-Z) -> Privileged EXEC -> (disable) -> User EXEC

Interface Configuration -> (end / Ctrl-Z) -> Privileged EXEC

VLAN

创建一个 VLAN

# configure terminal
(config)# vlan <vlan-id>
(config)# name <vlan-name> [Optional]
(config)# mtu <mtu-size> [Optional]
(config)# end
# show vlan { name <vlan-name> | id <vlan-id> }
# copy running-config startup-config

关联网络接口到 VLAN

# configure terminal
(config)# interface <interface-id>
(config-if)# switchport mode access
(config-if)# switchport access vlan <vlan-id>
(config-if)# end
# show running-config interface <interface-id>
# copy running-config startup-config

杂项

如果手抖输错了命令,交换机开始进行 DNS 查询,并且一直卡在那里,可以用 Shift + Ctrl + 6 停下来。使用 no ip domain-lookup 可以彻底禁用该功能。

Router

SubInterface

Router#configure terminal
Router(config)#interface fastethernet0/0.1
Router(config-if)#encapsulation dot1q 1
Router(config-if)#ip address 10.1.1.128 255.255.0.0
Router(config-if)#no shutdown

该命令创建了 Fa0/0 下的一个 SubInterface Fa0/0.1,配置为属于 VLAN 1,IP 地址为 10.1.1.128/16,将端口状态设置为 up。

Reference:

Cisco IOS IP Configuration Guide

git 使用小结

Git 是一个很好用的工具,相信不用我说大家也承认。以下记录一些会用到的命令行:

  • 创建 Git 仓库:git init
  • 克隆 Git 仓库:git clone /path/to/repository 或 git clone username@host:/path/to/repository
  • 克隆某一分支:git clone -b <branch> <remote git>
  • 将改动添加到缓存区:git add <filename> 或 git add *
  • Git commit: git commit -m “Commit Message”
  • 设置远端:git remote add origin <server>
  • 推送本地改动至远端:git push origin <branch>
    • 强制推送至远端:git push -f origin <branch
  • 添加分支:git checkout -b <branch name>
  • 切换回主分支:git checkout master
  • 删除分支:git branch -d feature_x

使用 checkinstall 代替 make install 编译安装

在 Linux 上编译安装时,我总会有这样一个感觉,make install 放了很多文件到我的系统里,如果我哪天想把这些东西删掉,该怎么做。有人可能会说,make uninstall 不就好了,但是在绝大多数情况下,并没有人会去写这些卸载程序。

这时候就轮到 checkinstall 这个小程序出场了,它可以跟踪 make install 执行的步骤,并且生成相应的 deb/rpm 包,然后就可以使用包管理器愉快地卸载掉编译安装的程序。

以安装 qbittorrent 3.3.16 为例,简要介绍一下流程。

系统环境

Ubuntu 16.04, qbittorrent 3.3.16

准备

首先需要安装 checkinstall,在 apt 的帮助下,这件事并不难,apt install checkinstall 即可。

安装 qbittorrent

首先按照之前的一篇文章处理一下源码和依赖,之后只需要做一个很小的改动,将 make install 这个命令换成 checkinstall,之后它会自动调用 make install 并进行跟踪,完成安装操作。

之后会让你输入该程序包的描述,照做就好:

root@server:~/Software/qbittorrent-3.3.16# checkinstall

checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran
           This software is released under the GNU GPL.


The package documentation directory ./doc-pak does not exist. 
Should I create a default set of package docs?  [y]: y

Preparing package documentation...OK

Please write a description for the package.
End your description with an empty line or EOF.
>> qbittorrent 3.3.16
>> 

*****************************************
**** Debian package creation selected ***
*****************************************

This package will be built according to these values: 

0 -  Maintainer: [ root@ns3284041 ]
1 -  Summary: [ qbittorrent 3.3.16 ]
2 -  Name:    [ qbittorrent ]
3 -  Version: [ 3.3.16 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ amd64 ]
8 -  Source location: [ qbittorrent-3.3.16 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ qbittorrent ]
12 - Conflicts: [  ]
13 - Replaces: [  ]

Enter a number to change any of them or press ENTER to continue: 

Installing with make install...

然后进行的就是标准的 make install 操作,安装完成之后,会输出一些日志,告诉你可以用 dpkg 将它卸载。

======================== Installation successful ==========================

Copying documentation directory...
./
./Changelog
./COPYING
./README.os2
./AUTHORS
./README.md
./INSTALL
./TODO
./NEWS
./doc/
./doc/qbittorrent-nox.1
./doc/qbittorrent.1

Copying files to the temporary directory...OK

Stripping ELF binaries and libraries...OK

Compressing man pages...OK

Building file list...OK

Building Debian package...OK

Installing Debian package...OK

Erasing temporary files...OK

Writing backup package...OK
OK

Deleting temp dir...OK


**********************************************************************

 Done. The new package has been installed and saved to

 /root/Software/qbittorrent-3.3.16/qbittorrent_3.3.16-1_amd64.deb

 You can remove it from your system anytime using: 

      dpkg -r qbittorrent

**********************************************************************

然后我们来看一看 dpkg 中是否已经有了 qbittorrent

root@server:~/Software/qbittorrent-3.3.16# dpkg -l|grep qbit
ii  qbittorrent                          3.3.16-1                                   amd64        qbittorrent 3.3.16

之后如果要卸载,执行 dpkg -r qbittorrent 即可,干净又方便。

参考资料

https://help.ubuntu.com/community/CheckInstall

其实 Ubuntu 还有两个更激进的工具,AutoDebAutoApt,有兴趣也可以了解一下