@ghosert
2014-11-02T22:46:36.000000Z
字数 11148
阅读 24271
Ubuntu
任何一个高可用的操作系统,必须解决以下几个重要的问题:
这一节中,我们将讨论从头开始搭建一个基础设施完善的 Ubuntu 系统。主要包括基于 Ubuntu 系统的安装,分区方案,显卡驱动安装,翻墙相关的一些技巧和同步软件(Dropbox)等基础性软件的安装方法。在夯实了这些基础之后,我们也为未来的系统备份,恢复做好了准备,提高了系统的图形处理性能,解决了在不同机器,不同系统间的文件同步问题,同时突破墙的封锁,进一步方便我们日常的工作学习,极大提升系统的可用性和灾难恢复能力。
上一篇 博客中我们提到过,虽然 Ubuntu 的发行安装方式众多,我们仍然推荐从硬盘开始安装。另一方面比起光盘,相信很多同学也了解U盘的优势:易于携带,保存,复制。这里不再敷陈,我们就从制作启动U盘说起。
1. 下载 Ubuntu ISO 文件
访问 Ubuntu 的 官方下载 页面,选择相应版本。一般而言它的版本有桌面版,服务器版,32位,64位,LTS,非LTS之分。所谓 LTS(Long Term Support)指的是长时间支持版本,并不是每一个新版本的 Ubuntu 都是 LTS 版本,譬如,最新的 12.10 版本就不是 LTS 版本,12.04 就是 LTS 版本,12.04 之前的 LTS 版本要追溯到2010年4月发布的 10.04,同时主版本号代表发布的年份,次版本号代表发布的月份,例如:12.04表示2012年4月发布。一般来说,推荐下载最近的 LTS 版本会得到更好的官方支援。这里我们推荐安装 12.04 的64位桌面版(命名方式:ubuntu-12.04.1-desktop-amd64.iso),官方支持长达5年之久,基本上已经超过了用户当前硬件的预期使用寿命,也就是说你在换下一台PC之前无需更换操作系统。如果官方站点的下载速度较慢,你也可以搜索国内的一些镜像网站加速下载过程。譬如 网易镜像
2. 从 Windows 制作启动U盘
在 Windows 下访问 Universal USB Installer 的主页,这个Ubuntu官方推荐的绿色小工具就是帮助用户在手头没有 Ubuntu 的情况下,使用 Windows 来制作启动U盘。这个页面不仅包括了工具的下载链接,同时也包含了详细的操作步骤,同学们准备好1G容量以上的U盘和刚才下载到的ISO文件,按部就班操作即可。制作U盘的时候注意相应的选项,按我个人的经验它制作出的启动U盘质量相当高,甚至超越了Ubuntu下自带的工具。
3. 从 Ubuntu 制作启动U盘
如果你手头有一台安装完毕的 Ubuntu 系统,你也可以通过启动 Startup Disk Creator 这个系统自带的工具制作启动U盘。注意如果你是跨版本的制作相应的启动盘可能会存在问题,笔者曾经在Ubuntu 10.04下使用这个工具制作基于12.04 ISO的启动盘,结果启动盘无法启动电脑,花了一个晚上才搞清楚原来是跨版本引发的问题,最后切换到 Windows 下的 Universal USB Installer 才解决问题。
4. Ubuntu 分区推荐方案
在安装之前,我们先分析一下 Ubuntu 桌面系统的分区方案。
要了解分区方案,先从 Linux 系统的目录结构说起。使用 Windows 系统的用户都知道,Windows 系统先有分区的存在,然后在不同的分区下创建文件目录结构。于是我们看到诸如 C:\Windows D:\Downloads 之类目录,也就是说每一个目录首先是存在于某个分区的。Linux 系统则相反,它首先确定有目录的存在,例如:/, /usr, /media/usb,/media/cdrom, /disk 然后才确定这个目录上挂载的是哪个分区(甚至挂载的可能是CDROM, USB等外设以及ISO光盘镜像文件:类似 Windows 下虚拟光驱的作用)。访问某个目录,实质上就相当于访问挂载在这个目录上的分区,外设或者光盘镜像文件。我们在 上一篇 博客中提到过一个系统存储重要数据的目录: /home 目录, 在通常的最佳实践中,可以把这个 home 目录作为一个单独的挂载点,挂载一个独立分区。这样做有几个好处:
我自己就曾经因为在两年前安装Ubuntu 10.04的时候只分了一个分区,把 /home 目录下的数据和系统文件存储在了同一个分区下,导致在安装Ubuntu 12.04的时候,在没有第二个分区和第二台电脑用来备份/home目录数据的情况下,忍痛将整个系统连同/home目录里的数据全部格式化,损失惨重,教训深刻。
所以一般来说一个 Ubuntu 的系统在安装之初应该有三个分区,他们分别是挂载于根目录: /, home目录: /home 的两个分区以及 swap 分区。swap分区是指虚拟内存的交换区,一般设置为实际内存容量的两倍大小即可。
假设你有一台500G硬盘,2G内存的PC,那么比较好的分区分配方案是:根目录所在分区分配50G左右, swap分区分配4G,剩余空间全部留给 /home 所在分区即可。
5. 安装注意事项
在安装之前,记得备份本机重要数据。在电脑上插入启动U盘后,选择从U盘启动计算机:大多数电脑可以在出现启动画面的时候按F12选择启动媒介,此时选择U盘即可。之后一路安装 Ubuntu 会比较顺利,但是以下几个地方仍然需要注意:
大致的效果图如下(忽略分区尺寸一项,随意填的)
1. 官方Ubuntu源
安装完系统以后,我们来聊聊软件安装的问题。之前,我们说到通过强大的 apt-get 命令从网络上下载,安装软件的方式,而运行这个命令时,系统又是通过查询软件所在的 Ubuntu源 来了解从互联网的什么地址去下载软件,那么对于动辄上百兆或者数量繁多的软件来说,从你的 PC 到 Ubuntu源 之间的网速就决定了你安装下载软件的速度。一个新安装完毕的系统,默认选择的是美国服务器作为 Ubuntu源,因此我们需要选择更快的国内镜像作为系统的源来下载安装软件。具体步骤:
jiawzhang@home-pc:~$ update-manager
但实际上,考察一个源是不是足够好,光看速度并不正确,有时一个速度很快的源如果缺少某些软件,仍然会造成困扰。按笔者的经验,在国内可以直接选择http://ubuntu.cn99.com/ubuntu这个源,速度快,源里的软件也相当齐整。选择完源以后,再次打开终端,输入以下命令更新系统现有的软件:
jiawzhang@home-pc:~$ sudo apt-get update
jiawzhang@home-pc:~$ sudo apt-get upgrade
2. 第三方Ubuntu源
以上我们讲到的都是Ubuntu官方的源或者官方源在国内镜像,除此以外,Ubuntu也允许第三方制作第三方源以扩充软件的数量。但是如果你选择第三方源,官方并未对其中的软件进行过测试,也不保证软件的质量,系统兼容性等问题。反过来说如果你开发的软件进入了官方源,这是一种莫大的荣誉,它首先肯定了你软件的质量,其次也扩大了软件受众的数量,并且经过了官方认证和测试。
假设你现在需要安装 Wine 这个软件------主要用来在 Ubuntu 下运行 Windows 的可执行文件。虽然这是一个合法的软件,但是 Ubuntu 官方没有可能在自己的源中加入一个可运行专利程序的软件,因此你需要自己去加入包含有 Wine 这个软件的第三方源,打开终端,运行:
jiawzhang@home-pc:~$ sudo add-apt-repository ppa:ubuntu-wine/ppa
jiawzhang@home-pc:~$ sudo apt-get update
jiawzhang@home-pc:~$ sudo apt-get install wine
3. Canonical合作伙伴的源
Ubuntu的母公司Canonical另外还有一些合作伙伴,例如在 Ubuntu 12.04 上,如果你需要安装 skype,可以加入这个合作伙伴的源,然后进行安装。
按照上面的步骤打开update-manager以后,仍旧点击Settings按钮,进入Other Software选项卡选中“Canonical Partners”和“Canonical Partners(Source Code)”加入合作伙伴源,接着运行:
jiawzhang@home-pc:~$ sudo apt-get update
jiawzhang@home-pc:~$ sudo apt-get install skype
个人建议在系统安装完毕以后按此步骤加入这个源,方便以后的软件安装。
默认情况下,Ubuntu在安装完成以后,可以认出绝大多数的硬件,并不需要特别的设置。唯一例外的是,如果你无法开启某些窗口特效,意味着系统自带的驱动无法和你的显卡很好的匹配,这个时候你需要去手工安装显卡驱动。我们以 nvidia 的显卡为例,介绍一下显卡驱动的安装方法:
1. 访问 nvidia 官网 下载最新的驱动程序
假设下载文件名为:NVIDIA-Linux-x86_64-304.60.run的64位显卡驱动程序
2. 设置下次系统启动后,只运行在终端下,不启动 GUI 系统
就和在Windows下,系统要求你在保护模式下安装某些软件类似,安装显卡驱动的时候,系统也往往要求在完全的终端里,不带任何图形界面的模式下,因此我们需要让系统下次启动的时候进入终端模式,这里我们第一次需要修改系统的配置文件,在使用 Linux 系统的时候,今后我们会无数次的通过修改基于文本的配置文件来设置我们的系统,因此掌握一个好的文本编辑器也至关重要,Linux下标配的文本编辑器是强大的 vi,如果你现在还不熟悉,没关系,可以先使用 gedit,为了保持博客的专业性,我在今后的命令行中只使用 vi,读者自行替换成 gedit 即可。
sudo vi /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 这一行,修改为 GRUB_CMDLINE_LINUX_DEFAULT="text"
sudo update-grub
sudo shutdown -r 0 #重启电脑
3. 进入重启后的终端,运行
cd ~/Downloads/
chmod u+x NVIDIA-Linux-x86_64-304.60.run # u代表当前用户,x代表可执行权限,u+x即表示赋予脚本当前用户的可执行权限
sh NVIDIA-Linux-x86_64-304.60.run # 执行脚本
按提示完成安装以后,仍旧将系统改回下次重启时进入用户图形界面而非终端模式:
sudo vi /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT="text" 这一行,修改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
sudo update-grub
sudo shutdown -r 0 #重启电脑
如果一切顺利和系统匹配的显卡驱动已经安装完成了,如果想开启一些视窗特效可以下载这个软件:
sudo apt-get install compizconfig-settings-manager
ccsm # 运行compizconfig-settings-manager 设置特效
在Category->Effects里勾选上Wobbly Windows选项,还算一个很好玩的特效,在你拖动,最大化,恢复任何程序窗体的时候,会有夸张的扭动效果,几乎每一个看到我桌面的人都会赞叹一下。不过窗体特效毕竟是华而不实的玩意,不必花费过多时间在这个上面,在许多 Ubuntu 论坛里会有长篇累牍的文章介绍如何装扮炫目的动画效果,我只想反问:还记得我们使用 Linux 系统的初衷是什么?是高效的使用开发者系统,如果迷恋炫目的视觉效果,花费大量的时间精力去配置,一来有违初衷,二来也容易破坏系统的稳定性,历来一个操作系统的软肋就是GUI,开发最复杂,也最容易引发程序甚至系统崩溃,进而炫目的视觉特效实际上会导致低效的操作。例如渐变式的关闭或者开启一个窗口,看上去很炫,实质上为了完成这个特效,窗口延缓了开启或者关闭的时间,一两次延缓不会造成什么损失,考虑到我们会在这个系统中生存几十年,很可能有几万几十万次的延缓累加--那简直就是浪费生命了。撇开这个例子不谈,使用开发者系统追求高效的实质就是改进每一个微操作,通过改进哪怕只能节省几百毫秒的操作,只要这些操作会被无数次的重复,然后累积这些节省带来的效果,经年累月以后,都是惊人的节约。假设一个500人的公司,每个人每天因此可以受益5分钟的时间,那么一年下来:500 * 5 * 251(工作日)/ 60(分钟)/ 8 (一天工作小时) = 1307 天/人,相当于这500人在一年里节约出了5个人年的时间。
Ubuntu 12.04 在切换程序这个环节因为采用特效其实也出了问题,有一些倒退的味道。大家可以试试 "Alt + Tab" 这个常用的程序切换的快捷键。它默认的行为是先对同一类的窗口进行分组,然后如果用户的切换动作在某一组窗口上略作停顿,系统才会展开这一组的窗口,继而在这一组窗口中的每一个窗口间进行切换。表面上看分组的形式减少了我们之前谈到的 视觉迷失 带来的困扰,实质上又增加了每个切换间的停顿时间,破坏了用户原本流畅操作的体验,况且,如上所述,累积停顿带来的后果也是不可承受的,而这里 视觉迷失 的问题其实又可以通过系统自带的 虚拟桌面 来解决,也算不上大问题。因此我个人推荐按以下方法舍弃这种切换特效:
打开终端输入:ccsm 启动 CompizConfig Settings Manager, 进入 Windows Management,选择 Static Application Switcher 可能会报一些快捷键冲突的警告,强制切换即可。
本来一个同步软件不需要提前到这个章节来讲,但是同步软件在我们这个时代越来越重要,可以提升到基础设施的高度来首先考虑。Ubuntu 的 apt-get 命令为我们解决了从云端下载软件的问题,自此我们不需要关心软件在哪里,只需要告诉计算机我们需要什么软件,并且即使在本机崩溃的情况下,仍然可以从云端用同样的命令下载软件。在解决了软件的问题以后,类似 Dropbox 的同步软件则为我们解决了私人文档的问题。无论你的计算机是否崩溃,也无论你在那一台计算机前,公司的,家里的,甚至手机,平板上,只要你能够接入互联网,你就可以访问自己的私人文档。所以个人推荐把重要的文档存入同步软件方便访问和恢复。当然需要频繁修改和多人合作完成的文本文件就不在此列了,专业的 Source Control System 例如 git 命令提供了更好,更强大也更专业的功能,我们以后再谈。也有同学会说为什么不使用系统自带的 Ubuntu One 这个同步软件?在一两年前 Ubuntu One 的平台支持仅限于 Ubuntu 系统本身,这就是一个软肋,同步软件的软件性质本身就要求跨平台,全平台的支持,包括: Ubuntu,Windows,Mac,Android, iOS 因为我们不知道自己今后可能在哪个平台下需要访问某个重要的文档。在书写本文之时,再次访问 Ubuntu One 的官网,发现已经全平台支持同步了,因为没有使用经验,不敢妄论,Dropbox 笔者使用多年,对中国用户来说,除了网速和GFW的问题,其它各方面均体验良好。先介绍一下 Dropbox 这个软件的安装,之所以需要单独讲安装,还是因为 GFW 的缘故,也顺便讲解几个小命令。首先
1. 访问 Dropbox下载 页面,下载 Ubuntu 版本对应的 .deb 文件
2. 开启终端,输入安装deb包的命令:
sudo dpkg -i dropbox_1.4.0_amd64.deb
dpkg 是一个比 apt-get 更低阶的安装命令,apt-get 命令下载的就是 .deb 文件,然后调用 dpkg -i 进行安装, 以上命令只是安装了 Dropbox 的 GUI 壳,运行以后会继续下载 Dropbox daemon 程序,由于 GFW 的阻挠,这个过程无法进行。读者选择退出 Dropbox 即可。
3. 手动下载 Dropbox daemon
32-bit:
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86" | tar xzf -
64-bit:
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
解释一下:cd ~ 就是进入 home 目录, && 是指在 cd ~ 成功以后,继续下一个 wget 的命令。 wget 会去后面 https 起首的地址下载 Dropbox daemon 的压缩包,之后再通过 | 把压缩包传递给 tar xzf - 这个命令进行解压的操作。如果读者暂时无法理解,也没关系,直接把上述命令复制粘帖进终端即可。
4. 再次启动 dropbox
打开终端,输入:
dropbox start
至此,安装完毕,按笔者目前的网络环境,在安装以后,最新的 Dropbox 版本可以正常使用,无需修改任何配置,所有以 https 起首的 dropbox 网址也可以在浏览器中没有限制的访问。所以只要按上述步骤解决安装的问题就可以了。笔者没有测试所有网络环境下的条件,如果还有问题,可以在博客评论中描述状况,本人负责做力所能及的解答。
如果对 Dropbox 感兴趣,可以通过本人帐号的推广链接创建帐号:http://db.tt/oNnbpla 你我各自增加 500M 的空间大小,惠己利人。
虽然笔者在此处推荐 Dropbox, 读者也可以自行选择其他同步软件,下面继续分享一下我自己在 Ubuntu 上使用同步软件的体会。
1. 在云端保存基于单一文本的Linux知识
我们前面提到为了提升使用计算机的效率, Linux 系统是需要花费脑力学习,研究的系统,每一个用户亲身获得的技巧,知识,例如:一种配置方法,一个命令用法,往往这些东西都很零碎且不易记住。俗话说:好记性不如烂笔头,所以我们可以使用文本去记录这些知识片段,记录的时候不要求完整全面,反而应该描述简洁,步骤清晰,提供有价值的参考。这样一旦遇到问题就可以在经过摸索以后把解决的方案写入这个文本,以后遇到类似的问题,即便忘记了命令,步骤,再次搜索这个文本即可。基于单一文本的云端保存优势明显,它可以在任意计算机上被任意程序阅读,修改和搜索,搜索优于导航的理念使得我们也不再组织各种文件目录去保存这些知识:在增加知识的时候,你无需烦恼如何整理分类某一个技巧,在查询知识点的时候,也无需到不同的目录去翻阅,只在单一文件中做搜索工作。增加文件或者树形结构的目录在某些情况下只不过是增加了导航的成本,而如果我们化繁致简,那么我们花费的记忆成本就只有一个文件路径而已,其它的事情,全都教给搜索去打理。不仅于此,做任何事的时候,谨慎的增加事物的复杂度以保持简单的特性才能避免混乱的局面,即所谓的 KISS 原则,Keep it simple, stupid!
2. 在云端保存一个软件安装的脚本
apt-get 作为命令行安装软件的一大优势就在于可脚本化幷反复运行。每次运行 apt-get 下载安装一个软件以后,都把这一句 apt-get 命令保存在脚本文件里,这样,一旦发生系统崩溃的情况,只需要在全新安装后的系统上重新运行这个脚本,就可以恢复我们系统上曾经安装的软件。更进一步,如果我们有编译安装软件的步骤或者定制系统的工作都可以用命令行的形式固化在这个脚本中,用以今后恢复系统。实践上,我自己将这个脚本的内容和上述第1点的知识文档合二为一,所有的知识文本以注释的形式存在于这个系统恢复脚本中。因此这个脚本既可以用来恢复系统,也可以用来记录,查询知识点,当然为了方便使用,这个脚本也需要时时刻刻的更新和维护以保证最大的正确性和可用性。以下是摘自我个人脚本中的片段:
ubuntu_install_guide.sh
#!/bin/sh
cd ~
sudo apt-get update # This is very important step to update system first.
# install gcc/g++ first
sudo apt-get install gcc -y # if there is no gcc, do this first.
sudo apt-get install g++ -y # if there is no g++, do this first.
# install gvim
sudo apt-get install vim-gnome -y
......
......
......
# XXX Tips:
# Visit http://www.google.com/ncr to make sure no country redirection, this will resolve some issues on resetting google-search-result(by GFW or ISP).
# XXX Tips:
# Start gvim from terminal and get global menu in Ubuntu 12.04: gvim -f filename
......
......
......
3. 在云端备份 home 目录下重要的配置文件
在重新恢复一个系统的时候,除了软件的恢复可以通过上述云端的脚本,另外还有一个重要的东西就是软件的配置文件。由于 Linux 软件的高可定制化,许多高效率的用户之所以可以灵活驾驭 Linux 系统,实际上是花费了大量的时间在适应软件,或者调整软件的配置来适应自己,达到人机合一的境界,而一旦切换到别人的环境上,由于人与人之间习惯的不同导致配置的不同,效率立刻就下降几个数量级,甚至根本在别人的环境里无法工作。因此丢失配置文件对于高效用户来说,就相当于丢失效率,必须从头开始花费心力去配置软件,损失大量的时间,而与用户相关的配置文件一般都会存放在 home 目录,因此及时备份这些数据到云端就显得尤为重要了。一来可以在安装完软件以后恢复这些配置文件,二来我们也可以通过云端在不同计算机上共享这些配置,无需在多个计算机上反复进行相同的配置工作。一般来说,这些文件都以 . 起首的隐藏文件形式存在,可以使用以下命令查看
ls -al ~
例如:.vim .vimrc 保存了 gvim 的配置信息, .mozilla 保存了 firefox 的配置信息,等等。
4. 在云端存储其它重要的文档,电子书,音乐,图片等等
这个是同步软件的基本用途,不再敷陈。
综上所述,现在我们的云端帐号里存储了所有安装软件的命令,所有软件的配置文件以及我们记录下的所有Linux的使用经验,技巧,知识。有了这些东西,即使面对一台全新的计算机,只要首先保证云端的数据都传回本地,就不难很快地再次把它恢复成自己最顺手的系统。
由于GFW的存在,无法自由的接收和发送讯息,这是 Ubuntu 基础架构必须面对的另一个问题,我们就此讨论一种基本的翻墙方法。假设我们的计算机 A 需要访问计算机 B,然而由于墙的阻隔无法达成,因此我们需要首先找到 计算机 C,并且满足A 和 C, C 和 B 之间互相可访问,这样,借助计算机 C 作为代理,就可以实现 A <-> C <-> B 的 A B 之间可访问。这就是我们翻墙方法的基本原理。
假定我们找到了这样一台代理服务器 C(可以通过淘宝购买?),这里又有两种状况需要考虑:
sudo apt-get install proxychains -y
sudo vi /etc/proxychains.conf
注释掉文件中最后一行:socks4 127.0.0.1 9050
幷在文件最后追加一行:socks5 proxy_ip_address port
通过安装 proxychains 这个软件,同时我们在它的配置文件 /etc/proxychains.conf 中加入了代理服务器的 ip 地址和端口号,这样我们就可以要求任意被墙阻断的命令行软件通过代理服务器连接互联网了,使用方法也很简单,假设我们需要下载 facebook 的主页,就可以运行:
proxychains wget http://www.facebook.com
即在任何命令行前首先加注 proxychains 这个命令。
设置本地计算机为代理服务器
假设目前我们没有代理服务器 C,但是另外有一台装有 ssh server的国外主机 D,这个时候我们可以在本地计算机和国外主机 D 之间建立 ssh channel,然后通过这个 channel 把本机设置为代理服务器,所有通过本机代理的请求都会被再次转发到国外主机 D,再经由 D 访问最终的目标地址,最后再把结果回传给本地程序。具体步骤,打开终端输入:
ssh username@machine_d_ip_address -D 127.0.0.1:7070 # 建立 ssh channel,并且不要关闭这个终端或者退出 ssh
此时本地 127.0.0.1:7070 这个地址端口已经具备了类似代理服务器 C 相同的作用,你只需要在任意 GUI 程序的代理服务器选项上填入 127.0.0.1:7070,或者在上述 /etc/proxychains.conf 文件最后追加一行
socks5 127.0.0.1 7070
即可让 GUI 或者命令行程序通过代理服务器连接互联网。
未完待续......