<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; Ubuntu</title>
	<atom:link href="https://blog.gmem.cc/tag/ubuntu/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Fri, 03 Apr 2026 04:13:36 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Ubuntu开发知识集锦</title>
		<link>https://blog.gmem.cc/ubuntu-dev-faq</link>
		<comments>https://blog.gmem.cc/ubuntu-dev-faq#comments</comments>
		<pubDate>Sat, 14 Jan 2017 04:50:03 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=35335</guid>
		<description><![CDATA[<p>Unity 简介 Ubuntu Unity是Aytana项目的一部分，该项目的目标是提升Ubuntu的用户体验。 Unity是一套图形界面，主要包括以下几个部分： 顶部工具栏：各种托盘图标，最大化窗口的关闭/最小化/恢复按钮，应用程序菜单栏 启动器：左侧图标，属于一种Dock Dash：启动栏第一个图标，点击后可以搜索应用程序 HUD：可以用来搜索功能，某些应用程序提供了对应搜索支持 构建 下载源码 [crayon-69d2504b1b350264865553/] 安装依赖 在source.list中启用deb-src，使用下面的命令安装构建依赖： [crayon-69d2504b1b356220578617/] ibus ibus 构建 [crayon-69d2504b1b358067576519/] libpinyin 构建 [crayon-69d2504b1b35b412612804/] <a class="read-more" href="https://blog.gmem.cc/ubuntu-dev-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/ubuntu-dev-faq">Ubuntu开发知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">Unity</span></div>
<div class="blog_h2"><span class="graybg">简介</span></div>
<p><a href="https://ubuntuunity.org/">Ubuntu Unity</a>是Aytana项目的一部分，该项目的目标是提升Ubuntu的用户体验。</p>
<p>Unity是一套图形界面，主要包括以下几个部分：</p>
<ol>
<li>顶部工具栏：各种托盘图标，最大化窗口的关闭/最小化/恢复按钮，应用程序菜单栏</li>
<li>启动器：左侧图标，属于一种Dock</li>
<li>Dash：启动栏第一个图标，点击后可以搜索应用程序</li>
<li>HUD：可以用来搜索功能，某些应用程序提供了对应搜索支持</li>
</ol>
<div class="blog_h2"><span class="graybg">构建</span></div>
<div class="blog_h3"><span class="graybg">下载源码</span></div>
<pre class="crayon-plain-tag">git clone -b xenial https://git.launchpad.net/unity</pre>
<div class="blog_h3"><span class="graybg">安装依赖</span></div>
<p>在source.list中启用deb-src，使用下面的命令安装构建依赖：</p>
<pre class="crayon-plain-tag">sudo apt-get build-dep unity</pre>
<div class="blog_h1"><span class="graybg">ibus</span></div>
<div class="blog_h2"><span class="graybg">ibus</span></div>
<div class="blog_h3"><span class="graybg">构建</span></div>
<pre class="crayon-plain-tag">git clone git clone https://github.com/ibus/ibus.git
cd ibus

wget https://www.unicode.org/Public/emoji/4.0/emoji-test.txt
sudo mkdir -p /usr/share/unicode/emoji
sudo mv Downloads/emoji-test.txt /usr/share/unicode/emoji/emoji-test.txt
wget https://raw.githubusercontent.com/fujiwarat/cldr-emoji-annotation/master/annotations/en.xml
sudo mkdir -p /usr/share/unicode/cldr/common/annotations/
sudo cp en.xml  /usr/share/unicode/cldr/common/annotations/en.xml
wget https://www.unicode.org/Public/UNIDATA/NamesList.txt
sudo mkdir -p /usr/share/unicode/ucd
sudo cp NamesList.txt /usr/share/unicode/ucd/NamesList.txt
wget https://www.unicode.org/Public/UNIDATA/Blocks.txt
sudo cp Blocks.txt /usr/share/unicode/ucd/Blocks.txt

sudo add-apt-repository ppa:vala-team
sudo apt update
sudo apt install  gnome-common gtk-doc-tools libgtk-3-dev libdconf-dev valac vala-0.40-doc

./autogen.sh
export PYTHON=/usr/bin/python3
./configure --prefix=/usr
make -j8</pre>
<div class="blog_h2"><span class="graybg">libpinyin</span></div>
<div class="blog_h3"><span class="graybg">构建</span></div>
<pre class="crayon-plain-tag">git clone https://github.com/libpinyin/libpinyin.git
cd libpinyin

sudo apt install libdb-dev

export CXXFLAGS=-Wl,--copy-dt-needed-entries
./configure --prefix=/usr
make -j8

sudo make install</pre>
<div class="blog_h2"><span class="graybg">ibus-libpinyin</span></div>
<div class="blog_h3"><span class="graybg">构建</span></div>
<pre class="crayon-plain-tag">git clone https://github.com/libpinyin/ibus-libpinyin.git
cd ibus-libpinyin

sudo apt install libibus-1.0-dev
sudo apt install sqlite3 libsqlite3-dev

./autogen.sh
./configure --prefix=/usr
make -j8

sudo make install</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/ubuntu-dev-faq">Ubuntu开发知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/ubuntu-dev-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下使用Kerberos</title>
		<link>https://blog.gmem.cc/kerberos-under-ubuntu</link>
		<comments>https://blog.gmem.cc/kerberos-under-ubuntu#comments</comments>
		<pubDate>Mon, 15 Aug 2016 01:38:46 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=15419</guid>
		<description><![CDATA[<p>Kerberos简介 Kerberos是MIT开发的网络身份验证系统，利用它可以实现单点登陆。Kerberos引入以下概念： 术语 说明 Principal 被认证的实体，可以是用户、计算机、某台计算机提供的服务 Instances 用于识别某些服务类、特殊的管理性实体 Realms 安全域，类似于Windows的工作组、域之类的概念，通常使用全大写的域名表示 KDC 密钥分发中心（Key Distribution Center），包含了： 关于所有实体的数据库 一个认证服务器 一个票据授予服务器 对于每个安全域，至少需要一个KDC，最好使用KDC集群确保HA TGS 票据授予服务器（Ticket Granting Server），在客户端请求时授予其服务票据 <a class="read-more" href="https://blog.gmem.cc/kerberos-under-ubuntu">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/kerberos-under-ubuntu">Ubuntu下使用Kerberos</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h2"><span class="graybg">Kerberos简介</span></div>
<p>Kerberos是MIT开发的网络身份验证系统，利用它可以实现单点登陆。Kerberos引入以下概念：</p>
<table class="full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">术语</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>Principal</td>
<td>被认证的实体，可以是用户、计算机、某台计算机提供的服务</td>
</tr>
<tr>
<td>Instances</td>
<td>用于识别某些服务类、特殊的管理性实体</td>
</tr>
<tr>
<td>Realms</td>
<td>安全域，类似于Windows的工作组、域之类的概念，通常使用全大写的域名表示</td>
</tr>
<tr>
<td>KDC</td>
<td>
<p>密钥分发中心（Key Distribution Center），包含了：</p>
<ol>
<li>关于所有实体的数据库</li>
<li>一个认证服务器</li>
<li>一个票据授予服务器</li>
</ol>
<p>对于每个安全域，至少需要一个KDC，最好使用KDC集群确保HA</p>
</td>
</tr>
<tr>
<td>TGS</td>
<td>票据授予服务器（Ticket Granting Server），在客户端请求时授予其服务票据</td>
</tr>
<tr>
<td>Tickets</td>
<td>
<p>票据，用于确认两个实体 —— 用户、用户请求的服务 ——的身份</p>
<p>当用户实体登陆到启用Kerberos验证的客户端时：</p>
<ol>
<li>KDC发布一个票据授予票据（Ticket Granting Ticket）</li>
<li>如果用户提供了合法的访问凭证，则身份验证通过且用户可以向TGS请求针对某个Kerberized服务的票据</li>
<li>Kerberized服务利用票据对用户进行验证，不需要用户再次提供原始的访问凭证（通常是用户名/密码）</li>
</ol>
</td>
</tr>
<tr>
<td>Keytab Files</td>
<td>从KDC的实体数据库中抽取出来的、包含服务/主机的密钥的文件</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">认证步骤举例</span></div>
<p>Apache Drill支持Kerberos认证，步骤如下：</p>
<ol>
<li>客户端登陆，提供：自己的身份信息、凭证信息、对获取票据的票据的请求（对TGT的请求）</li>
<li>KDC的认证服务器验证凭证信息成功，返回TGT、会话密钥给客户端</li>
<li>客户端提供TGT、会话密钥给KDC的TGS，请求对Drillbit服务的访问权限</li>
<li>TGS授予用于访问Drillbit的凭证</li>
<li>客户端使用凭证访问Drill集群</li>
<li>集群对客户端身份验证成功</li>
</ol>
<div class="blog_h2"><span class="graybg">Kerberos服务器</span></div>
<p>安装服务器之前，应该确保DNS服务器被正确的配置，因为Kerberos的Realm基于域名进行匹配。另外Kerberos对时间敏感，如果客户端时间和服务器时间差距超过5分钟，则默认不能进行验证。</p>
<div class="blog_h3"><span class="graybg">安装</span></div>
<p>假设我们的Kerberos服务器的域名为zircon.gmem.cc。</p>
<p>执行下面的命令完成安装：</p>
<pre class="crayon-plain-tag">sudo apt-get install krb5-kdc krb5-admin-server
# 提示输入默认Realm名称时，输入DNS域名，例如GMEM.CC
# 提示输入管理服务器名称，输入机器名，例如ZIRCON

# 安装期间，修改的配置文件是 /etc/krb5.conf</pre>
<div class="blog_h3"><span class="graybg">配置</span></div>
<p>创建一个新的Realm：</p>
<pre class="crayon-plain-tag">sudo krb5_newrealm
# 输入数据库管理密码</pre>
<p>如果需要重新配置KDC，例如修改Realm名称，可以执行：</p>
<pre class="crayon-plain-tag">sudo dpkg-reconfigure krb5-kdc</pre>
<p>一旦KDC开始运行，你需要一个管理员，建议使用和平时登陆用户不同的名称：</p>
<pre class="crayon-plain-tag"># kamin是Kerberos数据库管理程序
sudo kadmin.local
# Authenticating as principal root/admin@GMEM.CC with password.
# root是一个Principal，/admin是一个Instance，@GMEM.CC指明Realm

# 创建新的管理员用户（实体）
addprinc alex/admin
# 根据提示设置密码

quit</pre>
<p>新的管理员需要配置ACL权限：</p>
<pre class="crayon-plain-tag"># 允许alex对Realm中任何实体进行任何操作
alex/admin@GMEM.CC          *</pre>
<p>重新启动管理服务器，让新的ACL设置生效：</p>
<pre class="crayon-plain-tag">sudo service krb5-admin-server restart</pre>
<p>测试新用户：</p>
<pre class="crayon-plain-tag"># kinit 用于获得并缓存票据授予票据（ticket-granting ticket）
kinit alex/admin

# klist 列出缓存的Kerberos票据
klist
# Default principal: alex/admin@GMEM.CC

# Valid starting       Expires              Service principal
# 08/15/2017 12:36:18  08/15/2017 22:36:18  krbtgt/GMEM.CC@GMEM.CC
# 	 renew until 08/16/2017 12:36:07 </pre>
<div class="blog_h3"><span class="graybg">卸载</span></div>
<pre class="crayon-plain-tag">sudo apt-get purge krb5-kdc krb5-admin-server  krb5-config krb5-locales krb5-user
sudo rm /etc/krb5.conf</pre>
<div class="blog_h2"><span class="graybg">Kerberos客户端</span></div>
<p>本节介绍如何把一个Linux系统配置为Kerberos客户端。一旦用户成功登陆到操作系统，他即可访问任何kerberized服务。</p>
<div class="blog_h3"><span class="graybg">安装</span></div>
<p>安装以下软件：</p>
<pre class="crayon-plain-tag">sudo apt-get install krb5-user libpam-krb5 libpam-ccreds auth-client-config</pre>
<p>配置以设置默认Realm：</p>
<pre class="crayon-plain-tag">sudo dpkg-reconfigure krb5-config</pre>
<p>&nbsp;</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/kerberos-under-ubuntu">Ubuntu下使用Kerberos</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/kerberos-under-ubuntu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Ubuntu上安装百度云客户端</title>
		<link>https://blog.gmem.cc/baiduyun-client-for-ubuntu</link>
		<comments>https://blog.gmem.cc/baiduyun-client-for-ubuntu#comments</comments>
		<pubDate>Wed, 16 Dec 2015 01:57:59 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=10035</guid>
		<description><![CDATA[<p>公司的网络速度真是够呛，下载GitHub上的源码，速度只有几十KB。我转到VPS上下载，速度居然几十MB，这已经不仅仅是数量级的差距了 试了一下Python版的百度云客户端，从VPS上传100MB文件瞬间完成，而在公司同步百度云的速度可以达到MB级别。好吧，以后就这样玩。 安装软件 [crayon-69d2504b1bae9226056490/] 配置 创建本地同步目录：[crayon-69d2504b1baed887647632-i/]  编辑登录脚本，添加一个函数： [crayon-69d2504b1baf0422060015/] brive命令列表 子命令  说明  purge 清空本地和云端存储  list 列出云端文件  syncdown 同步云端文件到本地 syncup 同步本地文件到云端 upload 上传一个文件或者目录到云端</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/baiduyun-client-for-ubuntu">在Ubuntu上安装百度云客户端</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><p>公司的网络速度真是够呛，下载GitHub上的源码，速度只有几十KB。我转到VPS上下载，速度居然几十MB，这已经不仅仅是数量级的差距了<img src="https://blog.gmem.cc/wp-content/plugins/tinymce-emoticons/images/emoticons-set-1/boring.png" alt="boring" border="0" hspace="5" /></p>
<p>试了一下<a href="https://github.com/houtianze/bypy">Python版的百度云客户端</a>，从VPS上传100MB文件瞬间完成，而在公司同步百度云的速度可以达到MB级别。好吧，以后就这样玩。</p>
<div class="blog_h3"><span class="graybg">安装软件</span></div>
<pre class="crayon-plain-tag">git clone https://github.com/houtianze/bypy
cd bypy
./setup.py install
cd ..
rm -rf bypy</pre>
<div class="blog_h3"><span class="graybg">配置</span></div>
<ol>
<li>创建本地同步目录：<pre class="crayon-plain-tag">mkdir ~/brive</pre> </li>
<li>编辑登录脚本，添加一个函数：<br />
<pre class="crayon-plain-tag">brive () {
    pushd ~/brive &gt; /dev/null
    if [ $1 == 'purge' ]; then :
        rm -rf *
        bypy.py  rm /
    else
        bypy.py $@
    fi
    popd &gt; /dev/null
}</pre>
</li>
</ol>
<div class="blog_h3"><span class="graybg">brive命令列表</span></div>
<table class="fixed-word-wrap" style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 25%; text-align: center;">子命令 </td>
<td style="text-align: center;">说明 </td>
</tr>
</thead>
<tbody>
<tr>
<td>purge</td>
<td>清空本地和云端存储 </td>
</tr>
<tr>
<td>list</td>
<td>列出云端文件 </td>
</tr>
<tr>
<td>syncdown</td>
<td>同步云端文件到本地</td>
</tr>
<tr>
<td>syncup</td>
<td>同步本地文件到云端</td>
</tr>
<tr>
<td>upload</td>
<td>上传一个文件或者目录到云端</td>
</tr>
</tbody>
</table>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/baiduyun-client-for-ubuntu">在Ubuntu上安装百度云客户端</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/baiduyun-client-for-ubuntu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>类UNIX系统下使用Dnsmasq</title>
		<link>https://blog.gmem.cc/dnsmasq-under-unix</link>
		<comments>https://blog.gmem.cc/dnsmasq-under-unix#comments</comments>
		<pubDate>Sat, 15 Aug 2015 05:40:03 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=15431</guid>
		<description><![CDATA[<p>简介 Dnsmasq是一个轻量级的DHCP服务器、DNS缓存服务器。它可以提供本地的DNS服务，把不能解析的请求转交给上级DNS处理。 Dnsmasq可以读取/etc/hosts文件中的条目，来作域名解析。 OS X 安装 可以通过Homebrew安装： [crayon-69d2504b1bd33853246541/] 创建配置文件： [crayon-69d2504b1bd36337156570/] 修改网络配置中的DNS配置，将127.0.0.1放到DNS列表的最前面。 服务化 [crayon-69d2504b1bd39082472823/] Ubuntu 安装 通常Ubuntu已经自带了此软件包，不需要手工安装。如果你的机器上缺少dnsmasq，执行下面的命令安装： [crayon-69d2504b1bd3b790301320/] 安装后，dnsmasq的守护程序会自动启动。 配置 默认的启动脚本，包含以下参数： [crayon-69d2504b1bd3d561892242/] 所以我们只需要把配置文件放在/etc/dnsmasq.d目录下就可以了。注意此目录中所有文件都会被读取。添加下面的配置文件： <a class="read-more" href="https://blog.gmem.cc/dnsmasq-under-unix">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/dnsmasq-under-unix">类UNIX系统下使用Dnsmasq</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">简介</span></div>
<p>Dnsmasq是一个轻量级的DHCP服务器、DNS缓存服务器。它可以提供本地的DNS服务，把不能解析的请求转交给上级DNS处理。</p>
<p>Dnsmasq可以读取/etc/hosts文件中的条目，来作域名解析。</p>
<div class="blog_h1"><span class="graybg">OS X</span></div>
<div class="blog_h2"><span class="graybg">安装</span></div>
<p>可以通过Homebrew安装：</p>
<pre class="crayon-plain-tag">brew install dnsmasq</pre>
<p>创建配置文件：</p>
<pre class="crayon-plain-tag">mkdir -pv $(brew --prefix)/etc/
touch $(brew --prefix)/etc/dnsmasq.conf</pre>
<p>修改网络配置中的DNS配置，将127.0.0.1放到DNS列表的最前面。</p>
<div class="blog_h2"><span class="graybg">服务化</span></div>
<pre class="crayon-plain-tag">sudo cp -v $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

# 现在可以看到Dnsmasq已经启动了
sudo launchctl list | grep dns

# 要禁用Dnsmasq服务，可以
sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

# 注意，Dnsmasq不会监控hosts文件的变动，因此修改hosts后需要重新启动
sudo brew services restart dnsmasq</pre>
<div class="blog_h1"><span class="graybg">Ubuntu</span></div>
<div class="blog_h2"><span class="graybg">安装</span></div>
<p>通常Ubuntu已经自带了此软件包，不需要手工安装。如果你的机器上缺少dnsmasq，执行下面的命令安装：</p>
<pre class="crayon-plain-tag">sudo apt install dnsmasq</pre>
<p>安装后，dnsmasq的守护程序会自动启动。</p>
<div class="blog_h2"><span class="graybg">配置</span></div>
<p>默认的启动脚本，包含以下参数：</p>
<pre class="crayon-plain-tag">/usr/sbin/dnsmasq 
    # 指定PID文件路径
    -x /var/run/dnsmasq/dnsmasq.pid 
    # 以什么身份运行守护程序
    -u dnsmasq 
    # 指定上游DNS服务器，此文件自动生成，在桌面系统中会读取NetworkManager中的DNS设置并写入此文件
    -r /var/run/dnsmasq/resolv.conf 
    # 指定配置文件目录
    -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new</pre>
<p>所以我们只需要把配置文件放在/etc/dnsmasq.d目录下就可以了。注意此目录中所有文件都会被读取。添加下面的配置文件：</p>
<pre class="crayon-plain-tag">expand-hosts
domain=gmem.cc</pre>
<div class="blog_h3"><span class="graybg">配置文件详解</span></div>
<pre class="crayon-plain-tag"># 监听端口
port=53

# 上游DNS服务器的路径
resolv-file=/etc/resolv.conf

# 安装定义顺序逐一尝试上游DNS服务器
strict-order

# 不从任何外部文件读取上游DNS
no-resolv

# 添加上游服务器
# 对于本地网络的DNS查询，转发给192.168.0.1
server=/localnet/192.168.0.1   
# 针对*.svc.k8s.gmem.cc的DNS查询，转发给10.96.0.10
server=/svc.k8s.gmem.cc/10.96.0.10    
# 针对192.168.3/24的DNS反查，转发给10.1.2.3
server=/3.168.192.in-addr.arpa/10.1.2.3
# 和上游DNS 10.1.2.3联系时通过eth1路由
server=10.1.2.3@eth1

# 仅本地域名列表，这些域名的查询仅仅基于/etc/hosts文件或者DHCP完成
local=/localnet/

# 静态指定域名和IP的关系，支持泛域名解析
address=/zircon.gmem.cc/127.0.0.1
# 泛域名解析
address=/.k8s.gmem.cc/10.0.11.10

# 仅仅在指定的网络接口上监听DNS/DHCP请求，要指定多个接口，编写多行
interface=eth0

# 在除了指定网络接口外的任何接口上监听
except-interface=virbr0

# 在指定地址上监听，注意包含127.0.0.1
listen-address=127.0.0.1

# 在指定网络接口上仅仅提供DNS服务
no-dhcp-interface=eth0

# 通配绑定所有接口
bind-interfaces

# 如果不希望读取/etc/hosts中的解析条目
no-hosts

# 读取除了/etc/hosts之外的包含解析条目的文件
addn-hosts=/etc/banner_add_hosts

# 根据domain选项，为hosts文件条目自动添加域名后缀
# 使用带后缀、不带后缀的方式访问此域名，都支持
expand-hosts

# 设置dnsmasq的域，设置后，具有以下行为：
# 1、允许DHCP主机拥有全限定的域名
# 2、设置DHCP的domain选项，进而潜在的设置所有基于DHCP配置的主机的domain
# 3、如果设置了expand-hosts，自动为hosts文件中的条目添加后缀
domain=gmem.cc

# 针对特定子网设置域名后缀
domain=vm.gmem.cc,10.0.0.1/8

# 下面这行启用内置的DHCP服务器，需要指定地址范围，租借时间
# 如果有多个网络，则重复下面的条目
dhcp-range=192.168.0.50,192.168.0.150,12h

# 静态分配IP地址到指定的MAC
dhcp-host=11:22:33:44:55:66,192.168.0.60 

# 记录日志
log-facility=/var/log/dnsmasq.log

# 最大连接数
dns-forward-max=512</pre>
<div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h2"><span class="graybg">无法启动</span></div>
<p>报错信息：dnsmasq: setting capabilities failed: Operation not permitted</p>
<p>报错原因：在Docker中运行dnsmasq会出现此问题，将配置user/group改为root即可。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/dnsmasq-under-unix">类UNIX系统下使用Dnsmasq</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/dnsmasq-under-unix/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android Studio知识集锦</title>
		<link>https://blog.gmem.cc/android-studio-faq</link>
		<comments>https://blog.gmem.cc/android-studio-faq#comments</comments>
		<pubDate>Tue, 24 Mar 2015 09:30:12 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[AS]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=11187</guid>
		<description><![CDATA[<p>Ubuntu相关的AS知识 环境变量设置 [crayon-69d2504b1bffa110617976/] 安装KVM以加速AVD  [crayon-69d2504b1bffd472643696/] 字体渲染优化 Android Studio（包括Jetbrains、WebStorms等IDE），在Ubuntu下字体渲染过于单薄，可以使用修改过的Open JDK： [crayon-69d2504b1c000397969339/] 修改Jetbrains的启动脚本，设置上面安装的Open JDK为JAVA_HOME，并设置以下JVM参数： [crayon-69d2504b1c002061665296/] 下面是.desktop文件的示例： [crayon-69d2504b1c004149046314/] &#160; &#160;</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/android-studio-faq">Android Studio知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h2"><span class="graybg">Ubuntu相关的AS知识</span></div>
<div class="blog_h3"><span class="graybg">环境变量设置</span></div>
<pre class="crayon-plain-tag">ANDROID_HOME=/home/alex/Android/Sdk
PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH</pre>
<div class="blog_h3"><span class="graybg">安装KVM以加速AVD </span></div>
<pre class="crayon-plain-tag"># 安装必要的软件
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
# 添加当前用户到组
sudo adduser alex kvm
sudo adduser alex libvirtd

# 启动AVD管理器，新建模拟器，注意一定要选择Atom的镜像
android avd</pre>
<div class="blog_h3"><span class="graybg">字体渲染优化</span></div>
<p>Android Studio（包括Jetbrains、WebStorms等IDE），在Ubuntu下字体渲染过于单薄，可以使用修改过的Open JDK：</p>
<pre class="crayon-plain-tag"># 可选启用HUD
sudo add-apt-repository ppa:danjaredg/jayatana
sudo apt-get update
sudo apt-get install jayatana
# 安装带Font fix的JDK版本
sudo add-apt-repository ppa:no1wantdthisname/openjdk-fontfix
sudo apt-get update
sudo apt-get install openjdk-7-jdk</pre>
<p>修改Jetbrains的启动脚本，设置上面安装的Open JDK为JAVA_HOME，并设置以下JVM参数：</p>
<pre class="crayon-plain-tag">-Dawt.useSystemAAFontSettings=lcd
-Dswing.aatext=true
-Dsun.java2d.xrender=true
-Dsun.java2d.pmoffscreen=false</pre>
<p>下面是.desktop文件的示例：</p>
<pre class="crayon-plain-tag">[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Name=Android Studio
Icon=jetbrains-studio.png
Path=/home/alex
Exec=/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -Xbootclasspath/a:/home/alex/Android/ide/as/1.5/bin/../lib/boot.jar -classpath /home/alex/Android/ide/as/1.5/bin/../lib/bootstrap.jar:/home/alex/Android/ide/as/1.5/bin/../lib/extensions.jar:/home/alex/Android/ide/as/1.5/bin/../lib/util.jar:/home/alex/Android/ide/as/1.5/bin/../lib/jdom.jar:/home/alex/Android/ide/as/1.5/bin/../lib/log4j.jar:/home/alex/Android/ide/as/1.5/bin/../lib/trove4j.jar:/home/alex/Android/ide/as/1.5/bin/../lib/jna.jar:/usr/lib/jvm/java-1.7.0-openjdk-amd64/lib/tools.jar -Xms256m -Xmx1280m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=225m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -da -Djna.nosys=true -Djna.boot.library.path= -Djna.debug_load=true -Djna.debug_load.jna=true -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true  -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -Dsun.java2d.xrender=true -Dsun.java2d.pmoffscreen=false -Djb.vmOptionsFile=/home/alex/Android/ide/as/1.5/bin/studio64.vmoptions -XX:ErrorFile=/home/alex/java_error_in_STUDIO_%p.log -Djb.restart.code=88 -Didea.paths.selector=AndroidStudio1.5 -Didea.platform.prefix=AndroidStudio com.intellij.idea.Main
StartupNotify=false
StartupWMClass=jetbrains-studio
OnlyShowIn=Unity;
X-UnityGenerated=true</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/android-studio-faq">Android Studio知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/android-studio-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu14.04下Eclipse开发环境的搭建</title>
		<link>https://blog.gmem.cc/eclipse-for-ubuntu14</link>
		<comments>https://blog.gmem.cc/eclipse-for-ubuntu14#comments</comments>
		<pubDate>Fri, 23 May 2014 03:28:12 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[CDT]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[PDT]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1399</guid>
		<description><![CDATA[<p>下载软件 Eclipse 4.3.2 http://mirror.bjtu.edu.cn/eclipse/technology/epp/downloads/release/kepler/SR2/eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar.gz JDK 1.7 http://download.oracle.com/otn-pub/java/jdk/8u20-b26/jdk-8u20-linux-x64.tar.gz JDK 1.6 http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin JDK 1.5 http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-linux-amd64.bin 安装软件 [crayon-69d2504b1c28f628268106/] 安装Eclipse插件 参考：Eclipse 4.3.2开发环境搭建，根据需要安装插件。 配置SVN插件需要使用到的JavaHL： [crayon-69d2504b1c293286451320/] Eclipse工作区配置 参考：Eclipse <a class="read-more" href="https://blog.gmem.cc/eclipse-for-ubuntu14">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/eclipse-for-ubuntu14">Ubuntu14.04下Eclipse开发环境的搭建</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">下载软件</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td style="width: 120px;">Eclipse 4.3.2</td>
<td>http://mirror.bjtu.edu.cn/eclipse/technology/epp/downloads/release/kepler/SR2/eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar.gz</td>
</tr>
<tr>
<td>JDK 1.7</td>
<td>http://download.oracle.com/otn-pub/java/jdk/8u20-b26/jdk-8u20-linux-x64.tar.gz</td>
</tr>
<tr>
<td>JDK 1.6</td>
<td>http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin</td>
</tr>
<tr>
<td>JDK 1.5</td>
<td>http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-linux-amd64.bin</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">安装软件</span></div>
<pre class="crayon-plain-tag">#安装JDK，以JDK1.6为例
chmod +x jdk-6u45-linux-x64.bin
./jdk-6u45-linux-x64.bin
mv jdk1.6.0_45/ 1.6
sudo vi /etc/profile
#设置环境变量，添加以下内容
JAVA_HOME=/usr/local/jdk/1.6
export PATH=$JAVA_HOME/bin:$PATH

#安装Eclipse 4.3.2
tar zxvf eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar.gz
sudo mkdir -p ~/ide/eclipse/4.3.2
sudo mv eclipse 4.3.2
sudo mv 4.3.2 ~/ide/eclipse/4.3.2</pre>
<div class="blog_h3"><span class="graybg">安装Eclipse插件</span></div>
<p>参考：<a href="/eclipse-kepler-sr2-setup#install-eclipse-plugins">Eclipse 4.3.2开发环境搭建</a>，根据需要安装插件。</p>
<p>配置SVN插件需要使用到的JavaHL：</p>
<pre class="crayon-plain-tag">sudo apt-get install libsvn-java
#搜索库的位置：
sudo find / -name libsvnjavahl-1.so
#获取搜索结果，例如：/usr/lib/x86_64-linux-gnu/jni/libsvnjavahl-1.so
#将下面一段(.so文件所在目录加入java.lang.path)添加于Eclipse启动参数(eclipse.ini)的-vmargs下面：
-vmargs
-Djava.library.path=/usr/lib/x86_64-linux-gnu/jni</pre>
<div class="blog_h3">Eclipse工作区配置</div>
<p>参考：<a href="/eclipse-kepler-sr2-setup#workspace-config">Eclipse 4.3.2开发环境搭建</a>，完成工作区配置。</p>
<div class="blog_h3">常见问题</div>
<ol>
<li>代码编辑器的悬停框，背景黑色的问题：<br />
<pre class="crayon-plain-tag">sudo vim /usr/share/themes/Ambiance/gtk-2.0/gtkrc
#修改颜色： tooltip_fg_color:#333333、tooltip_bg_color:#F5F5D5</pre>
</li>
<li>C++项目提示无法找到iostream头文件：<br />
<pre class="crayon-plain-tag">#可能原因是没有安装g++
sudo apt-get install g++</pre>
</li>
</ol>
<div class="blog_h3"><span class="graybg">图标制作</span></div>
<pre class="crayon-plain-tag">cd ~/.local/share/applications
vim eclipse-cpp.desktop</pre>
<p>编辑文本，添加以下内容：</p>
<pre class="crayon-plain-tag">[Desktop Entry]
Type=Application
Name=Eclipse CPP
Comment=Eclipse Integrated Development Environment
Icon=/home/alex/CPP/ide/eclipse/4.3.2/eclipse48.png
Exec=/home/alex/CPP/ide/eclipse/4.3.2/eclipse
Terminal=false
Categories=Development;IDE;CPP;
StartupWMClass=Eclipse</pre>
<p>然后：</p>
<pre class="crayon-plain-tag">nautilus ~/.local/share/applications
#拖拽Eclipse CPP到快速启动栏</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/eclipse-for-ubuntu14">Ubuntu14.04下Eclipse开发环境的搭建</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/eclipse-for-ubuntu14/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下安装Samba4</title>
		<link>https://blog.gmem.cc/samba4-under-ubuntu</link>
		<comments>https://blog.gmem.cc/samba4-under-ubuntu#comments</comments>
		<pubDate>Wed, 05 Mar 2014 12:51:07 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[netfs]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1475</guid>
		<description><![CDATA[<p>Samba简介 在90年代初，UNIX机器之间的网络文件系统可以基于NFS协议，Window机器之间的网络文件系统可以基于CIFS协议（目前的Windows已经内置了NFS支持）。Windows和UNIX机器之间无法共享网络文件系统，Samba因此出现。 Samba 是 SMB/CIFS 网络协议的实现, 它作为NFS的补充使得在 Linux 和 Windows 系统中进行文件共享、打印机共享更容易实现。Samba对Linux、DOS、Windows、Mac OS等系统提供客户端支持。 本文中的Samba主要指Samba4服务器软件，它提供AD（活动目录，Active Directory）、文件共享以及打印服务。它支持基于SMB/CIFS、DCE/RPC、LDAP等协议与客户端通信。 安装配置 安装 [crayon-69d2504b1c5a9620778560/] 配置 主配置文件位置：[crayon-69d2504b1c5ad927675731-i/]。修改配置文件后要重启Samba服务器才能生效： [crayon-69d2504b1c5af412699473/] 全局配置 位于[global]端的配置项，是全局性的。每个共享目录都可以覆盖某些全局配置项。 <a class="read-more" href="https://blog.gmem.cc/samba4-under-ubuntu">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/samba4-under-ubuntu">Ubuntu下安装Samba4</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">Samba简介</span></div>
<p>在90年代初，UNIX机器之间的网络文件系统可以基于NFS协议，Window机器之间的网络文件系统可以基于CIFS协议（目前的Windows已经内置了NFS支持）。Windows和UNIX机器之间无法共享网络文件系统，Samba因此出现。</p>
<p>Samba 是 SMB/CIFS 网络协议的实现, 它<span style="background-color: #c0c0c0;">作为NFS的补充</span>使得在 Linux 和 Windows 系统中进行文件共享、打印机共享更容易实现。Samba对Linux、DOS、Windows、Mac OS等系统提供客户端支持。</p>
<p>本文中的Samba主要指Samba4服务器软件，它提供AD（活动目录，Active Directory）、文件共享以及打印服务。它支持基于SMB/CIFS、DCE/RPC、LDAP等协议与客户端通信。</p>
<div class="blog_h1"><span class="graybg">安装配置</span></div>
<div class="blog_h2"><span class="graybg">安装</span></div>
<pre class="crayon-plain-tag">#安装Samba4
sudo apt-get install samba samba-common python-glade2 system-config-samba

# 启动服务
sudo service smbd start</pre>
<div class="blog_h2"><span class="graybg">配置</span></div>
<p>主配置文件位置：<pre class="crayon-plain-tag">/etc/samba/smb.conf</pre>。修改配置文件后要重启Samba服务器才能生效：</p>
<pre class="crayon-plain-tag">sudo service smbd restart</pre>
<div class="blog_h3"><span class="graybg">全局配置</span></div>
<p>位于[global]端的配置项，是全局性的。每个共享目录都可以覆盖某些全局配置项。</p>
<pre class="crayon-plain-tag">[global]
   # Windows NT工作组信息
   workgroup = ZIRCON-GRP
   netbios name = Zircon
   # NT服务器描述信息
   server string = %h server (Samba, Ubuntu)
   
   # 禁止通过DNS搜索NetBIOS名称
   dns proxy = no
   
   # 日志文件路径：%m表示为每个客户端创建日志文件
   log file = /var/log/samba/log.%m
   
   # 是否写入Syslog
   syslog = 0

   # 服务器角色，即Samba的运行模式
   server role = standalone server

   # 把所有不能识别的用户映射为guest
   map to guest = bad user

   # 新创建文件的模式
   create mask = 0755
   # 新创建目录的模式
   directory mask = 0755</pre>
<div class="blog_h3"><span class="graybg">匿名共享目录</span></div>
<pre class="crayon-plain-tag">[Anonymous]
path = /home/alex/Downloads
browsable =yes
writable = yes
# 允许匿名访问
guest ok = yes
read only = no

# 新文件和目录的模式，下面的选项可以全局配置
create mode = 0666
directory mode = 0666 

# 强制新文件的所有者
force user = alex</pre>
<div class="blog_h3"><span class="graybg">认证共享目录</span></div>
<p>首先，创建专门用户：</p>
<pre class="crayon-plain-tag">#创建共享目录
sudo mkdir -p /var/samba/secured
#创建共享目录专用组和用户
sudo addgroup smbgrp
sudo adduser smbuser -ingroup smbgrp
#根据提示输入必要的用户信息

#添加Samba用户，根据提示设置密码，例如smb
sudo smbpasswd -a smbuser

#修改目录权限
cd /var/samba
sudo chmod -R 0770 secured/
sudo chown -R smbuser:smbgrp secured/</pre>
<p>然后，配置Samba </p>
<pre class="crayon-plain-tag">[secured]
path = /var/samba/secured
# 允许访问此目录的用户，@指定组
valid users = @smbgrp
guest ok = no
writable = yes
browsable = yes</pre>
<p>完成上述设置后，即可使用smbuser来访问secured目录。</p>
<div class="blog_h1"><span class="graybg">客户端访问</span></div>
<div class="blog_h2"><span class="graybg">Windows</span></div>
<p>在资源管理器中可以直接访问，例如<pre class="crayon-plain-tag">\\server\Anonymous</pre> ，如果需要身份验证，资源管理器会弹出对话框</p>
<div class="blog_h2"><span class="graybg">Linux</span></div>
<div class="blog_h3"><span class="graybg">访问Samba</span></div>
<p>可以在文件管理器（例如nautilus）中输入<pre class="crayon-plain-tag">smb://server/</pre> 访问</p>
<p>还可以使用命令行：</p>
<pre class="crayon-plain-tag"># 命令格式：
smbclient //server/sharename -U username
# 举例：
smbclient //zircon.local/Anonymous</pre>
<div class="blog_h3"><span class="graybg">访问Windows网络驱动器</span></div>
<p>使用Samba客户端可以直接在Linux中访问Windows网络驱动器（Network Driver），例如：<pre class="crayon-plain-tag">smb://192.168.0.200/d$/</pre> ，输入合法的远程机器用户名、密码即可。</p>
<div class="blog_h3"><span class="graybg">挂载文件系统</span></div>
<p>现代Linux内核自带cifs模块（对于Ubuntu14.04之类的系统，你可以需要到synaptic中搜索cifs-utils、mount.nfs并安装），这是一个特殊的文件系统，用它可以挂载Samba共享目录：</p>
<pre class="crayon-plain-tag"># 命令格式：
mount -t cifs //server/sharename mountpoint
# 举例：
sudo mkdir -p /nas/zircon/Anonymous
sudo chmod 777 /nas/zircon/Anonymous
sudo mount -t cifs //zircon.local/Anonymous /nas/zircon/Anonymous
# 指定用户密码
sudo mount -t cifs //10.0.0.3/tdj_images /tmp/tudouji/images -o username=alex,password=lavender
# 挂载Windows共享目录为读写，由于Linux不理解Windows用户和权限，Windows也不理解UNIX用户，因此你需要指定uid、gid选项，才能保证可读写
sudo mount -t cifs //10.0.0.3/tdj_images /tmp/tudouji/images -o username=alex,password=lavender,rw,uid=alex,gid=alex</pre>
<p>或者修改<pre class="crayon-plain-tag">/etc/fstab</pre> 以便在系统启动时自动挂载：</p>
<pre class="crayon-plain-tag"># 格式：
//server/sharename mountpoint cifs user=user,pass=password 0 0
# 如果没有在NAS上设置任何用户，则：
//server/sharename mountpoint cifs guest,_netdev,uid=curusername 0 0
# 举例
//zircon.local/Anonymous /nas/zircon/Anonymous cifs guest,_netdev,uid=pi 0 0</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/samba4-under-ubuntu">Ubuntu下安装Samba4</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/samba4-under-ubuntu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu知识集锦</title>
		<link>https://blog.gmem.cc/ubuntu-faq</link>
		<comments>https://blog.gmem.cc/ubuntu-faq#comments</comments>
		<pubDate>Sun, 23 Oct 2011 05:17:06 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1389</guid>
		<description><![CDATA[<p>基本知识 名词术语 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（通常看不到，僵尸很快被清理） 串口通信知识 何为串行接口 <a class="read-more" href="https://blog.gmem.cc/ubuntu-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/ubuntu-faq">Ubuntu知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">基本知识</span></div>
<div class="blog_h2"><span class="graybg">名词术语</span></div>
<ol>
<li>PPA：Personal Package Archives，可以上传source，作为apt存储库</li>
<li>APT：Advanced Packaging Tool，Debian GNU/Linux distribution及其变体上进行软件安装/更新/删除的工具，它简化了类linux系统的软件管理，可以进行二进制的安装或者源码编译的安装。最初是设计为pdkg的前端（管理debian的deb包），后来通过 apt-rpm组件支持RPM包</li>
<li>DPKG：dpkg是Debian包管理系统的核心，apt-get、aptitude本质上是调用dpkg</li>
</ol>
<div class="blog_h2"><span class="graybg">进程基本知识</span></div>
<p><strong>进程优先级</strong>：数字越小越高，[+20,-20]<br /> 进程状态<br /> D：不可中断的睡眠（例如I/O导致，处于该状态的进程，只有内核才能将其唤醒）<br /> R：运行中<br /> S：可中断的睡眠，正在等待信号<br /> T：终结的进程<br /> Z：僵尸进程，终止了，但是需要清理kill（通常看不到，僵尸很快被清理）</p>
<div class="blog_h2"><span class="graybg">串口通信知识</span></div>
<div class="blog_h3"><span class="graybg">何为串行接口</span></div>
<p>串行端口（serial port）可以对应计算机的一个<span style="background-color: #c0c0c0;">物理接口</span>：DB9串行接口、DB25串行接口、RJ-45串行接口；或者对应计算中的内置设备：调制解调器、PC卡、USB-串口转换器、扩展坞。</p>
<p>通常计算机包含一个UART（通用异步收发传输器）芯片，但可能没有物理接口（笔记本通常在扩展坞上才有DB-9口）。</p>
<div class="blog_h2"><span class="graybg">常用快捷键</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">快捷键</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>Ctrl + L</td>
<td>在文件管理器（Nautilus）中显示完整路径</td>
</tr>
<tr>
<td>Ctrl + Alt + 方向</td>
<td>切换工作区</td>
</tr>
<tr>
<td>Ctrl + Shift + Alt + 方向</td>
<td>把当前窗口移动到目标工作区</td>
</tr>
<tr>
<td>Ctrl + Alt + L</td>
<td>锁屏，可以改为Super + L</td>
</tr>
<tr>
<td>Alt + F2</td>
<td>搜索</td>
</tr>
<tr>
<td>Ctrl + Alt + F1</td>
<td>进入文字终端界面，类似的可以组合F2-F6</td>
</tr>
<tr>
<td>Ctrl + Alt + F7</td>
<td>切换到GUI终端</td>
</tr>
</tbody>
</table>
<div class="blog_h1">常用配置文件</div>
<div class="blog_h2"><span class="graybg">APT配置文件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">配置文件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>/etc/apt/sources.list</td>
<td>
<p>用来获取软件包的源列表，此配置文件用于支持任意数量的软件源。该文件的每一行对应一个源，最优先的源列在最前面</p>
<p>每一行以“类型”开头，类型包括deb、deb-src等。deb类型典型情况下引用一个两级的Debian archive：distribution/component。其中distribution通常是一个archive名称，例如stable、testing或者是trusty、jessie之类的codename；而component通常可以是main、contrib、non-free等</p>
<p>deb-src类型的格式与deb一样，用于指定源码位置</p>
<p>内容示例：</p>
<pre class="crayon-plain-tag"># 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</pre>
</td>
</tr>
<tr>
<td>/etc/apt/sources.list.d/</td>
<td>额外的源片段</td>
</tr>
<tr>
<td>/etc/apt/apt.conf<br />/etc/apt/apt.conf.d</td>
<td>APT工具包所有命令所共享的主配置文件</td>
</tr>
<tr>
<td>/etc/apt/preferences<br />/etc/apt/preferences.d/</td>
<td>
<p>APT参数配置，用于控制什么版本的包被选择并安装
<p>当源列表中包含某个包的多个distribution时（例如testing、stable），那么一个包的<span style="background-color: #c0c0c0;">多个版本</span>可以被安装，APT会为每个版本分配一个优先级。在保证依赖约束的前提下，apt-get会尝试安装优先级最高的版本。通过该配置文件，我们可以覆盖APT给包授予的默认优先级</p>
<p>当源列表中包含多个源时，某个软件包的<span style="background-color: #c0c0c0;">同一版本</span>可以具有多个实例（来源），这种情况下，apt-get会<span style="background-color: #c0c0c0;">选取源列表中第一个包含目标包</span>的源，该配置文件不会影响此行为</p>
<p>如果此配置文件中没有指定，某个版本的<span style="background-color: #c0c0c0;">默认</span>优先级等于其<span style="background-color: #c0c0c0;">所属的distribution的优先级</span></p>
<p>你可以在apt.conf或者apt-get命令行指定某个distribution为target release，使之获得高优先级，例如：</p>
<pre class="crayon-plain-tag">apt-get install -t testing some-package</pre>
<p>如果target release已经设置，APT使用如下算法来设置包的<span style="background-color: #c0c0c0;">版本对应的优先级</span>：</p>
<ol>
<li>优先级1： 来自那些在Release files中标注了NotAutomatic: yes、没标注ButAutomaticUpgrades: yes的archives（例如Debian<br /> experimental archive）中的版本</li>
<li>优先级100：已经安装的版本；来自那些在Release files中标注了NotAutomatic: yes、ButAutomaticUpgrades: yes的archives（例如Debian backports archive）中的版本</li>
<li>优先级500：未安装的、且不属于target release的版本</li>
<li>优先级990：未安装的、且属于target release的版本</li>
</ol>
<p>如果target release未设置，APT为所有已安装版本授予优先级100、所有未安装版本授予优先级500</p>
</td>
</tr>
<tr>
<td>/var/cache/apt/archives/</td>
<td>获取的软件包的存储位置</td>
</tr>
<tr>
<td>/var/cache/apt/archives/partial/</td>
<td>正在传输中的软件包文件片段</td>
</tr>
<tr>
<td>/var/lib/apt/lists/partial/</td>
<td>传输中的，存储sources.list中每一个包资源的状态信息</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">常用命令</span></div>
<div class="blog_h2"><span class="graybg">dpkg</span></div>
<p>dpkg是安装、构建、管理和移除Debian软件包的工具，更加友好易用的dpkg前端工具是aptitude。该命令的语法如下：</p>
<pre class="crayon-plain-tag">dpkg [option...] action</pre>
<div class="blog_h3"><span class="graybg">常用动作</span></div>
<table class="fixed-word-wrap" style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 25%; text-align: center;">动作</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>安装(-i)</td>
<td>
<p>-i, --install package-file...</p>
<p>安装指定的软件包。如果指定选项-R，则package-file必须是一个目录。安装过程包含以下步骤：</p>
<ol>
<li>抽取新包的控制文件</li>
<li>如果软件包的另外一个版本已经安装在当前系统上，则旧版本的prerm脚本被执行</li>
<li>运行软件包的preinst脚本</li>
<li>解包新的文件，同时备份旧文件</li>
<li>如果软件包的另外一个版本已经安装在当前系统上，则旧版本的postrm脚本被执行</li>
<li>配置软件包</li>
</ol>
</td>
</tr>
<tr>
<td>解包(--unpack)</td>
<td>
<p>--unpack package-file...</p>
<p>解包，但不配置软件包。如果指定选项-R，则package-file必须是一个目录</p>
</td>
</tr>
<tr>
<td>配置(--configure)</td>
<td>
<p>--configure package...|-a|--pending</p>
<p>配置已经解包、尚未配置的软件包。如果参数packge缺失而-a或--pending存在，则所有解包且尚未配置的软件包都被配置</p>
<p>要重新配置已安装的软件包，可以使用dpkg-reconfigure命令</p>
<p>配置过程包括以下步骤：</p>
<ol>
<li>解包配置文件，同时备份旧的配置文件</li>
<li>运行软件包提供的postinst脚本</li>
</ol>
</td>
</tr>
<tr>
<td>移除(-r)和清理(-P)</td>
<td>
<p>-r, --remove, -P, --purge package...|-a|--pending</p>
<p>移除/清理指定的软件包，-r移除除了配置文件以外的所有内容，-P则移除全部内容。移除过程包括以下步骤：</p>
<ol>
<li>运行prerm脚本</li>
<li>移除安装的文件</li>
<li>运行postrm脚本</li>
</ol>
</td>
</tr>
<tr>
<td>验证(-V)</td>
<td>
<p>-V, --verify [package-name...]</p>
<p>通过比较安装路径下的文件和数据库中元信息，验证软件包的完整性，如果不指定package-name则验证所有包的完整性</p>
</td>
</tr>
<tr>
<td>列出软件包(-l)</td>
<td>
<p>-l, --list package-name-pattern...</p>
<p>作为dpkg-query的前端。查询匹配模式的软件包</p>
</td>
</tr>
<tr>
<td>--set-selections</td>
<td>
<p>设置软件包管理的选区，从标准输入读取数据。数据包括两列：软件包名称、安装状态</p>
<p>安装状态可以取值：</p>
<ol>
<li>install  在本次软件包管理事务中，安装此软件包</li>
<li>hold   维持既有状态</li>
<li>deinstall  删除软件包</li>
<li>purge  删除软件包，并清理其遗留的配置文件</li>
</ol>
</td>
</tr>
<tr>
<td>--get-selections</td>
<td>
<p>--get-selections [package-name-pattern...]</p>
<p>列出选区中匹配模式的软件包，如果不指定package-name-pattern则非已安装的软件不被显示。输出两列：软件包名称、安装状态</p>
<pre class="crayon-plain-tag"># 列出选区中名称以ip开头的软件包
sudo dpkg --get-selections  ip* </pre>
</td>
</tr>
<tr>
<td>列出安装的文件(-l)</td>
<td>
<p>-L, --listfiles package-name...
<p>作为dpkg-query的前端。列出指定软件包在当前系统上安装的文件</p>
</td>
</tr>
<tr>
<td>状态(-s)</td>
<td>
<p>-s, --status package-name...</p>
<p>作为dpkg-query的前端。报告指定软件包的状态。可用的状态包括：</p>
<ol>
<li>not-installed 软件包没有安装到当前系统</li>
<li>config-files 仅软件包的配置文件存在于当前系统</li>
<li>half-installed 软件包的安装已经启动，但尚未完成</li>
<li>unpacked 软件包已经解包，尚未配置</li>
<li>half-configured 软件包的配置已经启动，但尚未完成</li>
<li>triggers-awaited 等待触发器处理</li>
<li>triggers-pending 已经被触发</li>
<li>installed 软件包已经安装到当前系统</li>
</ol>
</td>
</tr>
<tr>
<td>搜索文件(-S)</td>
<td>
<p>-S, --search filename-search-pattern...</p>
<p>作为dpkg-query的前端。从已安装的软件包中搜索文件</p>
<p><span style="background-color: #c0c0c0;">示例：</span></p>
<pre class="crayon-plain-tag"># 显示文件所属的软件包
dpkg -S /path/to/file</pre>
</td>
</tr>
<tr>
<td>信息(-p)</td>
<td>
<p>--print-avail package-name...
<p>作为dpkg-query的前端。显示软件包的详细信息</p>
</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">常用选项</span></div>
<ol>
<li>--admindir=dir 设置管理目录，默认/var/lib/dpkg，该目录中包含了软件包状态信息的记录文件</li>
<li>--instdir=dir 设置默认安装目录</li>
<li>-E, --skip-same-version 如果相同版本的软件包已经安装，则不执行安装</li>
<li>--no-debsig 不去尝试校验包的数字签名</li>
<li>--log=filename 记录安装日志到指定文件，默认/var/log/dpkg.log</li>
</ol>
<div class="blog_h2"><span class="graybg">apt-get</span></div>
<p>APT包的管理工具，是aptitude等工具的后端，dpkg的前端。命令格式：</p>
<pre class="crayon-plain-tag">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}
  }</pre>
<div class="blog_h3"><span class="graybg">安装特定版本</span></div>
<p>注意指定目标软件包时，可以在<span style="background-color: #c0c0c0;">包名后面</span>附加<pre class="crayon-plain-tag">=version</pre> 或者<pre class="crayon-plain-tag">/dist</pre> ，从而安装特定版本/从特定源安装：</p>
<pre class="crayon-plain-tag">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</pre>
<div class="blog_h3"><span class="graybg">关于多架构</span></div>
<p>如果你同时安装某个软件包的多种架构（MultiArch），例如libssl1.0.0:i386和libssl1.0.0:amd64，则每个架构的版本必须完全一致。</p>
<div id="apt-get" class="blog_h3"><span class="graybg">子命令说明</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 20%; text-align: center;">子命令</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>install</td>
<td>
<p>下载软件包并安装/升级，目标软件包所直接/间接依赖的软件包也会被一并下载和安装。该命令首先下载并保存文件到本地仓库，因此卸载后再安装不需要重新下载</p>
<p>该命令可以后接多个需要安装的软件包，软件包<span style="background-color: #c0c0c0;">不指定全限定</span>的文件名（例如apt-utils而不是apt-utils_1.0.1ubuntu2.10_amd64.deb），配置文件/etc/apt/sources.list用于定位软件包。</p>
<p>如果某个软件包后面附上一个减号（-），那么软件包将被删除（如果已安装在本系统的话）</p>
<p>如果要安装特定的软件包版本，则使用<pre class="crayon-plain-tag">pkgname=version</pre> 的形式指定软件包，该特性可以用于软件包的降级。</p>
<p>通配符和正则式可以用来指定包名称</p>
</td>
</tr>
<tr>
<td>remove</td>
<td>卸载软件包。配置文件被保留</td>
</tr>
<tr>
<td>purge</td>
<td>
<p>卸载软件包。配置文件也被清除，示例：</p>
<pre class="crayon-plain-tag">sudo apt-get purge libmapnik* mapnik-* python-mapnik #可使用通配符</pre>
</td>
</tr>
<tr>
<td>autoremove</td>
<td>卸载系统中没有用到的软件包</td>
</tr>
<tr>
<td>clean</td>
<td>删除所有下载到本地仓库中的软件包文件，除了</td>
</tr>
<tr>
<td>autoclean</td>
<td>与clean类似，但是只删除哪些不太可能再次被使用的、旧版本的软件包</td>
</tr>
<tr>
<td>source</td>
<td>下载源代码</td>
</tr>
<tr>
<td>build-dep</td>
<td>
<p>安装构建某个软件包必须的所有依赖，示例：
<pre class="crayon-plain-tag">sudo apt-get build-dep gedit</pre>
</td>
</tr>
<tr>
<td>download</td>
<td>下载指定的二进制包到当前目录下</td>
</tr>
<tr>
<td>update</td>
<td>从软件源同步所有软件包的索引信息</td>
</tr>
<tr>
<td>upgrade</td>
<td>升级/etc/apt/sources.list中列出的、当前系统已经安装的全部软件包到最新版本</td>
</tr>
<tr>
<td>check</td>
<td>诊断工具，更新软件包缓存、检查损坏的包依赖关系</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">常用选项</span></div>
<table class=" full-width">
<thead>
<tr>
<td style="width: 35%; text-align: center;">选项</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>--no-install-recommends</td>
<td>不把“推荐的（recommended）”的包作为依赖处理，不下载或安装</td>
</tr>
<tr>
<td>--install-suggests</td>
<td>把“建议的（suggested）”的包作为依赖处理，下载并安装</td>
</tr>
<tr>
<td>-d, --download-only</td>
<td>仅下载软件包，不解压或安装</td>
</tr>
<tr>
<td>--no-download</td>
<td>不去下载软件包，最好和-m联用来强制APT仅使用已经下载到本地仓库的.deb包</td>
</tr>
<tr>
<td>-f, --fix-broken</td>
<td>
<p>尝试修复损坏（冲突）的依赖（APT不允许系统中存在损坏的包依赖关系）。该选项和install/remove子命令联用时，为了推导出可能的解决方案，APT可能忽略任何软件包
<p>有时候该选项不能解决问题，必须手工处理，这意味着你需要使用类似<pre class="crayon-plain-tag">dkpg --remove</pre>  的命令强制删除某些导致依赖破坏的软件包</p>
</td>
</tr>
<tr>
<td>-m, --ignore-missing, --fix-missing</td>
<td>忽略缺失（或者下载后完整性检查失败）的包并继续后续的处理，如果缺失的包是通过命令行指定的（selected），则简单的忽略之</td>
</tr>
<tr>
<td>-q, --quiet</td>
<td>安静模式，不显示进度信息，可以指定值-q=N，N&lt;=2</td>
</tr>
<tr>
<td>-s, --simulate, --just-print, <br />--dry-run, --recon, --no-act</td>
<td>模拟安装，以查看对系统的影响</td>
</tr>
<tr>
<td>-y, --yes, --assume-yes</td>
<td>对所有提问回答“是”</td>
</tr>
<tr>
<td>-u, --show-upgraded</td>
<td>打印所有将被升级的软件包</td>
</tr>
<tr>
<td>-a, --host-architecture</td>
<td>控制<pre class="crayon-plain-tag">apt-get source --compile</pre> 下载与指定体系结构匹配的源码。默认情况下与build-architecture即当前机器的体系结构一致</td>
</tr>
<tr>
<td>-b, --compile, --build</td>
<td>在下载完毕后，编译源代码包</td>
</tr>
<tr>
<td>--no-upgrade</td>
<td>和install子命令联用时，不对既有包进行升级</td>
</tr>
<tr>
<td>--only-upgrade</td>
<td>和install子命令联用时，只进行升级，而不是安装新的软件包</td>
</tr>
<tr>
<td>--force-yes</td>
<td>强制对提示回答“是”，可能损坏系统</td>
</tr>
<tr>
<td>--print-uris</td>
<td>打印下载文件的URL等信息，而不是获取文件并安装</td>
</tr>
<tr>
<td>--no-remove</td>
<td>如果某些软件包需要被移除，立即退出</td>
</tr>
<tr>
<td>--auto-remove</td>
<td>自动移除不需要的依赖，和 autoremove子命令效果相同</td>
</tr>
<tr>
<td>--allow-unauthenticated</td>
<td>允许未验证的包</td>
</tr>
<tr>
<td>--show-progress </td>
<td>显示用户友好的进度信息</td>
</tr>
<tr>
<td>--target-release, --default-release<br />-t=target_release</td>
<td>控制策略引擎的默认输入，为指定的release指定990的优先级</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">apt-cache</span></div>
<p>该命令用于查询APT缓存，它可以对APT包缓存进行一系列的操作。改命令不会改变系统，但可以生成一系列有价值的信息。</p>
<div class="blog_h3"><span class="graybg" style="font-weight: bold;">子命令说明</span></div>
<table class=" full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">子命令</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>gencaches</td>
<td>生成APT包缓存，此命令会被所有需要缓存的命令隐含调用（当缓存不存在或者过期时）</td>
</tr>
<tr>
<td>showpkg pkg...</td>
<td>
<p>显示列出的包的信息，信息包括：</p>
<ol>
<li>可用的版本</li>
<li>反向依赖（reverse dependencies），反向依赖即依赖于pkg...的包</li>
<li>每个版本的正向依赖（forward dependencies），正向依赖即pkg...所依赖的包，正向依赖必须被满足（satisfied）</li>
</ol>
<p>例如<pre class="crayon-plain-tag">apt-cache showpkg libssl-dev</pre> 的输出如下：</p>
<p><pre class="crayon-plain-tag">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:</pre>
</td>
</tr>
<tr>
<td>stat</td>
<td>显示缓存的统计信息 </td>
</tr>
<tr>
<td>showsrc pkg...</td>
<td>显示包对应的源码包的信息 </td>
</tr>
<tr>
<td>dump</td>
<td>显示缓存中所有包的简短列表，主要用于调试 </td>
</tr>
<tr>
<td>umet</td>
<td>打印缓存中所有为满足依赖（unmet dependencies）的概要信息 </td>
</tr>
<tr>
<td>show pkg... </td>
<td>提供类似于<pre class="crayon-plain-tag">dpkg --print-avail</pre> 的功能</td>
</tr>
<tr>
<td>search regex... </td>
<td>在所有可用包上进行全文的正则式检索，打印包名称、描述<br />--full，打印类似于show子命令的信息<br />--names-only，仅打印包名</td>
</tr>
<tr>
<td>depends pkg... </td>
<td>打印包的依赖列表，以及其它所有可能满足依赖的包</td>
</tr>
<tr>
<td>rdepends pkg...</td>
<td>显示包的反向依赖</td>
</tr>
<tr>
<td>pkgnames [prefix]</td>
<td>打印匹配的包名称</td>
</tr>
<tr>
<td>policy [pkg...]</td>
<td>
<p>用于调试和配置文件有关的问题，如果不加参数，它会打印所有源的优先级，否则打印目标包和优先级相关的详细信息</p>
<p>例如<pre class="crayon-plain-tag">apt-cache policy libssl1.0.0</pre> 的输出如下：</p>
<pre class="crayon-plain-tag">libssl1.0.0:
  # 已安装的版本
  Installed: 1.0.1f-1ubuntu2.18
  # 候选版本，不指定版本时，默认安装此版本
  Candidate: 1.0.1f-1ubuntu2.18
# 版本表格，格式：
#  *** &lt;some-version&gt; &lt;minimum-priority-to-consider&gt;
#     &lt;priority-of-this-instance&gt; &lt;repository1&gt;
#     &lt;priority-of-this-instance&gt; &lt;repository2&gt;
#  *** &lt;some-other-version&gt; &lt;minimum-priority-to-consider&gt;
#     &lt;priority-of-this-instance&gt; &lt;repository3&gt;
#     &lt;priority-of-this-instance&gt; &lt;repository4&gt;#
#
  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</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">其它apt命令</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 150px; text-align: center;">命令</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>add-apt-repository</td>
<td>
<p>添加PPA存储库，示例：
<p><pre class="crayon-plain-tag"># 添加存储库
add-apt-repository ppa:mapnik/v2.2.0
# 删除存储库，但不会删除来自此仓库的软件包
add-apt-repository ppa:mapnik/v2.2.0 --remove</pre>
</td>
</tr>
<tr>
<td>ppa-purge</td>
<td>
<p>禁用一个PPA并回退为官方软件包（如果可能的话）。例如你添加了xorg-edgers PPA并且安装Nvidia驱动，当对此PPA执行ppa-purge命令时，不单单会禁用PPA，而且会把Nvidia驱动回复到Ubuntu官方仓库的版本<br />该命令需要安装：<pre class="crayon-plain-tag">sudo apt-get install ppa-purge</pre> 。用法示例：</p>
<pre class="crayon-plain-tag">sudo ppa-purge ppa:otto-kesselgulasch/gimp</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">aptitude</span></div>
<p>该命令是包管理器的高层接口，命令格式如下：
<pre class="crayon-plain-tag"># &lt;options&gt;...表示命令选项
# {}中包含了命令的动作（子命令）
# &lt;packages&gt;... 指定目标包的列表
aptitude [&lt;options&gt;...] {autoclean | clean | forget-new | keep-all | update}

aptitude [&lt;options&gt;...] {full-upgrade | safe-upgrade} [&lt;packages&gt;...]

aptitude [&lt;options&gt;...] {
                            build-dep | build-depends | changelog | download | 
                            forbid-version | hold | install | markauto | purge | 
                            reinstall | remove | show | unhold | unmarkauto | versions
                        } &lt;packages&gt;...
                        
aptitude extract-cache-subset &lt;output-directory&gt; &lt;packages&gt;...

aptitude [&lt;options&gt;...] search &lt;patterns&gt;...

aptitude [&lt;options&gt;...] {add-user-tag | remove-user-tag} &lt;tag&gt; &lt;packages&gt;...

aptitude [&lt;options&gt;...] {why | why-not} [&lt;patterns&gt;...] &lt;package&gt;

aptitude [-S &lt;fname&gt;] [--autoclean-on-startup | --clean-on-startup | -i | -u]

aptitude help</pre>
<div class="blog_h3"><span class="graybg">子命令</span></div>
<p>命令行中第一个不带短横线（-）的参数被作为需要执行的动作看待。</p>
<table class="fixed-word-wrap" style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 20%; text-align: center;">子命令</td>
<td style="text-align: center;">说明 </td>
</tr>
</thead>
<tbody>
<tr>
<td>install</td>
<td>
<p>安装一个或者多个软件包。后面跟着需要安装的软件包的列表，如果某个包名后接~、?字符，则被视为搜索模式，匹配的包都会被安装</p>
<p>如果要选择特定的包版本，使用格式<pre class="crayon-plain-tag">pkgname=version</pre> ；如果要从特定的归档中选择包，使用格式<pre class="crayon-plain-tag">pkgname/archive</pre> ，例如<pre class="crayon-plain-tag">aptitude install apt/experimental</pre> </p>
<p>命令行中指定的包，并不一定必须安装，可以在包名后添加一个指示器，说明需要对包执行的动作：</p>
<ol>
<li>pkgname+ 安装</li>
<li>pkgname+M 安装，并标记其为自动（作为依赖而）安装，如果没有其它包依赖它，该包会被立即自动移除</li>
<li>pkgname- 移除</li>
<li>pkgname_ 移除并清理相关配置文件</li>
<li>pkgname= 设置包为保持状态，取消所有安装、升级、移除动作，并防止该包在未来被自动升级</li>
<li>pkgname: 类似上面，但是不阻止未来的包升级</li>
<li>pkgname&amp;M 标记为已经自动安装</li>
<li>pkgname&amp;m 标记为已经手动安装</li>
</ol>
<p>如果install子命令后面不跟随任何包名，那么所有预定、未决的安装操作会被执行。比如你发起<pre class="crayon-plain-tag">aptitude install foo</pre> 命令后立即终止命令执行，那么后面必须手工<pre class="crayon-plain-tag">aptitude remove foo</pre> 才能取消安装</p>
<p>如果出现依赖冲突，aptitude会提示可选的解决方案，你可以快速的删除冲突依赖包，而不是一个个手工删除</p>
</td>
</tr>
<tr>
<td>remove</td>
<td rowspan="6">
<p>这些命令和intall类似，但是仅对命令指定的包执行相应的动作</p>
<p>hold和keep的区别：前者时包在未来的safe-upgrade/full-upgrade命令中被忽略，keep仅仅取消任何准备对包进行动作</p>
<p>unhold执行和hold相反的操作</p>
<p>举例：</p>
<p><pre class="crayon-plain-tag">#移除所有名字中包含ndeity的包
aptitude remove '~ndeity'</pre>
</td>
</tr>
<tr>
<td>purge</td>
</tr>
<tr>
<td>hold</td>
</tr>
<tr>
<td>unhold</td>
</tr>
<tr>
<td>keep</td>
</tr>
<tr>
<td>reinstall</td>
</tr>
<tr>
<td>markauto</td>
<td rowspan="2">标记包为自动/手工安装</td>
</tr>
<tr>
<td>unmarkauto</td>
</tr>
<tr>
<td>build-depends</td>
<td rowspan="2">满足一个包的构建时依赖（build-dependencies）</td>
</tr>
<tr>
<td>build-dep</td>
</tr>
<tr>
<td>forbid-version</td>
<td>禁止某个包升级到特定的版本</td>
</tr>
<tr>
<td>update</td>
<td>升级软件包列表信息，等价于<pre class="crayon-plain-tag">apt-get update</pre> </td>
</tr>
<tr>
<td>safe-upgrade</td>
<td>
<p>升级已安装软件包到它们的最新版本。已安装的包不会被移除，除非它们已经不被使用</p>
<p>如果不指定包名，则尝试升级所有软件包</p>
<p>有时候为了升级某个软件包，需要移除另外一个包，这种情况下必须使用full-upgrade</p>
</td>
</tr>
<tr>
<td>full-upgrade</td>
<td>类似上面，更加激进的进行升级</td>
</tr>
<tr>
<td>keep-all</td>
<td>取消针对所有包的、已计划的（scheduled）动作</td>
</tr>
<tr>
<td>search</td>
<td>
<p>搜索匹配模式的软件包，匹配命令行中任意模式的软件包被打印</p>
<pre class="crayon-plain-tag">#搜索名称中包含edit的任何“新”包
aptitude search '~N' edit</pre>
</td>
</tr>
<tr>
<td>show</td>
<td>
<p>显示软件包的详细信息
<p><pre class="crayon-plain-tag">aptitude show ibus-pinyin</pre>
</td>
</tr>
<tr>
<td>versions</td>
<td>显示指定软件包的版本信息</td>
</tr>
<tr>
<td>why</td>
<td rowspan="2">解释特定软件包需要被安装、移除的原因</td>
</tr>
<tr>
<td>why-not</td>
</tr>
<tr>
<td>clean</td>
<td>删除所有先前下载到本地仓库的.deb文件</td>
</tr>
<tr>
<td>autoclean</td>
<td>与clean类似，但是只删除哪些不太可能再次被使用的、旧版本的软件包</td>
</tr>
<tr>
<td>changelog</td>
<td>下载并显示指定源码/二进制包的Debian changelog</td>
</tr>
<tr>
<td>download</td>
<td>下载软件包到当前目录</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">常用选项</span></div>
<ol>
<li>--allow-untrusted 允许不加提示的安装来自不受信源的软件</li>
<li>-D, --show-deps 对于那些会安装/移除软件包的子命令，该选项显示自动安装/移除的简要说明</li>
<li>-d, --download-only 仅仅下载软件包，而不安装/移除。软件包默认存放在<pre class="crayon-plain-tag">/var/cache/apt/archives</pre> </li>
<li>-s, --simulate 模拟安装过程</li>
<li>--schedule-only 对于修改包状态的那些命令，该选项会计划操作在未来进行，本次命令不会立即执行</li>
<li>-V, --show-versions 显示被安装软件包的版本</li>
<li>-v, --verbose 导致show等子命令显示更多信息</li>
<li>-y, --assume-yes 对所有提示回答“是</li>
</ol>
<div class="blog_h2"><span class="graybg">checkinstall</span></div>
<p>跟踪软件的安装过程，并依此创建一个Deb包：</p>
<pre class="crayon-plain-tag"># 监控 make install，生成Deb包
sudo checkinstall -D --fstrans=no make install</pre>
<div class="blog_h2"><span class="graybg"><a id="ufw"></a>ufw</span></div>
<p>所谓UFW（Uncomplicated Firewall，非复杂的防火墙），是iptables的前端，使用它可以降低iptables的使用复杂度。</p>
<div class="blog_h3"><span class="graybg">安装</span></div>
<p>要安装、启/禁UFW，参考下面的命令：</p>
<pre class="crayon-plain-tag">sudo apt-get install ufw
# 查看ufw的状态，inactive表示被禁用
sudo ufw status
# （在系统启动时）启用或者禁用
sudo ufw enable
sudo ufw disable
# 重新加载配置文件
sudo ufw reload</pre>
<p>查看UFW中的规则：</p>
<pre class="crayon-plain-tag">sudo ufw status verbose
# 下面的是默认规则的：禁止入站连接，允许出站连接，禁用路由功能
# Status: active
# Logging: on (low)
# Default: deny (incoming), allow (outgoing), disabled (routed)

# 在规则签名显示序号
sudo ufw status numbered</pre>
<p>设置日志级别：</p>
<pre class="crayon-plain-tag"># 启用日志，日志记录在 /var/log/ufw.log
ufw logging on
# 禁用日志
ufw logging off
# 设置日志级别，默认low，可用值： off low medium high full
ufw logging low</pre>
<div class="blog_h3"><span class="graybg">配置文件</span></div>
<p>你可以修改/etc/default/ufw文件，来定制ufw的默认行为</p>
<div class="blog_h3"><span class="graybg">规则设置命令</span></div>
<p>ufw的大部分命令格式都支持<pre class="crayon-plain-tag">--dry-run</pre> 选项，表示仅仅显示命令执行的效果，但是不改变现有系统。</p>
<p>设置默认策略：</p>
<pre class="crayon-plain-tag"># 默认 允许|禁止|回绝（提出提示） 入站|出站|路由 数据包
ufw  default allow|deny|reject [incoming|outgoing|routed]</pre>
<p>插入/删除一条规则：</p>
<pre class="crayon-plain-tag"># 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 </pre>
<p>重置规则到安装时的状态：</p>
<pre class="crayon-plain-tag">ufw reset</pre>
<p>规则设置举例：</p>
<pre class="crayon-plain-tag"># 允许访问本机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</pre>
<div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h2"><span class="graybg">16.04相关</span></div>
<div class="blog_h3"><span class="graybg">无法自动连接到隐藏Wifi</span></div>
<p>这是个已知的问题，临时解决方案：</p>
<pre class="crayon-plain-tag">nmcli c up id 'dangdang-ydgw'</pre>
<div class="blog_h2"><span class="graybg">MATE相关</span></div>
<div class="blog_h3"><span class="graybg">如何重置面板</span></div>
<pre class="crayon-plain-tag">mate-panel --reset</pre>
<div class="blog_h2"><span class="graybg">安装NVIDIA官方驱动</span></div>
<p>按Ctrl + Alt + F1，进入文本界面，执行</p>
<pre class="crayon-plain-tag"># 停止此服务
sudo service lightdm stop
# 安装驱动
sudo ./NVIDIA-Linux-x86_64-361.28.run

# 删除驱动
sudo /usr/bin/nvidia-uninstall
# 或者
sudo apt-get install autoremove --purge nvidia*</pre>
<div class="blog_h2"><span class="graybg">修改grub和Splash分辨率</span></div>
<p>执行<pre class="crayon-plain-tag">sudo gedit /etc/default/grub</pre> 编辑配置文件：</p>
<pre class="crayon-plain-tag"># 让等待时间缩短一些
GRUB_TIMEOUT=3

# 设置为显示器标准分辨率
GRUB_GFXMODE=1920x1080
# 添加下面一行
GRUB_GFXPAYLOAD_LINUX=keep</pre>
<p>保存后，执行<pre class="crayon-plain-tag">sudo update-grub</pre> 更新grub。</p>
<p>执行<pre class="crayon-plain-tag">sudo gedit /etc/initramfs-tools/conf.d/splash</pre> 编辑配置文件：</p>
<pre class="crayon-plain-tag">echo FRAMEBUFFER=y &gt; /dev/null</pre>
<p>保存后，执行<pre class="crayon-plain-tag">sudo update-initramfs -u</pre> 。重启后生效。</p>
<div class="blog_h2"><span class="graybg">记住显示器亮度</span></div>
<pre class="crayon-plain-tag">sudo apt-get install xbacklight
#设置亮度，可以指定0-100
xbacklight -set 80</pre>
<div class="blog_h2"><span class="graybg">一致性网络设备命名</span></div>
<p>所谓一致性网络设备命名（consistent network device naming），是Linux下以太网设备命名的约定规则，用来替换老旧的eth*命名风格。后者存在的问题是，由于内核发现网卡的顺序可能发生变化，这导致以太网设备的名称序号也随着改变。</p>
<p>某些操作系统版本默认启用了一致性网络设备命名，要改变此行为，可以：</p>
<ol>
<li>修改文件vim /etc/default/grub，设置内核参数：<pre class="crayon-plain-tag">GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"</pre> </li>
<li>执行<pre class="crayon-plain-tag">update-grub</pre> 并重启</li>
</ol>
<p>重启后，以太网卡的命名风格变成传统的eth0*</p>
<div class="blog_h2"><span class="graybg">网络管理器提示：device not managed</span></div>
<pre class="crayon-plain-tag">sudo gedit /etc/NetworkManager/NetworkManager.conf
#修改如下一行
#[ifupdown]
#managed=true   默认值为false

sudo service network-manager restart</pre>
<div class="blog_h2"><span class="graybg">如何查看正在使用的DNS</span></div>
<pre class="crayon-plain-tag">nmcli dev list iface wlan1 | grep IP4
# 或者
nm-tool | grep DNS </pre>
<div class="blog_h2"><span class="graybg">启动显示waiting an additional 60 seconds for network configuration</span></div>
<p>除了启动时耗时外，还会出现通知区域的网络图标消失的问题。原因可能是因为<pre class="crayon-plain-tag">/etc/network/interfaces</pre> 配置了多于1个的<pre class="crayon-plain-tag">gateway</pre> 导致</p>
<div class="blog_h2"><span class="graybg">安装中文输入法</span></div>
<ol>
<li>打开System Settings - Text Entry，添加中文输入法ibus-pinyin</li>
<li>打开终端，输入ibus-setup，Show property panel 设置为 Do not show</li>
<li>nautilus /usr/share/ibus-pinyin/icons/ 该目录为ibus-pinyin的图标文件，可以进行美化</li>
<li>如果输入混乱，可以执行：ibus-daemon -drx并重启</li>
</ol>
<div class="blog_h2"><span class="graybg">如何安装一系列字体</span></div>
<pre class="crayon-plain-tag"># 修改新字体所在目录的文件模式
sudo chmod -R 777  /usr/share/fonts/windows
cd /usr/share/fonts/windows
# 创建元数据目录
sudo mkfontscale
sudo mkfontdir
# 刷新字体缓存
sudo fc-cache -fv </pre>
<div class="blog_h2"><span class="graybg">修正安装中文支持后字体变为楷体的问题</span></div>
<p>移除系统添加的字体即可解决。</p>
<pre class="crayon-plain-tag">sudo apt-get remove fonts-arphic-ukai fonts-arphic-uming</pre>
<div class="blog_h2"><span class="graybg">在VMware下，如何切换Console和GUI</span></div>
<p>进入字符界面 Ctrl + Alt + Space，Space松开，按F1<br /> 进入图形界面 Ctrl + Alt + Space，Space松开，按F7</p>
<div class="blog_h2"><span class="graybg">安装VMwareTools</span></div>
<p>首先在VMware菜单中选择安装VMware Tools，然后复制挂载光驱中的压缩包，执行perl文件。</p>
<pre class="crayon-plain-tag">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
#遇到提示一律回车，完成后重启</pre>
<div class="blog_h2"><span class="graybg"><a id="add-modeline"></a>自定义显示模式</span><output name="Virtual1"></output></div>
<div class="blog_h3"><span class="graybg">通过命令行添加</span></div>
<pre class="crayon-plain-tag"># 以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</pre>
<div class="blog_h3"><span class="graybg">持久化显示模式设置（方法一）</span></div>
<pre class="crayon-plain-tag">xrandr --newmode "1600x900" 1837.25 1600 1760 1936 2272 900 903 908 1348 -hsync +vsync
xrandr --addmode Virtual1 1600x900
xrandr --output Virtual1 --mode 1600x900</pre>
<div class="blog_h3"><span class="graybg">持久化显示模式设置（方法二） </span></div>
<p>新建或修改文件：</p>
<pre class="crayon-plain-tag">xrandr --newmode "1600x900" 1837.25 1600 1760 1936 2272 900 903 908 1348 -hsync +vsync
xrandr --addmode Virtual1 1600x900
xrandr --output Virtual1 --mode 1600x900</pre>
<p>执行命令：<pre class="crayon-plain-tag">chmod +x /etc/lightdm/lightdm-setup</pre> </p>
<p>新建或修改lightdm（Ubuntu下的显示管理器）的配置文件：</p>
<pre class="crayon-plain-tag"># 添加下面的内容
display-setup-script=/etc/lightdm/lightdm-setup</pre>
<p>该方法在Ubuntu MATE 16.04下测试通过。</p>
<div class="blog_h2"><span class="graybg">解决包依赖问题</span></div>
<p>有时在安装软件包时会遇到unmet dependencies提示，要解决此类问题，可以参考：</p>
<pre class="crayon-plain-tag">#移除并清理指定软件包的配置文件，打开所有强制选项
#可以用该命令删除系统中既有的不匹配的依赖包版本
sudo dpkg --purge --force-all pkgname

#尝试自动纠正系统中损坏的依赖关系（broken dependencies），该命令可以不指定pkgname
sudo apt-get -f install

#查看某个软件包的可用版本
sudo apt-cache showpkg pkgname

#安装指定版本的软件包
#该命令可以强制覆盖已安装版本
sudo aptitude install pkgname=pkgversion</pre>
<p> 通过以上四个命令，然后在系统提示unmet dependencies时步步跟踪，即可解决依赖关系问题，具体例子如下：</p>
<pre class="crayon-plain-tag">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</pre>
<div class="blog_h2"><span class="graybg">sudo免密码</span></div>
<p>执行<pre class="crayon-plain-tag">sudo visudo</pre> 修改文件：</p>
<pre class="crayon-plain-tag"># alex免密码
alex ALL=(ALL) NOPASSWD: ALL
# admin组的成员免密码
%admin ALL=(ALL) NOPASSWD: ALL</pre>
<div class="blog_h2"><span class="graybg">ssh免密码</span></div>
<p>客户端的公钥需要放到服务器的<pre class="crayon-plain-tag">~/.ssh/authorized_keys</pre>中，需要注意文件模式：</p>
<pre class="crayon-plain-tag"># 服务器端
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys</pre>
<p>仍然无法免密码登陆，修改/etc/ssh/sshd_config并重启SSH服务：</p>
<pre class="crayon-plain-tag"># 此项的默认值为yes
StrictModes no</pre>
<div class="blog_h2"><span class="graybg">挂载NTFS相关选项</span></div>
<p>打开Disks，可以添加挂载选项：</p>
<p>hide_hid_files，隐藏NTFS的隐藏文件<br />windows_names，仅允许Windows下合法的文件名<br />show_sys_files，显示系统文件<br />hide_dot_files，隐藏点号开头的文件</p>
<div class="blog_h2"><span class="graybg">无法进入Grub</span></div>
<p>现象：开机后，BIOS通过后就自动重启。</p>
<p>原因：在我的机器上，此问题是因为错误的使用分区工具，导致引导扇区出错导致。</p>
<div class="blog_h3"><span class="graybg">修复Grub</span></div>
<p>解决上述问题的方法是：</p>
<ol>
<li>使用Ubuntu启动U盘进入系统</li>
<li>执行：<br />
<pre class="crayon-plain-tag">sudo apt-add-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair
boot-repair</pre>
</li>
</ol>
<p>执行boot-repair会弹出一个图形界面，根据提示进行操作。</p>
<div class="blog_h3"><span class="graybg">修复Windows</span></div>
<p>在多硬盘（每硬盘对应一个OS，相互独立）的机器上，执行上述操作后，可能出现Windows系统无法启动的情况。这是因为boot-repair把修改了所有硬盘的启动扇区导致。可以使用下面的命令证实这一点：</p>
<pre class="crayon-plain-tag">sudo dd bs=512 count=1 if=/dev/sda  2&gt;/dev/null | strings
# ZRr=
# `|f	
# \|f1
# GRUB           # GRUB
# Geom
# Hard Disk
# Read
#  Error </pre>
<p>解决办法，使用工具恢复Windows所在磁盘的主引导记录：</p>
<pre class="crayon-plain-tag">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&gt;/dev/null | strings
# RPf1
# Missing operating system.
# f`f1
# |fRfP
# Ht[y9Y[
# Multiple active partitions.
# Operating system load error.</pre>
<div class="blog_h2"><span class="graybg">进入恢复模式</span></div>
<p>开机后按住Shift键，进入GRUB启动菜单，依次选择：<br /> Advanced options for Ubuntu<br /> Ubuntu, With Linux 3.13.0-32-generic (recovery mode)<br /> 等待一会后，选择倒数第二项：</p>
<p><a href="/wp-content/uploads/2011/10/ubuntu-recover-mode-1.jpg"><img class="aligncenter" src="https://blog.gmem.cc/wp-content/uploads/2011/10/ubuntu-recover-mode-1.jpg" alt="ubuntu-recover-mode-1" width="558" height="286" /></a><br /> 在shell中输入：</p>
<pre class="crayon-plain-tag">#挂载读写文件系统
mount -o remount,rw /</pre>
<p>即可以root权限进行维护。</p>
<div class="blog_h2"><span class="graybg">以root身份通过GUI浏览文件</span></div>
<pre class="crayon-plain-tag">sudo nautilus&amp;</pre>
<div class="blog_h2"><span class="graybg">禁止Chrome自动升级</span></div>
<pre class="crayon-plain-tag">cd /etc/apt/sources.list.d
sudo mv google-chrome.list google-chrome.list.save</pre>
<div class="blog_h2"><span class="graybg">设置时区</span></div>
<pre class="crayon-plain-tag">#运行以下命令，根据提示进行设置
dpkg-reconfigure tzdata</pre>
<div class="blog_h2"><span class="graybg">彻底清空命令历史</span></div>
<pre class="crayon-plain-tag">cat /dev/null &gt; ~/.bash_history &amp;&amp; history -c &amp;&amp; exit</pre>
<div class="blog_h2"><span class="graybg">新窗口屏幕居中</span></div>
<pre class="crayon-plain-tag">#安装软件：
sudo apt-get install compizconfig-settings-manager</pre>
<p>完毕后，打开 CompizConfig Settings Manager ，定位到Window Management - Place Window，设置Placement Mode为Centered</p>
<div class="blog_h2"><span class="graybg">安装.deb包</span></div>
<pre class="crayon-plain-tag">sudo dpkg -i path/name.deb</pre>
<div class="blog_h2"><span class="graybg">修改主机名称</span></div>
<p>临时修改主机名称：</p>
<pre class="crayon-plain-tag">sudo hostname new-name</pre>
<p>永久修改主机名称：编辑文件/etc/hostname<br /> 编辑：/etc/hosts 修改 127.0.1.1对应的域名</p>
<div class="blog_h2"><span class="graybg">支持Zeroconf</span></div>
<p>执行下面的命令安装Avahi即可，Avahi是Zeroconf规范的开源实现：</p>
<pre class="crayon-plain-tag">sudo apt-get install avahi-daemon avahi-dnsconfd avahi-discover avahi-utils libnss-mdns
sudo reboot</pre>
<div class="blog_h2"><span class="graybg">刷空DNS缓存</span></div>
<pre class="crayon-plain-tag">#安装DNS缓存守护服务 Name Service Cache Daemon
apt-get install nscd
#重新启动
service nscd restart</pre>
<div class="blog_h2"><span class="graybg">su: Authentication failure</span></div>
<pre class="crayon-plain-tag">#需要重设密码：
sudo passwd root</pre>
<div class="blog_h2"><span class="graybg">清空ROOT的回收站</span></div>
<pre class="crayon-plain-tag">sudo apt-get install trash-cli 
sudo trash-empty</pre>
<div class="blog_h2"><span class="graybg">PPTP客户端配置</span></div>
<p>需要根据PPTP服务器的设定进行配置，如果连接失败，可以查看/var/log/syslog，下图是一个配置示例：</p>
<p><img class="aligncenter size-full wp-image-5976" src="https://blog.gmem.cc/wp-content/uploads/2011/10/pptp.png" alt="pptp" width="411" height="613" /></p>
<div class="blog_h2"><span class="graybg">L2TP客户端支持</span></div>
<pre class="crayon-plain-tag">#安装集成到Ubunt网络管理器的L2TP支持
sudo apt-add-repository ppa:seriy-pr/network-manager-l2tp
sudo apt-get update
sudo apt-get install network-manager-l2tp-gnome</pre>
<p>L2TP客户端的设置，参考PPTP，注意IPsec Settings的Pre-shared Key要填写预共享密钥。</p>
<div class="blog_h2"><span class="graybg">VPN频繁断开</span></div>
<p><span class="graybg">现象：日志显示short read (-1): Message too long</span></p>
<p>原因：ppp接口的MTU1400，eth为1500，而traceroute发现网络最大MTU为1382</p>
<p>解决：<pre class="crayon-plain-tag">sudo ifconfig eth0 mtu 1380</pre></p>
<div class="blog_h2"><span class="graybg">修改应用程序图标</span></div>
<p>大部分应用程序的桌面图标定义在<pre class="crayon-plain-tag">/usr/share/applications/*.desktop</pre> 文件中。当前用户个人的应用程序定义</p>
<p>在<pre class="crayon-plain-tag">~/.local/share/applications/*.desktop</pre> 文件中，编辑这些文件，修改Icon字段，即可改变图标</p>
<div class="blog_h2"><span class="graybg">隐藏工作区切换图标</span></div>
<p>安装dconf-editor，在com.canonical.unity.launcher.favorites字段中，删除unity://expo-icon</p>
<div class="blog_h2"><span class="graybg">无线网卡作为Hotspot</span></div>
<ol>
<li>网络管理器 ⇨ Edit Connections，弹出的窗口中点击Add</li>
<li>添加一个Wi-Fi类型的连接，填写好字段。注意IPv4 Settings中，Method选择Shared to other computers保存</li>
<li>打开文件<pre class="crayon-plain-tag">/etc/NetworkManager/system-connections/新创建的连接名称</pre> ，修改<pre class="crayon-plain-tag">mode=ap</pre> </li>
<li>网络管理器 ⇨ Connect to hidden Wi-Fi network，选择新创建的连接，点击Connect</li>
<li>其他机器现在可以连接到热点 了</li>
</ol>
<div class="blog_h2"><span class="graybg"><a id="infinality"></a>使用Infinality进行字体渲染</span></div>
<pre class="crayon-plain-tag">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</pre>
<div class="blog_h2"><span class="graybg">双系统共享蓝牙</span></div>
<p>同一台机器安装Ubuntu 20.04、Windows 10双系统，分别与蓝牙设备配对后，只有最后配对的系统才能访问鼠标，切换系统后需要重新配对。解决此问题的步骤如下：</p>
<ol>
<li>Windows执行配对</li>
<li>Ubuntu执行配对，然后打开配置文件 /var/lib/bluetooth/蓝牙适配器MAC/目标蓝牙设备MAC，获取密钥：<br />
<pre class="crayon-plain-tag">; ...
[LinkKey]
; 记住这个密钥
Key=9E438CF7CED4F8D80E6FB46B29468575
Type=4
PINLength=0</pre>
</li>
<li>切换到Windows系统，以系统管理员身份打开cmd.exe，执行<pre class="crayon-plain-tag">psexec -s -i regedit</pre> 打开注册表</li>
<li>定位到注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\，修改对应设备的安全码为linkkeys中的安全码，例如：<br />
<pre class="crayon-plain-tag">rem 修改 f065dd9b9784的二进制值
rem 可以退格键删除所有内容，然后依次输入16进制数9E 43 8C F7 CE D4 F8 D8 0E 6F B4 6B 29 46 85 75</pre>
</li>
<li>在Windows下尝试连接蓝牙</li>
</ol>
<div class="blog_h2"><span class="graybg">恢复acpi-cpufreq</span></div>
<p>要禁用Ubuntu 16.04的intel_pstate，恢复acpi-cpufreq，可以：</p>
<pre class="crayon-plain-tag">sudo apt-get install acpi-support acpid acpi</pre>
<p>然后编辑/etc/default/grub：</p>
<pre class="crayon-plain-tag">GRUB_CMDLINE_LINUX_DEFAULT="... intel_pstate=disable"</pre>
<p>执行<pre class="crayon-plain-tag">sudo update-grub</pre>并重启即可。 </p>
<div class="blog_h2"><span class="graybg">使用蓝牙4.0</span></div>
<p>最近买了阿米洛的蓝牙机械键盘，结果Ubuntu不能识别。到网上搜索一下，发现需要升级Bluez到5.x版本，并且必须使用Blueman代替Gnome的蓝牙管理器。</p>
<p>执行如下命令安装：</p>
<pre class="crayon-plain-tag">#安装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</pre>
<p>完毕后，重启，即可使用Blueman连接蓝牙键盘了。存在两个问题需要解决：</p>
<ol>
<li>每次开机后，蓝牙适配器总是关闭的。Blueman没有提供相关的设置项，需要修改Bluez的配置文件：<br />
<pre class="crayon-plain-tag">AutoEnable=true</pre>
</li>
<li>无法正常关机，卡死在Splash屏上。出现这个现象的原因，在我机器上是bluetoothd无法正常终结，可以写一个关机脚本强制终结：<br />
<pre class="crayon-plain-tag">sudo /usr/bin/pkill -9 bluetoothd</pre>
</li>
</ol>
<div class="blog_h2"><span class="graybg">ibus-pinyin和Eclipse快捷键冲突</span></div>
<p>目前（1.5.0）版本的ibus-pinyin没有提供设置项，可以<a href="https://github.com/phuang/ibus-pinyin">修改源码</a>：</p>
<pre class="crayon-plain-tag">/* Toggle simp/trad Chinese Mode when hotkey Ctrl + Shift + F pressed */
if (keyval == IBUS_F &amp;&amp; scmshm_test (modifiers, (IBUS_SHIFT_MASK | IBUS_CONTROL_MASK))) {
    //m_props.toggleModeSimp ();
    m_prev_pressed_key = IBUS_F;
    return FALSE; //去除此快捷键的处理代码
}</pre>
<p>修改后，重新构建ibus-pinyin并安装：</p>
<pre class="crayon-plain-tag">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 &gt;= 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</pre>
<div class="blog_h2"><span class="graybg">ibus-pinyin输文本丢失</span></div>
<p>ibus-pinyin还有一个严重问题，在Chrome/Firefox中，经常自动删除已经输入的文本。可以改用ibus-libpinyin。下面是安装步骤：</p>
<pre class="crayon-plain-tag">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 &amp;&amp; sudo make install

cd ..
git clone https://github.com/libpinyin/ibus-libpinyin.git
cd ibus-libpinyin
./autogen.sh --prefix=/usr
make &amp;&amp; sudo make install</pre>
<p>ibus-libpinyin同样存在Ctrl+Shift+F冲突问题，可以修改源码：</p>
<pre class="crayon-plain-tag">//从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;
    }</pre>
<div class="blog_h2"><span class="graybg">挂载内存磁盘</span></div>
<pre class="crayon-plain-tag"># 创建挂载目录
mkdir /mnt/ramdisk
# 通过命令挂载
mount -t tmpfs -o size=4096M tmpfs /mnt/ramdisk</pre>
<p>也可以修改fstab，在启动时自动挂载：</p>
<pre class="crayon-plain-tag">tmpfs       /mnt/ramdisk tmpfs   nodev,nosuid,noexec,nodiratime,size=4096M   0 0</pre>
<div class="blog_h2"><span class="graybg">改变交换文件大小</span></div>
<pre class="crayon-plain-tag"># 关闭交换文件功能
sudo swapoff -a
# 修改交换文件大小
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
# 重新启用交换文件功能
sudo mkswap /swapfile
sudo swapon /swapfile</pre>
<div class="blog_h2"><span class="graybg">使用单独交换分区</span></div>
<p>如果你正在使用交换文件，可以创建一个交换分区，然后：</p>
<pre class="crayon-plain-tag"># 获取交换分区的设备名
cat /etc/fstab | grep swap
# swap was on /dev/sdc5 during installation

sudo swapoff -a
sudo mkswap /dev/sdc5
sudo swapon /dev/sdc5</pre>
<div class="blog_h2"><span class="graybg">交换分区不生效</span></div>
<p>在fstab中配置好交换分区后，应该就能生效，如果不生效，可能是UUID填写错误：</p>
<pre class="crayon-plain-tag">UUID=e000bd2d-8ddd-4124-8e45-50ec2e086cca none            swap    sw              0       0</pre>
<p>可以使用<pre class="crayon-plain-tag">sudo blkid</pre> 查到交换分区真实的UUID，修改fstab文件，然后重启即可。 </p>
<div class="blog_h2"><span class="graybg">配置反转SSH隧道</span></div>
<p>利用反转SSH隧道（Reverse SSH Tunnel）技术，可以让你从互联网来访问隐藏在防火墙后面的（内网）机器。</p>
<p>下面用一个实际的例子来说明如何配置反转SSH隧道。在这个例子中，外网机器vpn.gmem.cc，登陆用户为root，位于内网机器不具有公共地址，登陆用户为pi。两台机器均使用公钥验证。</p>
<div class="blog_h3"><span class="graybg">外网机器配置</span></div>
<pre class="crayon-plain-tag">AllowTcpForwarding yes 
TCPKeepAlive yes</pre>
<div class="blog_h3"><span class="graybg">内网机器配置</span></div>
<pre class="crayon-plain-tag">#!/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</pre>
<p>可以修改/ect/rc.local，开机执行上述脚本。</p>
<div class="blog_h3"><span class="graybg">反向连接到内网</span></div>
<p>在外网机器执行：<pre class="crayon-plain-tag">ssh -p 62222 -i ~/documents/puTTY/gmem.key pi@localhost</pre> </p>
<div class="blog_h3"><span class="graybg">更新字体缓存</span></div>
<pre class="crayon-plain-tag">fc-cache -f -v</pre>
<div class="blog_h2"><span class="graybg">保存iptables设置</span></div>
<pre class="crayon-plain-tag">sudo apt-get install iptables-persistent

# 保存当前设置
sudo /etc/init.d/iptables-persistent save 
# 加载已保存的设置
sudo /etc/init.d/iptables-persistent reload</pre>
<p>或者：</p>
<pre class="crayon-plain-tag"># 保存设置到任意文件
sudo iptables-save &gt; /etc/network/iptables.rules
# 从先前保存的文件中加载
pre-up iptables-restore &lt; /etc/network/iptables.rules</pre>
<p>你可以在网络启动的时候自动加载iptables设置：</p>
<pre class="crayon-plain-tag">iface eth0 inet static
        ....
        pre-up /etc/init.d/iptables-persistent reload</pre>
<div class="blog_h2"><span class="graybg">SSH无法通过root登陆</span></div>
<p>报错：Permission denied, please try again.</p>
<p>查看/var/log/auth.log，提示：Failed password for root from 192.168.0.89 port 39275 ssh2</p>
<p>解决办法：修改配置文件</p>
<pre class="crayon-plain-tag"># 把下面这一行
PermitRootLogin without-password
# 改为：
PermitRootLogin yes</pre>
<p>然后重启SSH服务： <pre class="crayon-plain-tag">sudo service ssh restart</pre> </p>
<div class="blog_h2"><span class="graybg">从登陆列表隐藏用户</span></div>
<p>最简单的办法，是把用户的UID设置为小于500的数字：</p>
<pre class="crayon-plain-tag">sudo usermod -u 125 kurento
sudo groupmod -g 133 kurento</pre>
<div class="blog_h2"><span class="graybg">配置网桥</span></div>
<p><a href="/network-faq#bridging">网桥</a>能够把两个<span style="background-color: #c0c0c0;">以太网卡</span>（例如eth0、eth1）桥接在一起，当两个以太网被桥接到一起后，两个网络合并为单个更大的网络。</p>
<p>要在Ubuntu下配置网桥，可以执行以下步骤：</p>
<div class="blog_h3"><span class="graybg">安装bridge-utils</span></div>
<pre class="crayon-plain-tag">sudo apt-get update
sudo apt-get install bridge-utils</pre>
<p>安装此软件后，你就可以在/etc/network/interfaces中，像配置普通网卡一样，配置网桥了。</p>
<div class="blog_h3"><span class="graybg">自动创建网桥</span></div>
<p>你可以通过配置文件，在系统启动后自动创建网桥：</p>
<pre class="crayon-plain-tag">auto br0
iface br0 inet dhcp
  # 该网桥链接的以太网
  bridge_ports eth0 eth1
  bridge_stp off
  bridge_fd 0
  # 系统等待以太网port启动的最大时间，0表示不等待
  bridge_maxwait 0</pre>
<p>你也可以为网桥指定静态IP：</p>
<pre class="crayon-plain-tag">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</pre>
<p>使用DHCP时，分配给网桥会被分配一个IP地址，该地址和被桥接的两个网卡之一所在网段相同。</p>
<div class="blog_h2"><span class="graybg">Grub2设置默认启动项</span></div>
<p>执行下面的命令，找到你需要的启动项：</p>
<pre class="crayon-plain-tag">grep menuentry /boot/grub/grub.cfg

# 输出内容
# ...
# menuentry 'Windows 7 (loader) (on /dev/sda1)' --class windows  ...</pre>
<p>修改配置文件：</p>
<pre class="crayon-plain-tag">GRUB_DEFAULT="Windows 7 (loader) (on /dev/sda1)"</pre>
<p>运行下面的命令，重启后即生效：</p>
<pre class="crayon-plain-tag">sudo update-grub </pre>
<div class="blog_h2"><span class="graybg">Grub错误：unknown filesystem</span></div>
<p>我在克隆分区镜像到另外一台机器上时，出现此问题。原因是两台机器的分区结构不一样。grub中的记录已经无效。</p>
<p>解决办法：</p>
<pre class="crayon-plain-tag"># 列出可用分区
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</pre>
<div class="blog_h2"><span class="graybg">禁用mnemonics</span></div>
<p>Ubuntu下的Alt + &lt;KEY&gt;激活顶部菜单的功能有时候很烦人，可以按照如下方法禁用掉：</p>
<ol>
<li>对于基于GTK 2的应用，例如GIMP，可以在~/.gtkrc-2.0中添加：<br />
<pre class="crayon-plain-tag">gtk-enable-mnemonics = 0</pre>
</li>
<li>对于基于GTK3的应用，可以修改/etc/gtk-3.0/settings.ini</li>
</ol>
<div class="blog_h2"><span class="graybg">终端窗口行宽度太短</span></div>
<pre class="crayon-plain-tag">export TERM=xterm-256color </pre>
<div class="blog_h2"><span class="graybg">自动激活新窗口</span></div>
<p>有时候，程序自动打开的窗口可能不会自动激活（置于最前面）。要让新打开的窗口自动激活，可以执行：</p>
<pre class="crayon-plain-tag">dconf write /org/compiz/profiles/unity/plugins/core/focus-prevention-level 0 </pre>
<div class="blog_h2"><span class="graybg">安装Java8</span></div>
<p>14.10以下的版本，自带源不包括JDK1.8，可以自行添加源并安装：</p>
<pre class="crayon-plain-tag">sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update 
sudo apt-get install openjdk-8-jdk </pre>
<div class="blog_h2"><span class="graybg">如何查看保存的WiFi密码</span></div>
<p>所有密码存放在/etc/NetworkManager/system-connections目录下。</p>
<div class="blog_h2"><span class="graybg">如何启用巨型帧</span></div>
<p>尝试在当前节点、目标节点上设置MTU：</p>
<pre class="crayon-plain-tag">ip link set eth0 mtu 9000</pre>
<p>尝试发送巨型帧（Jumbo Frame）：</p>
<pre class="crayon-plain-tag">ping -M do -s 8972 10.0.3.1</pre>
<p>如果当前节点忘记设置MTU，你会遇到错误：ping: sendto: Message too long</p>
<p>如果当前节点设置了MTU，但是目标节点、两者之间的交换机没有设置，则会遇到错误：Request timeout for icmp_seq 0</p>
<p>如果一切正常，你会看到：8192 bytes from  ... </p>
<div class="blog_h2"><span class="graybg">假坏扇区修复</span></div>
<p>首先执行命令：<pre class="crayon-plain-tag">dmesg | grep print_req</pre>，获取出错扇区范围。</p>
<p>然后，扫描出错扇区附近位置：</p>
<pre class="crayon-plain-tag">#                          END      START
badblocks -b 512 /dev/sda  76000000 70000000</pre>
<p>将出错扇区覆盖一次：</p>
<pre class="crayon-plain-tag">badblocks -b 512 -w /dev/sdb 2899976 2899968</pre>
<p>通常会扫描出连续8个扇区，原因是文件系统目前常使用4K扇区。 </p>
<div class="blog_h2"><span class="graybg">升级内核</span></div>
<div class="blog_h3"><span class="graybg">桌面系统如何升级</span></div>
<p>自己去下载内核并安装，很容易出现驱动问题、包不兼容问题。正确的方法是，使用官方原始的souces.list，安装：</p>
<pre class="crayon-plain-tag">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</pre>
<div class="blog_h3"><span class="graybg">到4.15</span></div>
<pre class="crayon-plain-tag">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</pre>
<div class="blog_h3"><span class="graybg">到4.4</span></div>
<pre class="crayon-plain-tag">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</pre>
<p>执行下面的命令移除4.4内核：</p>
<pre class="crayon-plain-tag">sudo apt-get remove linux-headers-4.4.0-* linux-image-4.4.0-*
sudo update-grub </pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/ubuntu-faq">Ubuntu知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/ubuntu-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
