Ubuntu 16.10 配置无线网卡驱动的问题,同样适用14.04和16.04。针对的设备是Realtek RTL8111/8168 PCI Express Gigabit Ethernet Controller,表现为网络不稳定,经常掉线,且网速较慢,分析后认为是驱动不匹配。

Ubuntu自带的驱动为r8169,高于此类网卡,导致兼容性差,影响了网络连接效果。 解决方法如下,参考链接见文末。

1. Check driver and device info

查看系统为网卡型号和对应的驱动,利用如下指令

1
$ lspci -vv >> device.txt

打开device.txt,找到网卡设备,样例如下。其中驱动部分显示为r8169,与现有网卡不吻合

1
2
3
4
5
6
7
8
9
10
11
12
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0b)
Subsystem: Acer Incorporated [ALI] RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B-DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 27
Region 0: I/O ports at d000 [size=256]
Region 2: Memory at f7104000 (64-bit, prefetchable) [size=4K]
Region 4: Memory at f7100000 (64-bit, prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: r8169
Kernel modules: r8169

2. Download driver of r8168

Realtek官网下载rtl8168驱动, 需要根据Linux的内核版本进行选择,例如我的内核是4.9.1,则选择4.7以上的驱动。

更新[2019-07-28]:Realtek的官方链接貌似打不开了,而且在我的系统更新到18.04以及内核更新以后出现了奇怪的编译错误(如下),Google以后发现是因为内核4.15以后,setup_timer函数被更新为timer_setup,因此出现了编译错误的问题。参考建议,安装更新后的r8168.045.08-2驱动能够解决问题,该驱动的下载链接为这里

1
2
3
4
error: implicit declaration of function ‘setup_timer’; did you mean ‘sk_stop_timer’? [-Werror=implicit-function-declaration]
setup_timer(timer, rtl8168_esd_timer, (unsigned long)dev);
^~~~~~~~~~~
sk_stop_timer

3. Install driver

安装驱动,用如下指令,安装完成后要重启系统。

1
2
3
4
$ tar -xvf 0010-r8168-8.045.08.tar.bz2
$ cd r8168-8.045.08
$ sudo ./autorun.sh
$ sudo reboot

重启以后,理论上网络连接恢复正常。重新查看系统设备信息,有如下结果,驱动已经更新为r8168

1
2
3
4
5
6
7
8
9
10
11
12
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0b)
Subsystem: Acer Incorporated [ALI] RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B-DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 27
Region 0: I/O ports at d000 [size=256]
Region 2: Memory at f7104000 (64-bit, prefetchable) [size=4K]
Region 4: Memory at f7100000 (64-bit, prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: r8168
Kernel modules: r8168

Reference

[1] Ubuntu 16.04 RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller” 不能上网

Comment and share

最近在尝试配置网站的https,师兄推荐了Caddy来替换nginx,作为web server。Caddy采用golang语言编写,很容易安装,而且能自动帮助用户注册用于https的证书。

关于Caddy的安装和配置,这篇博客做了非常详细的介绍。我会按照我的配置重新复述一下,并且重点强调配置caddy.service服务时要注意的权限问题。

Caddy 安装

Caddy官网提供了自定义安装组件的方式,用户可以通过定制platform,plugins,telemetrylicense来生成caddy安装文件并下载。这里不建议采用curl -s https://getcaddy.com | bash脚本方式安装,因为会提示用户没有选择license

下载完成后,采用如下方式安装到系统的/usr/local/bin目录下,

1
2
3
4
$ mkdir caddy
$ cd caddy
$ tar -xvf ../caddy_v0.10.12_linux_amd64_custom_personal.tar.gz
$ sudo cp caddy /usr/local/bin/

Caddyfile

与nginx类似,Caddy也需要采用配置文件的方式读取server的信息,这里默认的配置文件名为Caddyfile。针对单host和多host,会有细微的区别,下面我分别列出配置文件的写法,

Single host
1
2
3
4
5
6
7
8
9
10
11
xxx.com
gzip
log /var/log/caddy/xxx.log
root /home/wwwroot/xxx/
# PHP backend
fastcgi / 127.0.0.1:2345 php {
index index.php index.html
}
rewrite {
to {path} {path}/ /index.php?{query}
}
Multiple hosts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
xxx.com {
gzip
log /var/log/caddy/xxx.log
root /home/wwwroot/xxx/
# PHP backend
fastcgi / 127.0.0.1:2345 php {
index index.php index.html
}
rewrite {
to {path} {path}/ /index.php?{query}
}}
yyy.com {
gzip
log /var/log/caddy/xxx.log
root /home/wwwroot/yyy/
# PHP backend
fastcgi / 127.0.0.1:2345 php {
index index.php index.html
}
rewrite {
to {path} {path}/ /index.php?{query}
}}

可以看出,如果要配置多个hosts,在每一个host的名称后用{}包含配置信息即可,其目的是让Caddy能区分不同的host.

配置candy.service

通常我们会将web server配置成系统的服务程序,运行在后台,Caddy也提供了相应的caddy.service的脚本,其下载和添加方法为,

1
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

打开caddy.service,其存储路径为/etc/systemd/system/,其中有几个部分需要注意和修改,例如执行该服务的用户及用户组,Caddyfile配置文件的路径,以及ssl证书的存储路径等。如果没有配置好,caddy服务会无法正常运行。

1
2
3
4
5
6
7
8
9
10
; User and group the process will run as.
User=root # 原文为 www-data
Group=root # 原文为 www-data
; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy
; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID

根据caddy.service文件的要求,我们需要新建一系列的文件夹,用于存放caddy生成的文件。

1
2
3
$ sudo mkdir /etc/caddy
$ sudo cp <path of the Caddyfile> /etc/caddy/Caddyfile
$ sudo mkdir /etc/ssl/caddy

完成以上操作以后,即可运行并查看Caddy的运行状态,运行前要记得关闭nginx服务,否则会提示80端口被占用。

1
2
3
$ sudo systemd daemon-reload # 重新加载systemd
$ sudo systemd enable caddy.service
$ sudo systemd status caddy.service # 查看caddy运行状态

测试

最后,打开浏览器,输入https://xxx.com,便可以查看是否配置成功。

References

Comment and share

首先,建议不要作死,还是去买mac吧,太折腾人了!!然后进入正题,如何在Ubuntu 17.10上利用virtualbox 5.1安装MacOS 10.9虚拟机。涉及CPUID问题、vdmk转vdi,vdi的resize,以及EFI的问题。好几点都不太懂,慢慢摸索吧。

再吐个槽,不要随意自己更新virtualbox,因为如果是UEFI安装的ubuntu,是没法将Virtualbox的modprov部署进系统image的,然后virtualbox就彻底挂了。。。解决方法是升级系统或者重装。

镜像去哪里找

安装

具体的配置参考文献里有很多,我就不赘述了。。。这里主要说明一下CPUID的问题。。。我的CPU是i3 7100,按道理说其架构不适合装黑苹果,不过可以通过修改虚拟机的cpuid来解决这个问题。。。网上的方法太坑爹了,固定了cpuid,其实这个要自己去查的,每一代intel架构不太一样。查询方法如下,

1
2
3
4
5
6
7
8
9
10
11
12
VBoxManage list hostcpuids
# It will print
Host CPUIDs:
Leaf no. EAX EBX ECX EDX
00000000 00000016 756e6547 6c65746e 49656e69
00000001 000906e9 00100800 7ffafbbf bfebfbff
00000002 76036301 00f0b5ff 00000000 00c30000
00000003 00000000 00000000 00000000 00000000
00000004 1c004121 01c0003f 0000003f 00000000
# 找到00000001这一行,
替换到xxx.vbox中

1
2
3
4
5
6
VBoxManage modifyvm "macOS" --cpuidset 00000001 000306a9 00100800 3d9ae3bf bfebfbff
VBoxManage setextradata "macOS" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "iMac11,3"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Iloveapple"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1

更新以后如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<ExtraDataItem name="VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" value="Iloveapple"/>
<ExtraDataItem name="VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" value="iMac11,3"/>
<ExtraDataItem name="VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" value="1.0"/>
<ExtraDataItem name="VBoxInternal/Devices/smc/0/Config/DeviceKey" value="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"/>
<ExtraDataItem name="VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" value="1"/>
<CPU>
<PAE enabled="true"/>
<LongMode enabled="true"/>
<HardwareVirtExLargePages enabled="false"/>
<CpuIdTree>
<CpuIdLeaf id="1" eax="591593" ebx="34605056" ecx="2147154879" edx="3219913727"/>
</CpuIdTree>
</CPU>

resize

VBoxManage clonehd “MavericksInstaller.vmdk” “MavericksInstaller.vdi” —format vdi
VBoxManage list hdds

1
2
3
4
5
6
7
8
UUID: 501b0eed-167e-4b38-96ff-93efa707b5fc
Parent UUID: base
State: created
Type: normal (base)
Location: xxx/macOS/MavericksInstaller.vdi
Storage format: vdi
Capacity: 10240 MBytes
Encryption: disabled

VBoxManage modifyhd 501b0eed-167e-4b38-96ff-93efa707b5fc —resize 40960

1
2
3
4
5
6
7
8
UUID: 501b0eed-167e-4b38-96ff-93efa707b5fc
Parent UUID: base
State: created
Type: normal (base)
Location: xxx/macOS/MavericksInstaller.vdi
Storage format: vdi
Capacity: 40960 MBytes
Encryption: disabled

解决mediakit 报告设备上的空间不足以执行

最简单粗暴的方法,重新挂载一个vdi,利用磁盘工具,抹掉,然后就行了。。。

分辨率调整

VBoxManage setextradata “macOS” VBoxInternal2/EfiGopMode 3

References

Comment and share

趁着系统在升级,记录一下ubuntu recovery mode的网络恢复功能。我的系统是Ubuntu1610,因为不是LTS,官方已经不支持更新了,因此也无法通过正常的手段升级,曲线升级的方法参考这里

Revoery 模式下网络连接

在升级过程中,可能会出现重启后无法连接网络的问题,其中最严重的就是网卡驱动没有了。解决方法如下,

  1. 重启系统;
  2. 选择Advanced options for ubuntu;
  3. 选择最近的image的recover mode;
  4. 进入后,选择network enable network;
  5. 再次重启。

DNS server

另一种情况是,DNS server出现问题,例如/etc/reconv.conf文件为空,或者出现问题。解决方法是自己添加,默认的配置如下

1
2
3
4
5
6
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 127.0.0.53

也可以自己修改成如下形式,

1
2
nameserver 114.114.114.114
nameserver 8.8.8.8

多网卡的配置

除了网络恢复问题,多网卡的配置也是我关注的问题,这样可以一定程度上保证电脑处在联网状态。以我的系统为例,分别有两块网卡,有线网卡enp0s31f6和无线网卡wlp4s0,二者将连接到不同的网络,以有线网卡作为主要网卡,则配置如下,配置文件为/etc/network/interfaces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s31f6
iface enp0s31f6 inet static
address 192.168.1.100
netmask 255.255.255.0
network 192.168.1.0
gateway 192.168.1.1
# The wireless network interface with dhcp
auto wlp4s0
iface wlp4s0 inet dhcp
address 192.168.30.100
netmask 255.255.255.0
network 192.168.30.0
gateway 192.168.30.1
wpa-ssid WIFI-NAME # SSID name
wpa-key-mgmt WPA-PSK # Encryption method
wpa-psk YOYR-PASSWORD-HERE # WIFI password

References

Comment and share

考虑到系统的稳定性,也因为懒,一直没升级Ubuntu 1610,也没有update。最近发现官方已经不支持1610了,而且直接把yakkety的镜像给取消了。所以,即使是利用系统自带的update manager,也无法直接升级到1710,会出现如下的两类错误,

无法更新
1
2
3
4
5
6
7
8
E:The repository 'http://archive.canonical.com/ubuntu yakkety Release' does not have a Release file.,
W:Updating from such a repository can't be done securely, and is therefore disabled by default.,
W:See apt-secure(8) manpage for repository creation and user configuration details.,
E:The repository 'http://archive.ubuntu.com/ubuntu yakkety Release' does not have a Release file.,
W:Updating from such a repository can't be done securely, and is therefore disabled by default.,
W:See apt-secure(8) manpage for repository creation and user configuration details.,
E:The repository 'http://archive.ubuntu.com/ubuntu yakkety-updates Release' does not have a Release file.,
...
无法升级
1
An upgrade from 'yakkety' to 'artful' is not supported with this tool.

参考Askubuntu上的问题,有如下的解决方法,

1
2
3
4
5
6
7
8
9
10
11
cd /etc/apt/
# 备份现有的sources.list
sudo cp sources.list sources.list.bkp
# 替换yakkety为artful
sudo vim sources.list
:%s/yakkety/artful/g
# 保存并重新更新和升级
sudo update
sudo upgrade
# 重启系统
reboot

Reference

[1] How to upgrade ubuntu from 1610 to 1710

Comment and share

问题描述

也许是Ubuntu16.04以后版本,或者是google-chrome的版本问题,会出现从chrome以外的链接打开chrome后只显示空白标签的情形。

解决方法

其解决方法是给google-chrome.desktop配置文件的Exec提供%U的值,步骤如下

1
2
3
vim ~/.local/share/applications/google-chrome.desktop
# Find Exec and add %U
Exec=/opt/google/chrome/chrome %U

Reference

解决Ubuntu无法从外部应用启动Chrome打开链接的问题

Comment and share

继续debian test的坑,如何用apt-get,安装和配置Nvidia CUDA,并解决无法进入桌面的问题。

软件源的配置

CUDA 属于第三方软件,debian的源中默认是没有的,需要手动添加。添加方法如下:

1
2
3
4
5
6
7
$ cd /etc/apt/sources.list.d
$ sudo touch debian-testing.list
$ sudo vim debian-testing.list
# 加入如下两个源
deb http://mirrors.ustc.edu.cn/debian/ testing main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian/ testing main contrib non-free
$ sudo apt update

此时,利用apt search cuda,便能找到cuda的安装包了,类似如下的结果

1
2
nvidia-cuda-toolkit/testing,now 8.0.61-3 amd64 [installed]
NVIDIA CUDA development toolkit

这里显示installed,是因为我已经安装好了。

安装 CUDA

添加好软件源后,利用apt install便可以安装,但这之前需要中止图形界面的程序,并禁止系统自带的显卡驱动,具体步骤如下。

禁止系统显卡驱动
1
2
3
4
5
6
7
$ cd /etc/modprobe.d
$ sudo touch nvidia-blacklists-nouveau.conf
$ sudo vim nvidia-blacklists-nouveau.conf
# Add
blacklist nouveau
# 保存并退出,重启显卡服务
$ sudo update-initramfs -u

此时,再执行lsmod | grep nouveau,若没有显示,则说明配置成功。

中止图形界面并安装CUDA

同时按Ctrl+Alt+F2进入Console界面,以用户或者root身份登录,执行如下如下指令,

1
2
$ systemctl stop lightdm.service # 若使用的是gdm3,则为gdm3.service
$ sudo apt install nvidia-cuda-toolkit

此时,便开始安装CUDA,其中包含了CUDA的一些library和与显卡对应的NVIDIA驱动,例如我安装的驱动为nvidia-384.111

安装Xserver-xorg-video-nvidia

这一点单独提出来,是因为我在这里卡了好久。。。因为每安装Xorg对应的驱动,导致开机以后无法进入桌面,这一点Ubuntu真的做得很好。。。
在师兄的指导下,找到了问题,下面先列出安装了Xserver-xorg-video-nvidia前后Xorg.0.log的区别,

  1. 未安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    [ 2891.835] (EE) Failed to load module "nv" (module does not exist, 0)
    [ 2891.835] (II) LoadModule: "modesetting"
    [ 2891.835] (II) Loading /usr/lib/xorg/modules/drivers/modesetting_drv.so
    [ 2891.835] (II) Module modesetting: vendor="X.Org Foundation"
    [ 2891.835] compiled for 1.19.5, module version = 1.19.5
    [ 2891.835] Module class: X.Org Video Driver
    [ 2891.835] ABI class: X.Org Video Driver, version 23.0
    [ 2891.835] (II) LoadModule: "fbdev"
    [ 2891.835] (II) Loading /usr/lib/xorg/modules/drivers/fbdev_drv.so
    [ 2891.835] (II) Module fbdev: vendor="X.Org Foundation"
    [ 2891.835] compiled for 1.19.0, module version = 0.4.4
    [ 2891.835] Module class: X.Org Video Driver
    [ 2891.835] ABI class: X.Org Video Driver, version 23.0
    [ 2891.835] (II) LoadModule: "vesa"
    [ 2891.835] (II) Loading /usr/lib/xorg/modules/drivers/vesa_drv.so
    [ 2891.835] (II) Module vesa: vendor="X.Org Foundation"
    [ 2891.835] compiled for 1.19.0, module version = 2.3.4
    [ 2891.835] Module class: X.Org Video Driver
    [ 2891.835] ABI class: X.Org Video Driver, version 23.0
    [ 2891.835] (II) NOUVEAU driver Date: Fri Apr 21 14:41:17 2017 -0400
    [ 2891.835] (II) NOUVEAU driver for NVIDIA chipset families :
    [ 2891.835] RIVA TNT (NV04)
    [ 2891.835] RIVA TNT2 (NV05)
    [ 2891.835] GeForce 256 (NV10)
    [ 2891.835] GeForce 2 (NV11, NV15)
    [ 2891.835] GeForce 4MX (NV17, NV18)
    [ 2891.835] GeForce 3 (NV20)
    [ 2891.835] GeForce 4Ti (NV25, NV28)
    [ 2891.835] GeForce FX (NV3x)
    [ 2891.835] GeForce 6 (NV4x)
    [ 2891.835] GeForce 7 (G7x)
    [ 2891.835] GeForce 8 (G8x)
    [ 2891.836] GeForce GTX 200 (NVA0)
    [ 2891.836] GeForce GTX 400 (NVC0)

系统此刻找不到nv有关的驱动,而我又禁止了nouveau,所以无法进入图形界面。而在安装了相应的驱动以后,日志如下

  1. 已安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [ 38.430] (II) Applying OutputClass "nvidia" to /dev/dri/card0
    [ 38.430] loading driver: nvidia
    [ 38.430] (==) Matched nvidia as autoconfigured driver 0
    [ 38.430] (==) Matched nv as autoconfigured driver 2
    [ 38.430] (==) Matched nv as autoconfigured driver 4
    [ 38.430] (II) LoadModule: "nvidia"
    [ 38.431] (II) Loading /usr/lib/xorg/modules/drivers/nvidia_drv.so
    [ 38.437] (II) Module nvidia: vendor="NVIDIA Corporation"
    [ 38.440] (II) LoadModule: "nv"
    [ 38.440] (WW) Warning, couldn't open module nv
    [ 38.440] (II) UnloadModule: "nv"
    [ 38.440] (II) Unloading nv
    [ 38.440] (EE) Failed to load module "nv" (module does not exist, 0)
    [ 38.997] (==) NVIDIA(0): No modes were requested; the default mode "nvidia-auto-select"
    [ 38.998] (II) NVIDIA(0): "DFP-0:nvidia-auto-select"
    [ 39.015] (II) NVIDIA(0): Setting mode "DFP-0:nvidia-auto-select"
    [ 39.072] (II) NVIDIA(0): [DRI2] VDPAU driver: nvidia

此刻,虽然有warning,但error已经没有了,系统也可以正常进行到登录部分。此刻查看系统显卡驱动信息,会发现出现了nvidia,如下

1
2
3
4
5
6
$ lsmod | grep nvidia
nvidia_drm 53248 1
drm_kms_helper 192512 1 nvidia_drm
drm 438272 4 nvidia_drm,drm_kms_helper
nvidia_modeset 860160 3 nvidia_drm
nvidia 13168640 84 nvidia_modeset

安装方法,直接用apt install即可,不再赘述。

最后,讲一下调整Desktop Manager的方法,留做一个tip。可供选择的DM有很多,如lightdm,gdm3,kde等,其中lightdm用得比较多,毕竟ubuntu的用户量很大。那么,如果想要在它们之间进行切换的话,用如下方法

1
$ sudo dpkg-reconfigure lightdm

在弹出的窗口中选择想要采用的桌面管理器即可。

Comment and share

美好的周日贡献给重装系统了,因为又手残了。既上周日删除了自己的home目录以后,这周直接把系统的权限折腾乱了,起因是我用了sudo chown -R,系统真的有提示我的。。。所以是我的锅。

近期使用的系统是Ubuntu-16.10,考虑到Meltdown-Spectre漏洞的补丁还不支持,想着换个系统算了,就入了debian的坑。。。嗯,这个坑更大!!!

于是,一边填坑,一边记录一下步骤,有种预感最近还是会折腾系统。

debian系统安装

debian-testing的iso下载路径,可以在USTC的镜像站找,我尝试安装debian-9,可能刻录的时候有问题,无法安装,所以改用了network install的版本。使用了UltraISO烧写到U盘里,他们的试用版功能已经足够了。烧写好以后开始安装,按流程走就行。这里要注意的地方是: 挂载/目录的分区需要格式化,否则无法安装。主要原因是与原有的ubuntu系统文件存在冲突。

多系统引导

Debian采用grub引导多系统,我是在win10基础上安装Linux系统的,并通过debian引导windows。在重装的过程中,碰到了windows分区没有被读出并列在引导列表中的情形,有一个简答的解决方法,更新一下grub配置, 即update-grub

1
$ sudo update-grub

一般更新后的列表后会出现对应windows的分区和条目。当然这个是运气,如果碰到其他问题,建议问谷歌。。。

系统配置

我选择了gnome桌面环境,系统本身还是很好看的,但也有一些bug,比如gnome-terminal就很丑。。。除此之外,debian比ubuntu预装的软件少很多,例如常用sudolocate等都需要自己安装,对新手来说比较坑。下面说一下我的配置过程,

terminal shortcuts

Ubuntu默认的terminal快捷键是Ctrl+Alt+T,debian是没有这个快捷键的,需要自己添加。具体的思路是

1
system setting -> devices -> keyboard -> "+" -> add a new shortcut

Terminal默认的shell通常为bash,如果要更换为其他的,例如zsh, 则执行如下指令即可

1
$ chsh -s /usr/bin/zsh

此处会提示用户输入密码。

sudoer 及 sudo安装

打开terminal以后,便可以安装和配置软件,此时需要sudo来临时使用root权限,debian默认不将用户添加到sudoer列表里,因此需要手动添加,步骤如下,

1
2
3
4
5
6
7
8
9
10
11
首先按Ctrl+Alt+F3,进入console,以root身份登录,在安装系统时会要求设置root的密码
进入以后,执行如下步骤
1. 添加user到root的group里
# usermod -G root user
2. 修改sudoers文件为可写
# chmod +w /etc/sudoers
3. 编辑sudoers文件,添加用户
# vim /etc/sudoers
# user ALL=(ALL:ALL) ALL
4. 修改sudoers文件为只读
# chmod -w /etc/sudoers

再按Ctrl+Alt+F1回到图形界面,此时便可以用root权限安装sudo,并进一步安装其他软件了。

系统语言及locale配置

由于要使用中文,我通常会用中文安装系统,再修改系统为英文。在Ubuntu中,直接在设置中设置语言即可;在debian中会更纯粹一些,即设置系统语言并调整locale的配置。

1
2
$ sudo vim /etc/locale.gen
# 将需要的语言反注释掉,如 en-US.UTF-8

再在system setting中调整语言支持即可,或者执行如下指令进行设置。

1
$ sudo dkpg-reconfigure locale

时区调整

改变语言为英文后,系统会采用UTC时间,此时会出现即使时区选择为Asia/Shanghai,依然与北京时间相差八个小时的情况,这也说明系统与Network Time没有同步,解决方法如下,

1
2
$ sudo apt install ntpdate
$ sudo ntpdate time.windows.com

即将系统时间与windows提供的网络时间同步,这样便会根据系统时区找到对应的时间了。

Genome 窗口调整问题

gnome默认的窗口控件没有最大化和最小化,刚转过来会不习惯,解决方法是在genome-tweak-toolwindows选项中进行设置。

gnome-terminal 无法正常运行

这个通常与调整了系统语言相关,即locale的语言设置与系统语言冲突,或未设置,导致genome-terminal无法初始化窗口,解决方法是,

1
# echo "LANG=zh-CN.UTF-8" >> /etc/locale.conf

系统切换以后block size的问题

这个情况比较特殊,实验室可能只有我碰到过。在一块SSD上安装了windows和linux双系统,并且上一次运行的系统是windows, 则开机后因为ext4分区的block错误,导致无法引导进入Linux,目前有两个指令可以解决这一问题,并且要求有livecd USB,即能独立引导的最小化系统。可用的指令分别为fscke2fsck,二者的区别,我争取专门写一篇,目前还不太理解。

首先用sudo fdisk -l查看文件格式为ext3/ext4的分区,着重关注包含有Linux系统的主分区,然后修复block的问题。

  1. fsck

    1
    # fsck -t ext4 /dev/sda1
  2. e2fsck

    1
    2
    # e2fsck -b 32768 /dev/sda1
    -b 表示 superblock,具体的解释<TODO>...

Comment and share

今天讨论网页视频流抓取问题,针对Firefox浏览器,有两种方法。

  1. 直接从Firefox的缓存中获取;
  2. 利用flash流的进程号,在系统/proc下抓取缓存的数据流。

Firefox 缓存提取

Firefox的缓存保存在如下的路径中,其中f176xa6s.default不同的用户会不同,其他路径成分基本相同。

1
~/.cache/mozilla/firefox/fl76xa6s.default/cache2/entries

进入缓存文件夹后,便可以根据时间和文件大小搜索缓存文件。因为文件名是16进制编码的,无法体现文件内容,所以不考虑。

1
$ ls -lSt

其中-S表示按文件大小排序,-t表示按时间先后排序。

通常视频文件大小为MB量级,所以一般排序在前的几个文件会是缓存的视频。

Firefox flash flow 抓取

从Firefox网页抓取flash插件播放的视频流的步骤分为三步,(1) 打开视频、(2) 获取flash播放进程ID、(3) 视频流转存。

Step1 打开视频

在浏览器播放视频,此处需要firefox支持flash,或者安装adobe flash插件。

Step2 获取flash播放进程ID

利用lsof抓取正在运行的Flash进程,如下

1
$ lsof | grep Flash

会输出如下类似的结果,其中31346即为目标ID.

1
plugin-co 31346 user 26u REG 8,5 4561004 787806 /tmp/FlashXXJa3CWn (deleted)

Step3 视频流转存

参考博客: Linux下的浏览器播放flv视频都是采用的Flash播放器,而Flash播放器在播放每个视频的时候都会在/tmp目录下创建以“Flash”字样开头做标识的缓存文件,但是如果我们进入到/tmp目录下察看所有文件,却找不到正在播放的缓存文件,因为这些视频缓存文件只有系统可见,对用户是隐藏的。因此,我们可以根据Flash进程的ID,进入系统进程文件/proc下,获取缓存的视频流。

1
2
3
$ ls /proc/31346/fd
# 找到类似如下的行,其中 26 便是视频流缓存
lrwx------ 1 user user 64 Jan 12 12:07 26 -> /tmp/FlashXXJa3CWn (deleted)

利用cat管道,将数据流输入到.flv文件中。

1
$ cat /proc/31346/fd/26 > ~/Desktop/test1.flv

视频格式转换

利用mencoder可以对视频文件进行格式转换,

1
$ mencoder -ovc lavc -lavcopts vcodec=mpeg4 -oac mp3lame source.flv -o dest.mp4

其中参数含义如下,参考了此文

  • -ovc lavc:(output video codec)指定输出视频文件的视频编码类型,此处选择的是 Libavcodec 的视频编码;

  • -lavcopts vcodec=mpeg4:(Libavcodec options)指定视频编码的设置,由于 Libavcodec 包含了多种视频编码,所以用 vcodec=mpeg4 来指定具体的使用 MPEG-4 编码;

  • -oac mp3lame:(output audio codec)指定输出媒体文件的音频编码类型,此处选择的是 mp3lame;

References

[1] Linux下提取保存浏览器中的视频
[2] linux下视频格式转换工具

Comment and share

Ubuntu server的防火墙配置问题,包括新用户添加、防火墙规则设定以及ssh的简单设置,写得比较简单,慢慢理解以后来填坑。主要的references见文末,另外说一句 Merry Xmas!

Change or update root pwd

修改或者初始化root的密码,如下

1
2
3
sudo passwd root
New password: xxxx
Retype new password: xxxx

Add a new user

Ubuntu server在安装好以后只有Root用户,为了方便管理,通常需要添加一个用户以方便管理,并且为了服务器的安全性,需要配置ssh的key only和防火墙。

1
2
3
4
5
6
7
8
9
10
11
sudo apt update # optional
sudo apt upgrade # optional
sudo apt install vim # install vim, optional
sudo adduser jason # Add a new user
sudo usermod -G root jason # Add user jason into Group root
# Add sudoer authority
sudo chmod u+w /etc/sudoers # Change sudoers from readonly to writtable
sudo vim /etc/sudoers
# Add the line below root ALL=(ALL:ALL) ALL
jason ALL=(ALL:ALL) ALL
sudo chmod u-w /etc/sudoers # Rechange mode of sudoers to readonly

SSH confiurations

ssh配置方便远程访问server,主要的配置包括端口修改、aurhorized_keys以及一些有助于安全性的配置。

1. 生成本机的Authentication key-pair
1
ssh-keygen -b 4096

选择默认的id_rsaid_rsa.pub存储密钥对,并且选择不设定密码。

2. 添加该用户的public key到server中
1
2
3
4
5
6
mkdir ~/.ssh
cd ~/.ssh
touch authorized_keys
vim authorized_keys
# Add your public key into this file like
ssh-rsa xxxxx user@xxx
3. 配置ssh端口及相应的安全选项

sshd的配置文件存放在/etc/ssh/sshd_config中,

1
2
3
4
5
6
7
vim /etc/ssh/sshd_config
# change port
Port 2333 # 默认的端口号为22,此处建议修改为其他值
# 禁止root登录
PermitRootLogin no
# 禁止密码验证
PasswordAuthentication no

4. 重启ssh服务

配置完成后,重启sshd服务,如下

1
sudo systemctl restart sshd

UFW configuration

详细的UFW配置参考这篇文章,下面列出我的配置并对解释。

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt install ufw
# allow all outgoing and deny all incoming
sudo ufw default allow outgoing
sudo ufw default deny incoming
# allow ssh
sudo ufw allow ssh
# allow tcp udp http
sudo ufw allow 80/tcp
sudo ufw allow http/tcp
sudo ufw allow 1725/udp
# enable ufw
sudo ufw enable

sudo ufw status查看ufw的运行状态和配置结果,若显示如下列表,则说明配置好了,

1
2
3
4
5
6
7
8
9
10
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
1725/udp ALLOW Anywhere
2333 ALLOW Anywhere
80/tcp (v6) ALLOW Anywhere (v6)
1725/udp (v6) ALLOW Anywhere (v6)
2333 (v6) ALLOW Anywhere (v6)

References

Comment and share

Author's picture

Jason Ma

We are in the same story.


Astronomer? Software engineer


Shanghai