Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

Ubuntu知识集锦

23
Oct
2011

Ubuntu知识集锦

By Alex
/ in Linux
/ tags FAQ, Ubuntu
0 Comments
基本知识
名词术语
  1. PPA:Personal Package Archives,可以上传source,作为apt存储库
  2. APT:Advanced Packaging Tool,Debian GNU/Linux distribution及其变体上进行软件安装/更新/删除的工具,它简化了类linux系统的软件管理,可以进行二进制的安装或者源码编译的安装。最初是设计为pdkg的前端(管理debian的deb包),后来通过 apt-rpm组件支持RPM包
  3. DPKG:dpkg是Debian包管理系统的核心,apt-get、aptitude本质上是调用dpkg
进程基本知识

进程优先级:数字越小越高,[+20,-20]
进程状态
D:不可中断的睡眠(例如I/O导致,处于该状态的进程,只有内核才能将其唤醒)
R:运行中
S:可中断的睡眠,正在等待信号
T:终结的进程
Z:僵尸进程,终止了,但是需要清理kill(通常看不到,僵尸很快被清理)

串口通信知识
何为串行接口

串行端口(serial port)可以对应计算机的一个物理接口:DB9串行接口、DB25串行接口、RJ-45串行接口;或者对应计算中的内置设备:调制解调器、PC卡、USB-串口转换器、扩展坞。

通常计算机包含一个UART(通用异步收发传输器)芯片,但可能没有物理接口(笔记本通常在扩展坞上才有DB-9口)。

常用快捷键
快捷键 说明
Ctrl + L 在文件管理器(Nautilus)中显示完整路径
Ctrl + Alt + 方向 切换工作区
Ctrl + Shift + Alt + 方向 把当前窗口移动到目标工作区
Ctrl + Alt + L 锁屏,可以改为Super + L
Alt + F2 搜索
Ctrl + Alt + F1 进入文字终端界面,类似的可以组合F2-F6
Ctrl + Alt + F7 切换到GUI终端
常用配置文件
APT配置文件
配置文件 说明
/etc/apt/sources.list

用来获取软件包的源列表,此配置文件用于支持任意数量的软件源。该文件的每一行对应一个源,最优先的源列在最前面

每一行以“类型”开头,类型包括deb、deb-src等。deb类型典型情况下引用一个两级的Debian archive:distribution/component。其中distribution通常是一个archive名称,例如stable、testing或者是trusty、jessie之类的codename;而component通常可以是main、contrib、non-free等

deb-src类型的格式与deb一样,用于指定源码位置

内容示例:

Shell
1
2
3
4
5
6
7
8
# deb、deb-src的格式:
# deb [ options ] uri suite [component1] [component2] [...]
 
# 通过HTTP访问归档,使用trusty/main、trusty/restricted区域
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted
 
# 通过本地文件系统访问归档,使用stable/main、stable/contrib、stable/non-free
deb file:/home/jason/debian stable main contrib non-free
/etc/apt/sources.list.d/ 额外的源片段
/etc/apt/apt.conf
/etc/apt/apt.conf.d
APT工具包所有命令所共享的主配置文件
/etc/apt/preferences
/etc/apt/preferences.d/

APT参数配置,用于控制什么版本的包被选择并安装

当源列表中包含某个包的多个distribution时(例如testing、stable),那么一个包的多个版本可以被安装,APT会为每个版本分配一个优先级。在保证依赖约束的前提下,apt-get会尝试安装优先级最高的版本。通过该配置文件,我们可以覆盖APT给包授予的默认优先级

当源列表中包含多个源时,某个软件包的同一版本可以具有多个实例(来源),这种情况下,apt-get会选取源列表中第一个包含目标包的源,该配置文件不会影响此行为

如果此配置文件中没有指定,某个版本的默认优先级等于其所属的distribution的优先级

你可以在apt.conf或者apt-get命令行指定某个distribution为target release,使之获得高优先级,例如:

Shell
1
apt-get install -t testing some-package

如果target release已经设置,APT使用如下算法来设置包的版本对应的优先级:

  1. 优先级1: 来自那些在Release files中标注了NotAutomatic: yes、没标注ButAutomaticUpgrades: yes的archives(例如Debian
    experimental archive)中的版本
  2. 优先级100:已经安装的版本;来自那些在Release files中标注了NotAutomatic: yes、ButAutomaticUpgrades: yes的archives(例如Debian backports archive)中的版本
  3. 优先级500:未安装的、且不属于target release的版本
  4. 优先级990:未安装的、且属于target release的版本

如果target release未设置,APT为所有已安装版本授予优先级100、所有未安装版本授予优先级500

/var/cache/apt/archives/ 获取的软件包的存储位置
/var/cache/apt/archives/partial/ 正在传输中的软件包文件片段
/var/lib/apt/lists/partial/ 传输中的,存储sources.list中每一个包资源的状态信息
常用命令
dpkg

dpkg是安装、构建、管理和移除Debian软件包的工具,更加友好易用的dpkg前端工具是aptitude。该命令的语法如下:

Shell
1
dpkg [option...] action
常用动作
动作 说明
安装(-i)

-i, --install package-file...

安装指定的软件包。如果指定选项-R,则package-file必须是一个目录。安装过程包含以下步骤:

  1. 抽取新包的控制文件
  2. 如果软件包的另外一个版本已经安装在当前系统上,则旧版本的prerm脚本被执行
  3. 运行软件包的preinst脚本
  4. 解包新的文件,同时备份旧文件
  5. 如果软件包的另外一个版本已经安装在当前系统上,则旧版本的postrm脚本被执行
  6. 配置软件包
解包(--unpack)

--unpack package-file...

解包,但不配置软件包。如果指定选项-R,则package-file必须是一个目录

配置(--configure)

--configure package...|-a|--pending

配置已经解包、尚未配置的软件包。如果参数packge缺失而-a或--pending存在,则所有解包且尚未配置的软件包都被配置

要重新配置已安装的软件包,可以使用dpkg-reconfigure命令

配置过程包括以下步骤:

  1. 解包配置文件,同时备份旧的配置文件
  2. 运行软件包提供的postinst脚本
移除(-r)和清理(-P)

-r, --remove, -P, --purge package...|-a|--pending

移除/清理指定的软件包,-r移除除了配置文件以外的所有内容,-P则移除全部内容。移除过程包括以下步骤:

  1. 运行prerm脚本
  2. 移除安装的文件
  3. 运行postrm脚本
验证(-V)

-V, --verify [package-name...]

通过比较安装路径下的文件和数据库中元信息,验证软件包的完整性,如果不指定package-name则验证所有包的完整性

列出软件包(-l)

-l, --list package-name-pattern...

作为dpkg-query的前端。查询匹配模式的软件包

--set-selections

设置软件包管理的选区,从标准输入读取数据。数据包括两列:软件包名称、安装状态

安装状态可以取值:

  1. install  在本次软件包管理事务中,安装此软件包
  2. hold   维持既有状态
  3. deinstall  删除软件包
  4. purge  删除软件包,并清理其遗留的配置文件
--get-selections

--get-selections [package-name-pattern...]

列出选区中匹配模式的软件包,如果不指定package-name-pattern则非已安装的软件不被显示。输出两列:软件包名称、安装状态

Shell
1
2
# 列出选区中名称以ip开头的软件包
sudo dpkg --get-selections  ip* 
列出安装的文件(-l)

-L, --listfiles package-name...

作为dpkg-query的前端。列出指定软件包在当前系统上安装的文件

状态(-s)

-s, --status package-name...

作为dpkg-query的前端。报告指定软件包的状态。可用的状态包括:

  1. not-installed 软件包没有安装到当前系统
  2. config-files 仅软件包的配置文件存在于当前系统
  3. half-installed 软件包的安装已经启动,但尚未完成
  4. unpacked 软件包已经解包,尚未配置
  5. half-configured 软件包的配置已经启动,但尚未完成
  6. triggers-awaited 等待触发器处理
  7. triggers-pending 已经被触发
  8. installed 软件包已经安装到当前系统
搜索文件(-S)

-S, --search filename-search-pattern...

作为dpkg-query的前端。从已安装的软件包中搜索文件

示例:

Shell
1
2
# 显示文件所属的软件包
dpkg -S /path/to/file
信息(-p)

--print-avail package-name...

作为dpkg-query的前端。显示软件包的详细信息

常用选项
  1. --admindir=dir 设置管理目录,默认/var/lib/dpkg,该目录中包含了软件包状态信息的记录文件
  2. --instdir=dir 设置默认安装目录
  3. -E, --skip-same-version 如果相同版本的软件包已经安装,则不执行安装
  4. --no-debsig 不去尝试校验包的数字签名
  5. --log=filename 记录安装日志到指定文件,默认/var/log/dpkg.log
apt-get

APT包的管理工具,是aptitude等工具的后端,dpkg的前端。命令格式:

Shell
1
2
3
4
5
6
7
8
9
10
11
apt-get
  [-asqdyfmubV] [-o=config_string] [-c=config_file] [-t=target_release] [-a=architecture]
  {
    update | upgrade | dselect-upgrade | dist-upgrade |
    install pkg [{=pkg_version_number | /target_release}]...  |
    remove pkg...  | purge pkg...  |
    source pkg [{=pkg_version_number | /target_release}]...  |
    build-dep pkg [{=pkg_version_number | /target_release}]...  |
    download pkg [{=pkg_version_number | /target_release}]...  |
    check | clean | autoclean | autoremove | {-v | --version} | {-h | --help}
  }
安装特定版本

注意指定目标软件包时,可以在包名后面附加 =version 或者 /dist ,从而安装特定版本/从特定源安装:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt-cache policy  libssl1.0.0
# libssl1.0.0:
#   Installed: 1.0.1f-1ubuntu2.18
#   Candidate: 1.0.1f-1ubuntu2.18
#   Version table:
#*** 1.0.1f-1ubuntu2.18 0
#        100 /var/lib/dpkg/status
#    1.0.1f-1ubuntu2 0
#        500 http://mirrors.aliyun.com/ubuntu/ trusty/main amd64 Packages
 
# 从上面的输出可以看到,已经安装了1.0.1f-1ubuntu2.18 0版本
# 下面的命令可以强制改为从trusty安装,即1.0.1f-1ubuntu2 0版本:
sudo apt-get openssl/trusty
# 和上面的效果一样:
sudo apt-get install libssl1.0.0=1.0.1f-1ubuntu2
关于多架构

如果你同时安装某个软件包的多种架构(MultiArch),例如libssl1.0.0:i386和libssl1.0.0:amd64,则每个架构的版本必须完全一致。

子命令说明
子命令 说明
install

下载软件包并安装/升级,目标软件包所直接/间接依赖的软件包也会被一并下载和安装。该命令首先下载并保存文件到本地仓库,因此卸载后再安装不需要重新下载

该命令可以后接多个需要安装的软件包,软件包不指定全限定的文件名(例如apt-utils而不是apt-utils_1.0.1ubuntu2.10_amd64.deb),配置文件/etc/apt/sources.list用于定位软件包。

如果某个软件包后面附上一个减号(-),那么软件包将被删除(如果已安装在本系统的话)

如果要安装特定的软件包版本,则使用 pkgname=version 的形式指定软件包,该特性可以用于软件包的降级。

通配符和正则式可以用来指定包名称

remove 卸载软件包。配置文件被保留
purge

卸载软件包。配置文件也被清除,示例:

Shell
1
sudo apt-get purge libmapnik* mapnik-* python-mapnik #可使用通配符
autoremove 卸载系统中没有用到的软件包
clean 删除所有下载到本地仓库中的软件包文件,除了
autoclean 与clean类似,但是只删除哪些不太可能再次被使用的、旧版本的软件包
source 下载源代码
build-dep

安装构建某个软件包必须的所有依赖,示例:

Shell
1
sudo apt-get build-dep gedit
download 下载指定的二进制包到当前目录下
update 从软件源同步所有软件包的索引信息
upgrade 升级/etc/apt/sources.list中列出的、当前系统已经安装的全部软件包到最新版本
check 诊断工具,更新软件包缓存、检查损坏的包依赖关系
常用选项
选项 说明
--no-install-recommends 不把“推荐的(recommended)”的包作为依赖处理,不下载或安装
--install-suggests 把“建议的(suggested)”的包作为依赖处理,下载并安装
-d, --download-only 仅下载软件包,不解压或安装
--no-download 不去下载软件包,最好和-m联用来强制APT仅使用已经下载到本地仓库的.deb包
-f, --fix-broken

尝试修复损坏(冲突)的依赖(APT不允许系统中存在损坏的包依赖关系)。该选项和install/remove子命令联用时,为了推导出可能的解决方案,APT可能忽略任何软件包

有时候该选项不能解决问题,必须手工处理,这意味着你需要使用类似 dkpg --remove  的命令强制删除某些导致依赖破坏的软件包

-m, --ignore-missing, --fix-missing 忽略缺失(或者下载后完整性检查失败)的包并继续后续的处理,如果缺失的包是通过命令行指定的(selected),则简单的忽略之
-q, --quiet 安静模式,不显示进度信息,可以指定值-q=N,N<=2
-s, --simulate, --just-print,
--dry-run, --recon, --no-act
模拟安装,以查看对系统的影响
-y, --yes, --assume-yes 对所有提问回答“是”
-u, --show-upgraded 打印所有将被升级的软件包
-a, --host-architecture 控制 apt-get source --compile 下载与指定体系结构匹配的源码。默认情况下与build-architecture即当前机器的体系结构一致
-b, --compile, --build 在下载完毕后,编译源代码包
--no-upgrade 和install子命令联用时,不对既有包进行升级
--only-upgrade 和install子命令联用时,只进行升级,而不是安装新的软件包
--force-yes 强制对提示回答“是”,可能损坏系统
--print-uris 打印下载文件的URL等信息,而不是获取文件并安装
--no-remove 如果某些软件包需要被移除,立即退出
--auto-remove 自动移除不需要的依赖,和 autoremove子命令效果相同
--allow-unauthenticated 允许未验证的包
--show-progress  显示用户友好的进度信息
--target-release, --default-release
-t=target_release
控制策略引擎的默认输入,为指定的release指定990的优先级
apt-cache

该命令用于查询APT缓存,它可以对APT包缓存进行一系列的操作。改命令不会改变系统,但可以生成一系列有价值的信息。

子命令说明
子命令 说明
gencaches 生成APT包缓存,此命令会被所有需要缓存的命令隐含调用(当缓存不存在或者过期时)
showpkg pkg...

显示列出的包的信息,信息包括:

  1. 可用的版本
  2. 反向依赖(reverse dependencies),反向依赖即依赖于pkg...的包
  3. 每个版本的正向依赖(forward dependencies),正向依赖即pkg...所依赖的包,正向依赖必须被满足(satisfied)

例如 apt-cache showpkg libssl-dev 的输出如下:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Package: libssl-dev
Versions:
1.0.1f-1ubuntu2  ...
Reverse Depends:
  libssl-dev:i386,libssl-dev 1.0.1f-1ubuntu2
  libssl-dev:i386,libssl-dev 1.0.1f-1ubuntu2
  proftpd-dev,libssl-dev
  ...
Dependencies:
# 1.0.1f-1ubuntu2版本的libssl-dev依赖于以下包,括号内是其版本
# 只有这些依赖包都被安装,libssl-dev才可以安装
1.0.1f-1ubuntu2 - libssl1.0.0 (5 1.0.1f-1ubuntu2)
                  zlib1g-dev (0 (null)) libssl-doc (0 (null))
                  libssl-dev:i386 (3 1.0.1f-1ubuntu2)
                  libssl-dev:i386 (6 1.0.1f-1ubuntu2)
Provides:
1.0.1f-1ubuntu2 -
Reverse Provides:
stat 显示缓存的统计信息 
showsrc pkg... 显示包对应的源码包的信息 
dump 显示缓存中所有包的简短列表,主要用于调试 
umet 打印缓存中所有为满足依赖(unmet dependencies)的概要信息 
show pkg...  提供类似于 dpkg --print-avail 的功能
search regex...  在所有可用包上进行全文的正则式检索,打印包名称、描述
--full,打印类似于show子命令的信息
--names-only,仅打印包名
depends pkg...  打印包的依赖列表,以及其它所有可能满足依赖的包
rdepends pkg... 显示包的反向依赖
pkgnames [prefix] 打印匹配的包名称
policy [pkg...]

用于调试和配置文件有关的问题,如果不加参数,它会打印所有源的优先级,否则打印目标包和优先级相关的详细信息

例如 apt-cache policy libssl1.0.0 的输出如下:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
libssl1.0.0:
  # 已安装的版本
  Installed: 1.0.1f-1ubuntu2.18
  # 候选版本,不指定版本时,默认安装此版本
  Candidate: 1.0.1f-1ubuntu2.18
# 版本表格,格式:
#  *** <some-version> <minimum-priority-to-consider>
#     <priority-of-this-instance> <repository1>
#     <priority-of-this-instance> <repository2>
#  *** <some-other-version> <minimum-priority-to-consider>
#     <priority-of-this-instance> <repository3>
#     <priority-of-this-instance> <repository4>#
#
  Version table:
   *** 1.0.1f-1ubuntu2.18 0   # ***表示已安装的版本
        # 不设置target release时,已安装版本的优先级为100
        100 /var/lib/dpkg/status
     1.0.1f-1ubuntu2 0
        # 不设置target release时,未安装版本的优先级为500
        500 http://mirrors.aliyun.com/ubuntu/ trusty/main amd64 Packages
其它apt命令
命令 说明
add-apt-repository

添加PPA存储库,示例:

Shell
1
2
3
4
# 添加存储库
add-apt-repository ppa:mapnik/v2.2.0
# 删除存储库,但不会删除来自此仓库的软件包
add-apt-repository ppa:mapnik/v2.2.0 --remove
ppa-purge

禁用一个PPA并回退为官方软件包(如果可能的话)。例如你添加了xorg-edgers PPA并且安装Nvidia驱动,当对此PPA执行ppa-purge命令时,不单单会禁用PPA,而且会把Nvidia驱动回复到Ubuntu官方仓库的版本
该命令需要安装: sudo apt-get install ppa-purge 。用法示例:

Shell
1
sudo ppa-purge ppa:otto-kesselgulasch/gimp
aptitude

该命令是包管理器的高层接口,命令格式如下:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# <options>...表示命令选项
# {}中包含了命令的动作(子命令)
# <packages>... 指定目标包的列表
aptitude [<options>...] {autoclean | clean | forget-new | keep-all | update}
 
aptitude [<options>...] {full-upgrade | safe-upgrade} [<packages>...]
 
aptitude [<options>...] {
                            build-dep | build-depends | changelog | download |
                            forbid-version | hold | install | markauto | purge |
                            reinstall | remove | show | unhold | unmarkauto | versions
                        } <packages>...
                        
aptitude extract-cache-subset <output-directory> <packages>...
 
aptitude [<options>...] search <patterns>...
 
aptitude [<options>...] {add-user-tag | remove-user-tag} <tag> <packages>...
 
aptitude [<options>...] {why | why-not} [<patterns>...] <package>
 
aptitude [-S <fname>] [--autoclean-on-startup | --clean-on-startup | -i | -u]
 
aptitude help
子命令

命令行中第一个不带短横线(-)的参数被作为需要执行的动作看待。

子命令 说明 
install

安装一个或者多个软件包。后面跟着需要安装的软件包的列表,如果某个包名后接~、?字符,则被视为搜索模式,匹配的包都会被安装

如果要选择特定的包版本,使用格式 pkgname=version ;如果要从特定的归档中选择包,使用格式 pkgname/archive ,例如 aptitude install apt/experimental 

命令行中指定的包,并不一定必须安装,可以在包名后添加一个指示器,说明需要对包执行的动作:

  1. pkgname+ 安装
  2. pkgname+M 安装,并标记其为自动(作为依赖而)安装,如果没有其它包依赖它,该包会被立即自动移除
  3. pkgname- 移除
  4. pkgname_ 移除并清理相关配置文件
  5. pkgname= 设置包为保持状态,取消所有安装、升级、移除动作,并防止该包在未来被自动升级
  6. pkgname: 类似上面,但是不阻止未来的包升级
  7. pkgname&M 标记为已经自动安装
  8. pkgname&m 标记为已经手动安装

如果install子命令后面不跟随任何包名,那么所有预定、未决的安装操作会被执行。比如你发起 aptitude install foo 命令后立即终止命令执行,那么后面必须手工 aptitude remove foo 才能取消安装

如果出现依赖冲突,aptitude会提示可选的解决方案,你可以快速的删除冲突依赖包,而不是一个个手工删除

remove

这些命令和intall类似,但是仅对命令指定的包执行相应的动作

hold和keep的区别:前者时包在未来的safe-upgrade/full-upgrade命令中被忽略,keep仅仅取消任何准备对包进行动作

unhold执行和hold相反的操作

举例:

Shell
1
2
#移除所有名字中包含ndeity的包
aptitude remove '~ndeity'
purge
hold
unhold
keep
reinstall
markauto 标记包为自动/手工安装
unmarkauto
build-depends 满足一个包的构建时依赖(build-dependencies)
build-dep
forbid-version 禁止某个包升级到特定的版本
update 升级软件包列表信息,等价于 apt-get update 
safe-upgrade

升级已安装软件包到它们的最新版本。已安装的包不会被移除,除非它们已经不被使用

如果不指定包名,则尝试升级所有软件包

有时候为了升级某个软件包,需要移除另外一个包,这种情况下必须使用full-upgrade

full-upgrade 类似上面,更加激进的进行升级
keep-all 取消针对所有包的、已计划的(scheduled)动作
search

搜索匹配模式的软件包,匹配命令行中任意模式的软件包被打印

Shell
1
2
#搜索名称中包含edit的任何“新”包
aptitude search '~N' edit
show

显示软件包的详细信息

Shell
1
aptitude show ibus-pinyin
versions 显示指定软件包的版本信息
why 解释特定软件包需要被安装、移除的原因
why-not
clean 删除所有先前下载到本地仓库的.deb文件
autoclean 与clean类似,但是只删除哪些不太可能再次被使用的、旧版本的软件包
changelog 下载并显示指定源码/二进制包的Debian changelog
download 下载软件包到当前目录
常用选项
  1. --allow-untrusted 允许不加提示的安装来自不受信源的软件
  2. -D, --show-deps 对于那些会安装/移除软件包的子命令,该选项显示自动安装/移除的简要说明
  3. -d, --download-only 仅仅下载软件包,而不安装/移除。软件包默认存放在 /var/cache/apt/archives 
  4. -s, --simulate 模拟安装过程
  5. --schedule-only 对于修改包状态的那些命令,该选项会计划操作在未来进行,本次命令不会立即执行
  6. -V, --show-versions 显示被安装软件包的版本
  7. -v, --verbose 导致show等子命令显示更多信息
  8. -y, --assume-yes 对所有提示回答“是
checkinstall

跟踪软件的安装过程,并依此创建一个Deb包:

Shell
1
2
# 监控 make install,生成Deb包
sudo checkinstall -D --fstrans=no make install
ufw

所谓UFW(Uncomplicated Firewall,非复杂的防火墙),是iptables的前端,使用它可以降低iptables的使用复杂度。

安装

要安装、启/禁UFW,参考下面的命令:

Shell
1
2
3
4
5
6
7
8
sudo apt-get install ufw
# 查看ufw的状态,inactive表示被禁用
sudo ufw status
# (在系统启动时)启用或者禁用
sudo ufw enable
sudo ufw disable
# 重新加载配置文件
sudo ufw reload

查看UFW中的规则:

Shell
1
2
3
4
5
6
7
8
sudo ufw status verbose
# 下面的是默认规则的:禁止入站连接,允许出站连接,禁用路由功能
# Status: active
# Logging: on (low)
# Default: deny (incoming), allow (outgoing), disabled (routed)
 
# 在规则签名显示序号
sudo ufw status numbered

设置日志级别:

Shell
1
2
3
4
5
6
# 启用日志,日志记录在 /var/log/ufw.log
ufw logging on
# 禁用日志
ufw logging off
# 设置日志级别,默认low,可用值: off low medium high full
ufw logging low
配置文件

你可以修改/etc/default/ufw文件,来定制ufw的默认行为

规则设置命令

ufw的大部分命令格式都支持 --dry-run 选项,表示仅仅显示命令执行的效果,但是不改变现有系统。

设置默认策略:

Shell
1
2
# 默认 允许|禁止|回绝(提出提示) 入站|出站|路由 数据包
ufw  default allow|deny|reject [incoming|outgoing|routed]

插入/删除一条规则:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# delete 执行删除操作  insert 插入规则到NUM行
# allow|deny|reject|limit 允许|禁止|回绝|限制
# in|out 针对入站|出站流量
# log|log-all 按规则设置日志记录方式,log记录新的连接,log-all记录所有包
# PORT 端口号或者名称
# PROTOCOL 限定针对的协议:tcp、udp等
ufw [delete] [insert NUM] allow|deny|reject|limit [in|out] [log|log-all] PORT[/PROTOCOL]
 
# rule 针对入站/出站数据包,route 针对路由数据包
# on INTERFACE 限定入站/出站的网络接口
# proto PROTOCOL 限定协议类型
# from ADDRESS 限定IP包来源地址
# to ADDRESS 限定IP包目的地址
ufw [rule|route] [delete] [insert NUM] allow|deny|reject|limit
    [in|out [on INTERFACE]] [log|log-all] [proto PROTOCOL] [from ADDRESS [port PORT]] [to ADDRESS [port PORT]]
 
# 删除第NUM个规则
ufw delete NUM 

重置规则到安装时的状态:

Shell
1
ufw reset

规则设置举例:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 允许访问本机80端口
sudo ufw allow 80
# 禁止访问本机80端口(如果没有改变默认规则)
sudo ufw delete allow 80
# 允许来自特定IP的任何数据包(针对任何本机端口)
sudo ufw allow from 192.168.1.1
# 禁止外部访问本机smtp服务
sudo ufw deny smtp
 
# 禁止10.0.0.1/8子网访问192.168.0.1的SSH服务
sudo ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 22
 
# 允许任何局域网主机的访问
sudo ufw allow from 10.0.0.0/8
sudo ufw allow from 172.16.0.0/12
sudo ufw allow from 192.168.0.0/16
常见问题
16.04相关
无法自动连接到隐藏Wifi

这是个已知的问题,临时解决方案:

Shell
1
nmcli c up id 'dangdang-ydgw'
MATE相关
如何重置面板
Shell
1
mate-panel --reset
安装NVIDIA官方驱动

按Ctrl + Alt + F1,进入文本界面,执行

Shell
1
2
3
4
5
6
7
8
9
# 停止此服务
sudo service lightdm stop
# 安装驱动
sudo ./NVIDIA-Linux-x86_64-361.28.run
 
# 删除驱动
sudo /usr/bin/nvidia-uninstall
# 或者
sudo apt-get install autoremove --purge nvidia*
修改grub和Splash分辨率

执行 sudo gedit /etc/default/grub 编辑配置文件:

1
2
3
4
5
6
7
# 让等待时间缩短一些
GRUB_TIMEOUT=3
 
# 设置为显示器标准分辨率
GRUB_GFXMODE=1920x1080
# 添加下面一行
GRUB_GFXPAYLOAD_LINUX=keep

保存后,执行 sudo update-grub 更新grub。

执行 sudo gedit /etc/initramfs-tools/conf.d/splash 编辑配置文件:

1
echo FRAMEBUFFER=y > /dev/null

保存后,执行 sudo update-initramfs -u 。重启后生效。

记住显示器亮度
Shell
1
2
3
sudo apt-get install xbacklight
#设置亮度,可以指定0-100
xbacklight -set 80  
一致性网络设备命名

所谓一致性网络设备命名(consistent network device naming),是Linux下以太网设备命名的约定规则,用来替换老旧的eth*命名风格。后者存在的问题是,由于内核发现网卡的顺序可能发生变化,这导致以太网设备的名称序号也随着改变。

某些操作系统版本默认启用了一致性网络设备命名,要改变此行为,可以:

  1. 修改文件vim /etc/default/grub,设置内核参数: GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0" 
  2. 执行 update-grub 并重启

重启后,以太网卡的命名风格变成传统的eth0*

网络管理器提示:device not managed
Shell
1
2
3
4
5
6
sudo gedit /etc/NetworkManager/NetworkManager.conf
#修改如下一行
#[ifupdown]
#managed=true   默认值为false
 
sudo service network-manager restart
如何查看正在使用的DNS
Shell
1
2
3
nmcli dev list iface wlan1 | grep IP4
# 或者
nm-tool | grep DNS 
启动显示waiting an additional 60 seconds for network configuration

除了启动时耗时外,还会出现通知区域的网络图标消失的问题。原因可能是因为 /etc/network/interfaces 配置了多于1个的 gateway 导致

安装中文输入法
  1. 打开System Settings - Text Entry,添加中文输入法ibus-pinyin
  2. 打开终端,输入ibus-setup,Show property panel 设置为 Do not show
  3. nautilus /usr/share/ibus-pinyin/icons/ 该目录为ibus-pinyin的图标文件,可以进行美化
  4. 如果输入混乱,可以执行:ibus-daemon -drx并重启
如何安装一系列字体
Shell
1
2
3
4
5
6
7
8
# 修改新字体所在目录的文件模式
sudo chmod -R 777  /usr/share/fonts/windows
cd /usr/share/fonts/windows
# 创建元数据目录
sudo mkfontscale
sudo mkfontdir
# 刷新字体缓存
sudo fc-cache -fv 
修正安装中文支持后字体变为楷体的问题

移除系统添加的字体即可解决。

Shell
1
sudo apt-get remove fonts-arphic-ukai fonts-arphic-uming
在VMware下,如何切换Console和GUI

进入字符界面 Ctrl + Alt + Space,Space松开,按F1
进入图形界面 Ctrl + Alt + Space,Space松开,按F7

安装VMwareTools

首先在VMware菜单中选择安装VMware Tools,然后复制挂载光驱中的压缩包,执行perl文件。

Shell
1
2
3
4
5
6
7
cp /media/***/VMwareTools-9.6.1-1378637.tar.gz  ~/
cd ~
tar xzvf VMwareTools-9.6.1-1378637.tar.gz
rm VMwareTools-9.6.1-1378637.tar.gz
cd vmware-tools-distrib/
./vmware-install.pl
#遇到提示一律回车,完成后重启
自定义显示模式
通过命令行添加
Shell
1
2
3
4
5
6
7
8
9
10
11
# 以1600x900为例
# 查询当前显示信息,得知活动显示器为Virtual1
xrandr -q
# 拷贝下面命令的输出
cvt 1600 900 60
# 参考上述命令的输出,新增显示模式
xrandr --newmode "1600x900"  1837.25  1600 1760 1936 2272  900 903 908 1348 -hsync +vsync
# 为显示器Virtual1添加新模式
xrandr --addmode Virtual1 1600x900
# 立即以新模式输出
xrandr --output Virtual1 --mode 1600x900
持久化显示模式设置(方法一)
~/.xprofile
1
2
3
xrandr --newmode "1600x900" 1837.25 1600 1760 1936 2272 900 903 908 1348 -hsync +vsync
xrandr --addmode Virtual1 1600x900
xrandr --output Virtual1 --mode 1600x900
持久化显示模式设置(方法二) 

新建或修改文件:

/etc/lightdm/lightdm-setup
1
2
3
xrandr --newmode "1600x900" 1837.25 1600 1760 1936 2272 900 903 908 1348 -hsync +vsync
xrandr --addmode Virtual1 1600x900
xrandr --output Virtual1 --mode 1600x900

执行命令: chmod +x /etc/lightdm/lightdm-setup 

新建或修改lightdm(Ubuntu下的显示管理器)的配置文件:

/etc/lightdm/lightdm.conf
1
2
# 添加下面的内容
display-setup-script=/etc/lightdm/lightdm-setup

该方法在Ubuntu MATE 16.04下测试通过。

解决包依赖问题

有时在安装软件包时会遇到unmet dependencies提示,要解决此类问题,可以参考:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
#移除并清理指定软件包的配置文件,打开所有强制选项
#可以用该命令删除系统中既有的不匹配的依赖包版本
sudo dpkg --purge --force-all pkgname
 
#尝试自动纠正系统中损坏的依赖关系(broken dependencies),该命令可以不指定pkgname
sudo apt-get -f install
 
#查看某个软件包的可用版本
sudo apt-cache showpkg pkgname
 
#安装指定版本的软件包
#该命令可以强制覆盖已安装版本
sudo aptitude install pkgname=pkgversion

 通过以上四个命令,然后在系统提示unmet dependencies时步步跟踪,即可解决依赖关系问题,具体例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apt-get install pkg-a
...
The following packages have unmet dependencies:
libqt4-dev: Depends: pkg-b but it is not going to be installed #继续往下跟踪
            Depends: pkg-c but it is not going to be installed
...
apt-get install pkg-b
...
The following packages have unmet dependencies:
pkg-b : Depends: pkg-d(= 2.1.0) but 3.5.0 is to be installed  #这里就是问题所在,系统将要自动安装一个比较新的版本
Depends: pkg-c but it is not going to be installed
Depends: pkg-e but it is not going to be installed
#强制安装一个低级的版本
aptitude install pkg-d=2.1.0
sudo免密码

执行 sudo visudo 修改文件:

/etc/sudoers
Shell
1
2
3
4
# alex免密码
alex ALL=(ALL) NOPASSWD: ALL
# admin组的成员免密码
%admin ALL=(ALL) NOPASSWD: ALL
ssh免密码

客户端的公钥需要放到服务器的 ~/.ssh/authorized_keys中,需要注意文件模式:

Shell
1
2
3
# 服务器端
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys

仍然无法免密码登陆,修改/etc/ssh/sshd_config并重启SSH服务:

Conf
1
2
# 此项的默认值为yes
StrictModes no
挂载NTFS相关选项

打开Disks,可以添加挂载选项:

hide_hid_files,隐藏NTFS的隐藏文件
windows_names,仅允许Windows下合法的文件名
show_sys_files,显示系统文件
hide_dot_files,隐藏点号开头的文件

无法进入Grub

现象:开机后,BIOS通过后就自动重启。

原因:在我的机器上,此问题是因为错误的使用分区工具,导致引导扇区出错导致。

修复Grub

解决上述问题的方法是:

  1. 使用Ubuntu启动U盘进入系统
  2. 执行:
    Shell
    1
    2
    3
    4
    sudo apt-add-repository ppa:yannubuntu/boot-repair
    sudo apt-get update
    sudo apt-get install -y boot-repair
    boot-repair

执行boot-repair会弹出一个图形界面,根据提示进行操作。

修复Windows

在多硬盘(每硬盘对应一个OS,相互独立)的机器上,执行上述操作后,可能出现Windows系统无法启动的情况。这是因为boot-repair把修改了所有硬盘的启动扇区导致。可以使用下面的命令证实这一点:

Shell
1
2
3
4
5
6
7
8
9
sudo dd bs=512 count=1 if=/dev/sda  2>/dev/null | strings
# ZRr=
# `|f    
# \|f1
# GRUB           # GRUB
# Geom
# Hard Disk
# Read
#  Error 

解决办法,使用工具恢复Windows所在磁盘的主引导记录:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt-get install syslinux
 
# /dev/sda替换为Windows所在的磁盘
sudo dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda
 
sudo dd bs=512 count=1 if=/dev/sda  2>/dev/null | strings
# RPf1
# Missing operating system.
# f`f1
# |fRfP
# Ht[y9Y[
# Multiple active partitions.
# Operating system load error.
进入恢复模式

开机后按住Shift键,进入GRUB启动菜单,依次选择:
Advanced options for Ubuntu
Ubuntu, With Linux 3.13.0-32-generic (recovery mode)
等待一会后,选择倒数第二项:

ubuntu-recover-mode-1
在shell中输入:

1
2
#挂载读写文件系统
mount -o remount,rw /

即可以root权限进行维护。

以root身份通过GUI浏览文件
Shell
1
sudo nautilus&
禁止Chrome自动升级
1
2
cd /etc/apt/sources.list.d
sudo mv google-chrome.list google-chrome.list.save
设置时区
Shell
1
2
#运行以下命令,根据提示进行设置
dpkg-reconfigure tzdata
彻底清空命令历史
Shell
1
cat /dev/null > ~/.bash_history && history -c && exit
新窗口屏幕居中
1
2
#安装软件:
sudo apt-get install compizconfig-settings-manager

完毕后,打开 CompizConfig Settings Manager ,定位到Window Management - Place Window,设置Placement Mode为Centered

安装.deb包
Shell
1
sudo dpkg -i path/name.deb
修改主机名称

临时修改主机名称:

Shell
1
sudo hostname new-name

永久修改主机名称:编辑文件/etc/hostname
编辑:/etc/hosts 修改 127.0.1.1对应的域名

支持Zeroconf

执行下面的命令安装Avahi即可,Avahi是Zeroconf规范的开源实现:

XML
1
2
sudo apt-get install avahi-daemon avahi-dnsconfd avahi-discover avahi-utils libnss-mdns
sudo reboot
刷空DNS缓存
Shell
1
2
3
4
#安装DNS缓存守护服务 Name Service Cache Daemon
apt-get install nscd
#重新启动
service nscd restart
su: Authentication failure
Shell
1
2
#需要重设密码:
sudo passwd root
清空ROOT的回收站
Shell
1
2
sudo apt-get install trash-cli
sudo trash-empty
PPTP客户端配置

需要根据PPTP服务器的设定进行配置,如果连接失败,可以查看/var/log/syslog,下图是一个配置示例:

pptp

L2TP客户端支持
Shell
1
2
3
4
#安装集成到Ubunt网络管理器的L2TP支持
sudo apt-add-repository ppa:seriy-pr/network-manager-l2tp
sudo apt-get update
sudo apt-get install network-manager-l2tp-gnome

L2TP客户端的设置,参考PPTP,注意IPsec Settings的Pre-shared Key要填写预共享密钥。

VPN频繁断开

现象:日志显示short read (-1): Message too long

原因:ppp接口的MTU1400,eth为1500,而traceroute发现网络最大MTU为1382

解决: sudo ifconfig eth0 mtu 1380

修改应用程序图标

大部分应用程序的桌面图标定义在 /usr/share/applications/*.desktop 文件中。当前用户个人的应用程序定义

在 ~/.local/share/applications/*.desktop 文件中,编辑这些文件,修改Icon字段,即可改变图标

隐藏工作区切换图标

安装dconf-editor,在com.canonical.unity.launcher.favorites字段中,删除unity://expo-icon

无线网卡作为Hotspot
  1. 网络管理器 ⇨ Edit Connections,弹出的窗口中点击Add
  2. 添加一个Wi-Fi类型的连接,填写好字段。注意IPv4 Settings中,Method选择Shared to other computers保存
  3. 打开文件 /etc/NetworkManager/system-connections/新创建的连接名称 ,修改 mode=ap 
  4. 网络管理器 ⇨ Connect to hidden Wi-Fi network,选择新创建的连接,点击Connect
  5. 其他机器现在可以连接到热点 了
使用Infinality进行字体渲染
Shell
1
2
3
4
5
6
sudo add-apt-repository ppa:no1wantdthisname/ppa
sudo apt-get update
sudo apt-get install fontconfig-infinality
 
# 可以选择4(osx)
sudo bash /etc/fonts/infinality/infctl.sh setstyle
双系统共享蓝牙

同一台机器安装Ubuntu 20.04、Windows 10双系统,分别与蓝牙设备配对后,只有最后配对的系统才能访问鼠标,切换系统后需要重新配对。解决此问题的步骤如下:

  1. Windows执行配对
  2. Ubuntu执行配对,然后打开配置文件 /var/lib/bluetooth/蓝牙适配器MAC/目标蓝牙设备MAC,获取密钥:
    /var/lib/bluetooth/98:AF:65:57:DD:D3/94:DB:56:AB:E7:CC
    INI
    1
    2
    3
    4
    5
    6
    ; ...
    [LinkKey]
    ; 记住这个密钥
    Key=9E438CF7CED4F8D80E6FB46B29468575
    Type=4
    PINLength=0
  3. 切换到Windows系统,以系统管理员身份打开cmd.exe,执行 psexec -s -i regedit 打开注册表
  4. 定位到注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\,修改对应设备的安全码为linkkeys中的安全码,例如:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\605718ee1f4b
    MS DOS
    1
    2
    rem 修改 f065dd9b9784的二进制值
    rem 可以退格键删除所有内容,然后依次输入16进制数9E 43 8C F7 CE D4 F8 D8 0E 6F B4 6B 29 46 85 75
  5. 在Windows下尝试连接蓝牙
恢复acpi-cpufreq

要禁用Ubuntu 16.04的intel_pstate,恢复acpi-cpufreq,可以:

Shell
1
sudo apt-get install acpi-support acpid acpi

然后编辑/etc/default/grub:

1
GRUB_CMDLINE_LINUX_DEFAULT="... intel_pstate=disable"

执行 sudo update-grub并重启即可。 

使用蓝牙4.0

最近买了阿米洛的蓝牙机械键盘,结果Ubuntu不能识别。到网上搜索一下,发现需要升级Bluez到5.x版本,并且必须使用Blueman代替Gnome的蓝牙管理器。

执行如下命令安装:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
#安装Bluez 5和Blueman
sudo add-apt-repository ppa:vidplace7/bluez5
sudo apt-add-repository ppa:blueman/ppa
sudo apt-get update
sudo apt-get install blueman
sudo apt-get install bluez
 
# 上面命令执行后会挂起,强制终止
sudo killall apt-get
sudo rm /var/lib/dpkg/lock
# 重新配置一下
sudo dpkg --configure -a

完毕后,重启,即可使用Blueman连接蓝牙键盘了。存在两个问题需要解决:

  1. 每次开机后,蓝牙适配器总是关闭的。Blueman没有提供相关的设置项,需要修改Bluez的配置文件:
    /etc/bluetooth/main.conf
    INI
    1
    AutoEnable=true
  2. 无法正常关机,卡死在Splash屏上。出现这个现象的原因,在我机器上是bluetoothd无法正常终结,可以写一个关机脚本强制终结:
    Shell
    1
    sudo /usr/bin/pkill -9 bluetoothd
ibus-pinyin和Eclipse快捷键冲突

目前(1.5.0)版本的ibus-pinyin没有提供设置项,可以修改源码:

PYPinyinEngine.cc
C++
1
2
3
4
5
6
/* Toggle simp/trad Chinese Mode when hotkey Ctrl + Shift + F pressed */
if (keyval == IBUS_F && scmshm_test (modifiers, (IBUS_SHIFT_MASK | IBUS_CONTROL_MASK))) {
    //m_props.toggleModeSimp ();
    m_prev_pressed_key = IBUS_F;
    return FALSE; //去除此快捷键的处理代码
}

修改后,重新构建ibus-pinyin并安装:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git clone git://github.com/ibus/ibus-pinyin.git ibus-pinyin
cd ibus-pinyin
#You need to install gnome-common from the GNOME CVS
sudo apt-get -y install gnome-common
#***Error***: You must have glib-gettext >= 2.2.0 installed
sudo apt-get -y install libglib2.0-dev
#No package 'ibus-1.0' found
sudo aptitude install libibus-1.0-dev #强制安装
#No package 'pyzy-1.0' found
sudo apt-get -y install libpyzy-dev
#No package 'sqlite3' found
sudo apt-get -y install libsqlite3-dev
 
./autogen.sh --prefix=/usr
#我机器上构建english.db出错,因此这里拷贝现有的文件绕过这一target
cp /usr/share/ibus-pinyin/db/english.db data/db/english/
make
make install
ibus-pinyin输文本丢失

ibus-pinyin还有一个严重问题,在Chrome/Firefox中,经常自动删除已经输入的文本。可以改用ibus-libpinyin。下面是安装步骤:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
git clone https://github.com/libpinyin/libpinyin.git
cd libpinyin
sudo apt-add-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8++-dev
./autogen.sh --prefix=/usr
make && sudo make install
 
cd ..
git clone https://github.com/libpinyin/ibus-libpinyin.git
cd ibus-libpinyin
./autogen.sh --prefix=/usr
make && sudo make install

ibus-libpinyin同样存在Ctrl+Shift+F冲突问题,可以修改源码:

/ibus-libpinyin/src/PYPPinyinEngine.cc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//从140行左右开始,删除下面的内容:
/* Toggle full/half Letter Mode */
    if (PinyinConfig::instance (). letterSwitch () == accel) {
        m_props.toggleModeFull ();
        m_prev_pressed_key = keyval;
        return TRUE;
    }
 
    /* Toggle full/half Punct Mode */
    if (PinyinConfig::instance (). punctSwitch () == accel) {
        m_props.toggleModeFullPunct ();
        m_prev_pressed_key = keyval;
        return TRUE;
    }
 
    /* Toggle simp/trad Chinese Mode */
    if (PinyinConfig::instance ().tradSwitch () == accel) {
        m_props.toggleModeSimp ();
        m_prev_pressed_key = keyval;
        return TRUE;
    }
挂载内存磁盘
Shell
1
2
3
4
# 创建挂载目录
mkdir /mnt/ramdisk
# 通过命令挂载
mount -t tmpfs -o size=4096M tmpfs /mnt/ramdisk

也可以修改fstab,在启动时自动挂载:

/etc/fstab
1
tmpfs       /mnt/ramdisk tmpfs   nodev,nosuid,noexec,nodiratime,size=4096M   0 0
改变交换文件大小
Shell
1
2
3
4
5
6
7
# 关闭交换文件功能
sudo swapoff -a
# 修改交换文件大小
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
# 重新启用交换文件功能
sudo mkswap /swapfile
sudo swapon /swapfile
使用单独交换分区

如果你正在使用交换文件,可以创建一个交换分区,然后:

Shell
1
2
3
4
5
6
7
# 获取交换分区的设备名
cat /etc/fstab | grep swap
# swap was on /dev/sdc5 during installation
 
sudo swapoff -a
sudo mkswap /dev/sdc5
sudo swapon /dev/sdc5
交换分区不生效

在fstab中配置好交换分区后,应该就能生效,如果不生效,可能是UUID填写错误:

/etc/fstab
1
UUID=e000bd2d-8ddd-4124-8e45-50ec2e086cca none            swap    sw              0       0

可以使用 sudo blkid 查到交换分区真实的UUID,修改fstab文件,然后重启即可。 

配置反转SSH隧道

利用反转SSH隧道(Reverse SSH Tunnel)技术,可以让你从互联网来访问隐藏在防火墙后面的(内网)机器。

下面用一个实际的例子来说明如何配置反转SSH隧道。在这个例子中,外网机器vpn.gmem.cc,登陆用户为root,位于内网机器不具有公共地址,登陆用户为pi。两台机器均使用公钥验证。

外网机器配置
/etc/ssh/sshd_config
INI
1
2
AllowTcpForwarding yes
TCPKeepAlive yes
内网机器配置
/usr/bin/sshred
Shell
1
2
3
4
5
#!/bin/sh
while true; do
    sudo -u pi ssh -nNT -R localhost:62222:localhost:22 -i /home/pi/Documents/puTTY/gmem.key root@vpn.gmem.cc
    sleep 300
done

可以修改/ect/rc.local,开机执行上述脚本。

反向连接到内网

在外网机器执行: ssh -p 62222 -i ~/documents/puTTY/gmem.key pi@localhost 

更新字体缓存
Shell
1
fc-cache -f -v
保存iptables设置
Shell
1
2
3
4
5
6
sudo apt-get install iptables-persistent
 
# 保存当前设置
sudo /etc/init.d/iptables-persistent save
# 加载已保存的设置
sudo /etc/init.d/iptables-persistent reload

或者:

Shell
1
2
3
4
# 保存设置到任意文件
sudo iptables-save > /etc/network/iptables.rules
# 从先前保存的文件中加载
pre-up iptables-restore < /etc/network/iptables.rules

你可以在网络启动的时候自动加载iptables设置:

Shell
1
2
3
iface eth0 inet static
        ....
        pre-up /etc/init.d/iptables-persistent reload
SSH无法通过root登陆

报错:Permission denied, please try again.

查看/var/log/auth.log,提示:Failed password for root from 192.168.0.89 port 39275 ssh2

解决办法:修改配置文件

/etc/ssh/sshd_config
1
2
3
4
# 把下面这一行
PermitRootLogin without-password
# 改为:
PermitRootLogin yes

然后重启SSH服务:  sudo service ssh restart 

从登陆列表隐藏用户

最简单的办法,是把用户的UID设置为小于500的数字:

Shell
1
2
sudo usermod -u 125 kurento
sudo groupmod -g 133 kurento
配置网桥

网桥能够把两个以太网卡(例如eth0、eth1)桥接在一起,当两个以太网被桥接到一起后,两个网络合并为单个更大的网络。

要在Ubuntu下配置网桥,可以执行以下步骤:

安装bridge-utils
Shell
1
2
sudo apt-get update
sudo apt-get install bridge-utils

安装此软件后,你就可以在/etc/network/interfaces中,像配置普通网卡一样,配置网桥了。

自动创建网桥

你可以通过配置文件,在系统启动后自动创建网桥:

/etc/network/interfaces
1
2
3
4
5
6
7
8
auto br0
iface br0 inet dhcp
  # 该网桥链接的以太网
  bridge_ports eth0 eth1
  bridge_stp off
  bridge_fd 0
  # 系统等待以太网port启动的最大时间,0表示不等待
  bridge_maxwait 0

你也可以为网桥指定静态IP:

/etc/network/interfaces
1
2
3
4
5
6
7
8
9
10
auto br0
iface br0 inet static
  address 192.168.0.122
  netmask 255.255.255.0
  gateway 192.168.0.1
  dns-nameservers 192.168.0.2
  bridge_ports eth0 eth1
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0

使用DHCP时,分配给网桥会被分配一个IP地址,该地址和被桥接的两个网卡之一所在网段相同。

Grub2设置默认启动项

执行下面的命令,找到你需要的启动项:

Shell
1
2
3
4
5
grep menuentry /boot/grub/grub.cfg
 
# 输出内容
# ...
# menuentry 'Windows 7 (loader) (on /dev/sda1)' --class windows  ...

修改配置文件:

/etc/default/grub
1
GRUB_DEFAULT="Windows 7 (loader) (on /dev/sda1)"

运行下面的命令,重启后即生效:

Shell
1
sudo update-grub 
Grub错误:unknown filesystem

我在克隆分区镜像到另外一台机器上时,出现此问题。原因是两台机器的分区结构不一样。grub中的记录已经无效。

解决办法:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 列出可用分区
ls
# 输出:(hd0) (hd0,msdos3)   (hd0,msdos5)    (hd0,msdos8)
 
# 查看当前启动路径设置
set
 
# 逐个检查可用分区,根据目录结构判断是否Ubuntu系统盘
ls (hd0, msdos8)
 
# 设置正确的启动路径
set root=hd0,msdos8
set prefix=(hd0,msdos8)/boot/grub
 
# 启动
insmod normal
normal
 
# 进入系统后,执行
sudo update-grub
# 把Grub安装到sda
sudo grub-install /dev/sda
禁用mnemonics

Ubuntu下的Alt + <KEY>激活顶部菜单的功能有时候很烦人,可以按照如下方法禁用掉:

  1. 对于基于GTK 2的应用,例如GIMP,可以在~/.gtkrc-2.0中添加:
    .gtkrc-2.0
    1
    gtk-enable-mnemonics = 0
  2. 对于基于GTK3的应用,可以修改/etc/gtk-3.0/settings.ini
终端窗口行宽度太短
Shell
1
export TERM=xterm-256color 
自动激活新窗口

有时候,程序自动打开的窗口可能不会自动激活(置于最前面)。要让新打开的窗口自动激活,可以执行:

Shell
1
dconf write /org/compiz/profiles/unity/plugins/core/focus-prevention-level 0 
安装Java8

14.10以下的版本,自带源不包括JDK1.8,可以自行添加源并安装:

Shell
1
2
3
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk 
如何查看保存的WiFi密码

所有密码存放在/etc/NetworkManager/system-connections目录下。

如何启用巨型帧

尝试在当前节点、目标节点上设置MTU:

Shell
1
ip link set eth0 mtu 9000

尝试发送巨型帧(Jumbo Frame):

Shell
1
ping -M do -s 8972 10.0.3.1

如果当前节点忘记设置MTU,你会遇到错误:ping: sendto: Message too long

如果当前节点设置了MTU,但是目标节点、两者之间的交换机没有设置,则会遇到错误:Request timeout for icmp_seq 0

如果一切正常,你会看到:8192 bytes from  ... 

假坏扇区修复

首先执行命令: dmesg | grep print_req,获取出错扇区范围。

然后,扫描出错扇区附近位置:

Shell
1
2
#                          END      START
badblocks -b 512 /dev/sda  76000000 70000000

将出错扇区覆盖一次:

Shell
1
badblocks -b 512 -w /dev/sdb 2899976 2899968

通常会扫描出连续8个扇区,原因是文件系统目前常使用4K扇区。 

升级内核
桌面系统如何升级

自己去下载内核并安装,很容易出现驱动问题、包不兼容问题。正确的方法是,使用官方原始的souces.list,安装:

Shell
1
2
3
sudo apt install --install-recommends linux-image-generic-hwe-16.04 xserver-xorg-hwe-16.04
sudo apt install linux-headers-generic-hwe-16.04
sudo ubuntu-drivers autoinstall
到4.15
Shell
1
2
3
4
5
6
7
8
9
10
11
12
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.18/linux-headers-4.15.18-041518-generic_4.15.18-041518.201804190330_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.18/linux-headers-4.15.18-041518_4.15.18-041518.201804190330_all.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.18/linux-image-4.15.18-041518-generic_4.15.18-041518.201804190330_amd64.deb
 
sudo dpkg -i *.deb
sudo update-grub
 
 
# 或者
apt search 4.15.0-34   # 检索可用的内核版本
apt install linux-image-4.15.0-34-generic linux-headers-4.15.0-34-generic linux-modules-4.15.0-34-generic \
            linux-modules-extra-4.15.0-34-generic linux-tools-4.15.0-34-generic
到4.4
Shell
1
2
3
4
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.4-wily/linux-image-4.4.0-040400-generic_4.4.0-040400_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.4-wily/linux-headers-4.4.0-040400-generic_4.4.0-040400_amd64.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.4-wily/linux-headers-4.4.0-040400_4.4.0-040400.201601101930_all.deb
sudo dpkg -i *.deb

执行下面的命令移除4.4内核:

Shell
1
2
sudo apt-get remove linux-headers-4.4.0-* linux-image-4.4.0-*
sudo update-grub 
← Windows下基于Eclipse CDT的C/C++开发
软件架构设计基础 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Ubuntu开发知识集锦
  • CentOS知识集锦
  • Ubuntu下使用Kerberos
  • Ubuntu14.04下Eclipse开发环境的搭建
  • Ubuntu下安装Samba4

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • Bazel学习笔记 38 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2