Ubuntu知识集锦
- PPA:Personal Package Archives,可以上传source,作为apt存储库
- APT:Advanced Packaging Tool,Debian GNU/Linux distribution及其变体上进行软件安装/更新/删除的工具,它简化了类linux系统的软件管理,可以进行二进制的安装或者源码编译的安装。最初是设计为pdkg的前端(管理debian的deb包),后来通过 apt-rpm组件支持RPM包
- 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终端 |
配置文件 | 说明 | ||
/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一样,用于指定源码位置 内容示例:
|
||
/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,使之获得高优先级,例如:
如果target release已经设置,APT使用如下算法来设置包的版本对应的优先级:
如果target release未设置,APT为所有已安装版本授予优先级100、所有未安装版本授予优先级500 |
||
/var/cache/apt/archives/ | 获取的软件包的存储位置 | ||
/var/cache/apt/archives/partial/ | 正在传输中的软件包文件片段 | ||
/var/lib/apt/lists/partial/ | 传输中的,存储sources.list中每一个包资源的状态信息 |
dpkg是安装、构建、管理和移除Debian软件包的工具,更加友好易用的dpkg前端工具是aptitude。该命令的语法如下:
1 |
dpkg [option...] action |
动作 | 说明 | ||
安装(-i) |
-i, --install package-file... 安装指定的软件包。如果指定选项-R,则package-file必须是一个目录。安装过程包含以下步骤:
|
||
解包(--unpack) |
--unpack package-file... 解包,但不配置软件包。如果指定选项-R,则package-file必须是一个目录 |
||
配置(--configure) |
--configure package...|-a|--pending 配置已经解包、尚未配置的软件包。如果参数packge缺失而-a或--pending存在,则所有解包且尚未配置的软件包都被配置 要重新配置已安装的软件包,可以使用dpkg-reconfigure命令 配置过程包括以下步骤:
|
||
移除(-r)和清理(-P) |
-r, --remove, -P, --purge package...|-a|--pending 移除/清理指定的软件包,-r移除除了配置文件以外的所有内容,-P则移除全部内容。移除过程包括以下步骤:
|
||
验证(-V) |
-V, --verify [package-name...] 通过比较安装路径下的文件和数据库中元信息,验证软件包的完整性,如果不指定package-name则验证所有包的完整性 |
||
列出软件包(-l) |
-l, --list package-name-pattern... 作为dpkg-query的前端。查询匹配模式的软件包 |
||
--set-selections |
设置软件包管理的选区,从标准输入读取数据。数据包括两列:软件包名称、安装状态 安装状态可以取值:
|
||
--get-selections |
--get-selections [package-name-pattern...] 列出选区中匹配模式的软件包,如果不指定package-name-pattern则非已安装的软件不被显示。输出两列:软件包名称、安装状态
|
||
列出安装的文件(-l) |
-L, --listfiles package-name... 作为dpkg-query的前端。列出指定软件包在当前系统上安装的文件 |
||
状态(-s) |
-s, --status package-name... 作为dpkg-query的前端。报告指定软件包的状态。可用的状态包括:
|
||
搜索文件(-S) |
-S, --search filename-search-pattern... 作为dpkg-query的前端。从已安装的软件包中搜索文件 示例:
|
||
信息(-p) |
--print-avail package-name... 作为dpkg-query的前端。显示软件包的详细信息 |
- --admindir=dir 设置管理目录,默认/var/lib/dpkg,该目录中包含了软件包状态信息的记录文件
- --instdir=dir 设置默认安装目录
- -E, --skip-same-version 如果相同版本的软件包已经安装,则不执行安装
- --no-debsig 不去尝试校验包的数字签名
- --log=filename 记录安装日志到指定文件,默认/var/log/dpkg.log
APT包的管理工具,是aptitude等工具的后端,dpkg的前端。命令格式:
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 ,从而安装特定版本/从特定源安装:
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 |
卸载软件包。配置文件也被清除,示例:
|
||
autoremove | 卸载系统中没有用到的软件包 | ||
clean | 删除所有下载到本地仓库中的软件包文件,除了 | ||
autoclean | 与clean类似,但是只删除哪些不太可能再次被使用的、旧版本的软件包 | ||
source | 下载源代码 | ||
build-dep |
安装构建某个软件包必须的所有依赖,示例:
|
||
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缓存,它可以对APT包缓存进行一系列的操作。改命令不会改变系统,但可以生成一系列有价值的信息。
子命令 | 说明 | ||
gencaches | 生成APT包缓存,此命令会被所有需要缓存的命令隐含调用(当缓存不存在或者过期时) | ||
showpkg pkg... |
显示列出的包的信息,信息包括:
例如 apt-cache showpkg libssl-dev 的输出如下:
|
||
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 的输出如下:
|
命令 | 说明 | ||
add-apt-repository |
添加PPA存储库,示例:
|
||
ppa-purge |
禁用一个PPA并回退为官方软件包(如果可能的话)。例如你添加了xorg-edgers PPA并且安装Nvidia驱动,当对此PPA执行ppa-purge命令时,不单单会禁用PPA,而且会把Nvidia驱动回复到Ubuntu官方仓库的版本
|
该命令是包管理器的高层接口,命令格式如下:
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 命令行中指定的包,并不一定必须安装,可以在包名后添加一个指示器,说明需要对包执行的动作:
如果install子命令后面不跟随任何包名,那么所有预定、未决的安装操作会被执行。比如你发起 aptitude install foo 命令后立即终止命令执行,那么后面必须手工 aptitude remove foo 才能取消安装 如果出现依赖冲突,aptitude会提示可选的解决方案,你可以快速的删除冲突依赖包,而不是一个个手工删除 |
||
remove |
这些命令和intall类似,但是仅对命令指定的包执行相应的动作 hold和keep的区别:前者时包在未来的safe-upgrade/full-upgrade命令中被忽略,keep仅仅取消任何准备对包进行动作 unhold执行和hold相反的操作 举例:
|
||
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 |
搜索匹配模式的软件包,匹配命令行中任意模式的软件包被打印
|
||
show |
显示软件包的详细信息
|
||
versions | 显示指定软件包的版本信息 | ||
why | 解释特定软件包需要被安装、移除的原因 | ||
why-not | |||
clean | 删除所有先前下载到本地仓库的.deb文件 | ||
autoclean | 与clean类似,但是只删除哪些不太可能再次被使用的、旧版本的软件包 | ||
changelog | 下载并显示指定源码/二进制包的Debian changelog | ||
download | 下载软件包到当前目录 |
- --allow-untrusted 允许不加提示的安装来自不受信源的软件
- -D, --show-deps 对于那些会安装/移除软件包的子命令,该选项显示自动安装/移除的简要说明
- -d, --download-only 仅仅下载软件包,而不安装/移除。软件包默认存放在 /var/cache/apt/archives
- -s, --simulate 模拟安装过程
- --schedule-only 对于修改包状态的那些命令,该选项会计划操作在未来进行,本次命令不会立即执行
- -V, --show-versions 显示被安装软件包的版本
- -v, --verbose 导致show等子命令显示更多信息
- -y, --assume-yes 对所有提示回答“是
跟踪软件的安装过程,并依此创建一个Deb包:
1 2 |
# 监控 make install,生成Deb包 sudo checkinstall -D --fstrans=no make install |
所谓UFW(Uncomplicated Firewall,非复杂的防火墙),是iptables的前端,使用它可以降低iptables的使用复杂度。
要安装、启/禁UFW,参考下面的命令:
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中的规则:
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 |
设置日志级别:
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 选项,表示仅仅显示命令执行的效果,但是不改变现有系统。
设置默认策略:
1 2 |
# 默认 允许|禁止|回绝(提出提示) 入站|出站|路由 数据包 ufw default allow|deny|reject [incoming|outgoing|routed] |
插入/删除一条规则:
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 |
重置规则到安装时的状态:
1 |
ufw reset |
规则设置举例:
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 |
这是个已知的问题,临时解决方案:
1 |
nmcli c up id 'dangdang-ydgw' |
1 |
mate-panel --reset |
按Ctrl + Alt + F1,进入文本界面,执行
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* |
执行 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 。重启后生效。
1 2 3 |
sudo apt-get install xbacklight #设置亮度,可以指定0-100 xbacklight -set 80 |
所谓一致性网络设备命名(consistent network device naming),是Linux下以太网设备命名的约定规则,用来替换老旧的eth*命名风格。后者存在的问题是,由于内核发现网卡的顺序可能发生变化,这导致以太网设备的名称序号也随着改变。
某些操作系统版本默认启用了一致性网络设备命名,要改变此行为,可以:
- 修改文件vim /etc/default/grub,设置内核参数: GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
- 执行 update-grub 并重启
重启后,以太网卡的命名风格变成传统的eth0*
1 2 3 4 5 6 |
sudo gedit /etc/NetworkManager/NetworkManager.conf #修改如下一行 #[ifupdown] #managed=true 默认值为false sudo service network-manager restart |
1 2 3 |
nmcli dev list iface wlan1 | grep IP4 # 或者 nm-tool | grep DNS |
除了启动时耗时外,还会出现通知区域的网络图标消失的问题。原因可能是因为 /etc/network/interfaces 配置了多于1个的 gateway 导致
- 打开System Settings - Text Entry,添加中文输入法ibus-pinyin
- 打开终端,输入ibus-setup,Show property panel 设置为 Do not show
- nautilus /usr/share/ibus-pinyin/icons/ 该目录为ibus-pinyin的图标文件,可以进行美化
- 如果输入混乱,可以执行:ibus-daemon -drx并重启
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 |
移除系统添加的字体即可解决。
1 |
sudo apt-get remove fonts-arphic-ukai fonts-arphic-uming |
进入字符界面 Ctrl + Alt + Space,Space松开,按F1
进入图形界面 Ctrl + Alt + Space,Space松开,按F7
首先在VMware菜单中选择安装VMware Tools,然后复制挂载光驱中的压缩包,执行perl文件。
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 #遇到提示一律回车,完成后重启 |
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 |
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 |
新建或修改文件:
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下的显示管理器)的配置文件:
1 2 |
# 添加下面的内容 display-setup-script=/etc/lightdm/lightdm-setup |
该方法在Ubuntu MATE 16.04下测试通过。
有时在安装软件包时会遇到unmet dependencies提示,要解决此类问题,可以参考:
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 visudo 修改文件:
1 2 3 4 |
# alex免密码 alex ALL=(ALL) NOPASSWD: ALL # admin组的成员免密码 %admin ALL=(ALL) NOPASSWD: ALL |
客户端的公钥需要放到服务器的 ~/.ssh/authorized_keys中,需要注意文件模式:
1 2 3 |
# 服务器端 sudo chmod 700 ~/.ssh sudo chmod 600 ~/.ssh/authorized_keys |
仍然无法免密码登陆,修改/etc/ssh/sshd_config并重启SSH服务:
1 2 |
# 此项的默认值为yes StrictModes no |
打开Disks,可以添加挂载选项:
hide_hid_files,隐藏NTFS的隐藏文件
windows_names,仅允许Windows下合法的文件名
show_sys_files,显示系统文件
hide_dot_files,隐藏点号开头的文件
现象:开机后,BIOS通过后就自动重启。
原因:在我的机器上,此问题是因为错误的使用分区工具,导致引导扇区出错导致。
解决上述问题的方法是:
- 使用Ubuntu启动U盘进入系统
- 执行:
1234sudo apt-add-repository ppa:yannubuntu/boot-repairsudo apt-get updatesudo apt-get install -y boot-repairboot-repair
执行boot-repair会弹出一个图形界面,根据提示进行操作。
在多硬盘(每硬盘对应一个OS,相互独立)的机器上,执行上述操作后,可能出现Windows系统无法启动的情况。这是因为boot-repair把修改了所有硬盘的启动扇区导致。可以使用下面的命令证实这一点:
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所在磁盘的主引导记录:
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)
等待一会后,选择倒数第二项:
1 2 |
#挂载读写文件系统 mount -o remount,rw / |
即可以root权限进行维护。
1 |
sudo nautilus& |
1 2 |
cd /etc/apt/sources.list.d sudo mv google-chrome.list google-chrome.list.save |
1 2 |
#运行以下命令,根据提示进行设置 dpkg-reconfigure tzdata |
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
1 |
sudo dpkg -i path/name.deb |
临时修改主机名称:
1 |
sudo hostname new-name |
永久修改主机名称:编辑文件/etc/hostname
编辑:/etc/hosts 修改 127.0.1.1对应的域名
执行下面的命令安装Avahi即可,Avahi是Zeroconf规范的开源实现:
1 2 |
sudo apt-get install avahi-daemon avahi-dnsconfd avahi-discover avahi-utils libnss-mdns sudo reboot |
1 2 3 4 |
#安装DNS缓存守护服务 Name Service Cache Daemon apt-get install nscd #重新启动 service nscd restart |
1 2 |
#需要重设密码: sudo passwd root |
1 2 |
sudo apt-get install trash-cli sudo trash-empty |
需要根据PPTP服务器的设定进行配置,如果连接失败,可以查看/var/log/syslog,下图是一个配置示例:
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要填写预共享密钥。
现象:日志显示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
- 网络管理器 ⇨ Edit Connections,弹出的窗口中点击Add
- 添加一个Wi-Fi类型的连接,填写好字段。注意IPv4 Settings中,Method选择Shared to other computers保存
- 打开文件 /etc/NetworkManager/system-connections/新创建的连接名称 ,修改 mode=ap
- 网络管理器 ⇨ Connect to hidden Wi-Fi network,选择新创建的连接,点击Connect
- 其他机器现在可以连接到热点 了
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双系统,分别与蓝牙设备配对后,只有最后配对的系统才能访问鼠标,切换系统后需要重新配对。解决此问题的步骤如下:
- Windows执行配对
- Ubuntu执行配对,然后打开配置文件 /var/lib/bluetooth/蓝牙适配器MAC/目标蓝牙设备MAC,获取密钥:
123456; ...[LinkKey]; 记住这个密钥Key=9E438CF7CED4F8D80E6FB46B29468575Type=4PINLength=0 - 切换到Windows系统,以系统管理员身份打开cmd.exe,执行 psexec -s -i regedit 打开注册表
- 定位到注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\,修改对应设备的安全码为linkkeys中的安全码,例如:
12rem 修改 f065dd9b9784的二进制值rem 可以退格键删除所有内容,然后依次输入16进制数9E 43 8C F7 CE D4 F8 D8 0E 6F B4 6B 29 46 85 75 - 在Windows下尝试连接蓝牙
要禁用Ubuntu 16.04的intel_pstate,恢复acpi-cpufreq,可以:
1 |
sudo apt-get install acpi-support acpid acpi |
然后编辑/etc/default/grub:
1 |
GRUB_CMDLINE_LINUX_DEFAULT="... intel_pstate=disable" |
执行 sudo update-grub并重启即可。
最近买了阿米洛的蓝牙机械键盘,结果Ubuntu不能识别。到网上搜索一下,发现需要升级Bluez到5.x版本,并且必须使用Blueman代替Gnome的蓝牙管理器。
执行如下命令安装:
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连接蓝牙键盘了。存在两个问题需要解决:
- 每次开机后,蓝牙适配器总是关闭的。Blueman没有提供相关的设置项,需要修改Bluez的配置文件:
1AutoEnable=true - 无法正常关机,卡死在Splash屏上。出现这个现象的原因,在我机器上是bluetoothd无法正常终结,可以写一个关机脚本强制终结:
1sudo /usr/bin/pkill -9 bluetoothd
目前(1.5.0)版本的ibus-pinyin没有提供设置项,可以修改源码:
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并安装:
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还有一个严重问题,在Chrome/Firefox中,经常自动删除已经输入的文本。可以改用ibus-libpinyin。下面是安装步骤:
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冲突问题,可以修改源码:
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; } |
1 2 3 4 |
# 创建挂载目录 mkdir /mnt/ramdisk # 通过命令挂载 mount -t tmpfs -o size=4096M tmpfs /mnt/ramdisk |
也可以修改fstab,在启动时自动挂载:
1 |
tmpfs /mnt/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=4096M 0 0 |
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 |
如果你正在使用交换文件,可以创建一个交换分区,然后:
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填写错误:
1 |
UUID=e000bd2d-8ddd-4124-8e45-50ec2e086cca none swap sw 0 0 |
可以使用 sudo blkid 查到交换分区真实的UUID,修改fstab文件,然后重启即可。
利用反转SSH隧道(Reverse SSH Tunnel)技术,可以让你从互联网来访问隐藏在防火墙后面的(内网)机器。
下面用一个实际的例子来说明如何配置反转SSH隧道。在这个例子中,外网机器vpn.gmem.cc,登陆用户为root,位于内网机器不具有公共地址,登陆用户为pi。两台机器均使用公钥验证。
1 2 |
AllowTcpForwarding yes TCPKeepAlive yes |
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
1 |
fc-cache -f -v |
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 |
或者:
1 2 3 4 |
# 保存设置到任意文件 sudo iptables-save > /etc/network/iptables.rules # 从先前保存的文件中加载 pre-up iptables-restore < /etc/network/iptables.rules |
你可以在网络启动的时候自动加载iptables设置:
1 2 3 |
iface eth0 inet static .... pre-up /etc/init.d/iptables-persistent reload |
报错:Permission denied, please try again.
查看/var/log/auth.log,提示:Failed password for root from 192.168.0.89 port 39275 ssh2
解决办法:修改配置文件
1 2 3 4 |
# 把下面这一行 PermitRootLogin without-password # 改为: PermitRootLogin yes |
然后重启SSH服务: sudo service ssh restart
最简单的办法,是把用户的UID设置为小于500的数字:
1 2 |
sudo usermod -u 125 kurento sudo groupmod -g 133 kurento |
网桥能够把两个以太网卡(例如eth0、eth1)桥接在一起,当两个以太网被桥接到一起后,两个网络合并为单个更大的网络。
要在Ubuntu下配置网桥,可以执行以下步骤:
1 2 |
sudo apt-get update sudo apt-get install bridge-utils |
安装此软件后,你就可以在/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:
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地址,该地址和被桥接的两个网卡之一所在网段相同。
执行下面的命令,找到你需要的启动项:
1 2 3 4 5 |
grep menuentry /boot/grub/grub.cfg # 输出内容 # ... # menuentry 'Windows 7 (loader) (on /dev/sda1)' --class windows ... |
修改配置文件:
1 |
GRUB_DEFAULT="Windows 7 (loader) (on /dev/sda1)" |
运行下面的命令,重启后即生效:
1 |
sudo update-grub |
我在克隆分区镜像到另外一台机器上时,出现此问题。原因是两台机器的分区结构不一样。grub中的记录已经无效。
解决办法:
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 |
Ubuntu下的Alt + <KEY>激活顶部菜单的功能有时候很烦人,可以按照如下方法禁用掉:
- 对于基于GTK 2的应用,例如GIMP,可以在~/.gtkrc-2.0中添加:
1gtk-enable-mnemonics = 0 - 对于基于GTK3的应用,可以修改/etc/gtk-3.0/settings.ini
1 |
export TERM=xterm-256color |
有时候,程序自动打开的窗口可能不会自动激活(置于最前面)。要让新打开的窗口自动激活,可以执行:
1 |
dconf write /org/compiz/profiles/unity/plugins/core/focus-prevention-level 0 |
14.10以下的版本,自带源不包括JDK1.8,可以自行添加源并安装:
1 2 3 |
sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update sudo apt-get install openjdk-8-jdk |
所有密码存放在/etc/NetworkManager/system-connections目录下。
尝试在当前节点、目标节点上设置MTU:
1 |
ip link set eth0 mtu 9000 |
尝试发送巨型帧(Jumbo Frame):
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,获取出错扇区范围。
然后,扫描出错扇区附近位置:
1 2 |
# END START badblocks -b 512 /dev/sda 76000000 70000000 |
将出错扇区覆盖一次:
1 |
badblocks -b 512 -w /dev/sdb 2899976 2899968 |
通常会扫描出连续8个扇区,原因是文件系统目前常使用4K扇区。
自己去下载内核并安装,很容易出现驱动问题、包不兼容问题。正确的方法是,使用官方原始的souces.list,安装:
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 |
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 |
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内核:
1 2 |
sudo apt-get remove linux-headers-4.4.0-* linux-image-4.4.0-* sudo update-grub |
Leave a Reply