使用 VirtualBox 在 Win7 系统上安装 Ubuntu

为了跑一份开源代码,在电脑上安装了一个Ubuntu虚拟机。安装过程有小坑如下,写出来与newbie诸君共勉。

简介

Image Loading
VirtualBox是Oracle旗下的开源免费虚拟机软件。与上学时曾用过的VMware相比,个人感觉VirtualboxBox操作更为简洁方便。
Image Loading
Ubuntu是基于Linux的Debian分支开发的跨平台的、开源的操作系统。关于Linux不同版本的特性比较,可以参看这门课程LFS101x.2 Introduction to Linux

安装Ubuntu

Ubuntu官网根据自己电脑的配置和需求选择相应版本下载。我选择的是Ubuntu Desktop 32-bit。在虚拟机里跑操作系统,一般不会分配大于2GB的内存,建议选择32-bit的版本下载。

新建一个虚拟机的过程很简单,如果命名时就起名为Ubuntu 32bit或类似的名字,VirtualBox会自动设置好一些配置选项,基本就是一直使用默认就可以。一些优化的配置一会儿再提。
双击打开新建的虚拟机,会提示选择启动盘,这时选择刚才下载的安装包(比如ubuntu-14.04.2-desktop-i386.iso)就可以了。

Ubuntu的安装过程也很简单,按照引导一步一步安装即可。因为是安装在虚拟机内,也不用担心系统分区与覆盖的问题。如果需要可以看前面提到的课程关于Ubuntu安装的视频

更改分辨率

安装完成后重启,已经可以进入Ubuntu系统。但此时系统的分辨率是800*600,且虚拟机关于调整分辨率的按钮是灰色的。
此时需要在该系统安装VirtualBox的增强功能包,在窗口主菜单的设备->安装增强功能,增强包会自动加载运行。建议使用VirtualBox的最新版本,我最开始安装时用的是老版本,未能成功。运行结束后重启Ubuntu,桌面上可以看到光盘图表的增强包,系统的分辨率已经随你的窗口自动调节了。
安装增强功能

提升性能不再卡

此时的Ubuntu系统运行时卡顿无比,尤其在操作图形界面时。鼠标走位飘忽,打开一个Terminal也要费好大劲。如果不是电脑本身配置太差,就是设置的问题。要进行下面几步:

  1. 开启CPU的硬件虚拟化功能。
    现在的CPU几乎都支持硬件虚拟化功能,英特尔称之为VT-x技术,AMD称之为AMD-V技术。在百度搜索你的笔记本型号或主板型号+开启虚拟化,就可以找到相应的开启方法。一般是开机进入bios,然后找到Virtualization Technology之类的选项,将disabled改为enabled。
    BIOS中开启硬件虚拟化功能成功后,在虚拟机设置->系统->硬件加速中,启用硬件加速。如果开启成功,虚拟机窗口右下角会显示一个蓝色V图标。
    开启硬件加速
  2. 给虚拟机分配足够的内存。
    既然本机有4GB的内存,那么可以分配1GB供虚拟机上的Ubuntu使用。在虚拟机设置->系统->主板处。
    分配内存
  3. 开启3D加速,分配足够显存。在虚拟机设置->显示->显卡处。
    开启3D加速,分配显存

重启,此时虚拟机运行流畅多了。

设置共享文件夹

手动挂载

在虚拟机设置->数据空间处,新增共享文件夹,为该数据空间命名如code_ref,设置为固定分配。
重新启动系统,在Terminal里执行如下命令,会挂载该数据空间到指定目录,就可以看到共享文件夹下面的文件了。
sudo mount -t vboxsf code_ref code/code_share/
挂载命令
注意这个命令要在根目录也就是刚进Terminal时所在的目录下执行,code_ref是之前我们命名好的数据空间,code/code_share是我想要加载到的本地目录。新建文件夹请用mkdir指令。
如果想卸载,执行命令:sudo umount -f code/code_share

自动挂载

以上这种方式是手动将共享文件夹挂载在自己指定的地方。如果对目标目录没有特殊要求,使用virtualbox提供的自动挂载就可以。
首先,在virtualbox的共享文件夹处设置自动挂载。系统会自动在/media里建立以sf_为前缀并加上共享名的挂载点,启动时就会自动挂载。
共享文件夹自动挂载
这个挂载点默认的权限是给vbox创建的用户组vboxsf的,要想查看,需要把自己的用户名加入到vboxsf组。
在Terminal中执行命令sudo gedit /etc/group
打开group文件,将自己的用户名添加到vboxsf组。
添加到vboxsf组
重启,可以看到在/media目录中已经出现了名为sf_code_ref的文件夹。
自动挂载成功

使用中文输入法

我安装的ubuntu14.04默认安装了ibus-pinyin输入法,如果没有请到Software Center去安装。
点击系统右上角语言小图标,选择Text Entry Settings,如图添加Chinese(Pinyin)这一项。
Text Entry Settings
之后使用Super+Space就可以切换输入法了,这个Super键,默认就是左边Ctrl与Alt之间的Windows键…(*´Д`)
此时使用这个输入法有些怪怪的,是因为默认开启简拼模式。仍然在右上角“拼”图标处点击,选择Preferences,在Pinyin mode处取消对Incomplete pinyin的勾选,重启就可以了。

替换软件源

官方源对于国内用户比较慢,最好替换成国内镜像。
打开Ubuntu软件中心,点击顶部面板Edit->Software Sources…
Software Sources
在弹出窗口中Download from处,选择Other,在之后的列表中选择163的镜像源。
选择163镜像
之后更新一下sudo get-apt update,快多了。

用命令行增加VirtualBox分配空间大小

使用到一定程度会觉得当初分配的最大8G硬盘太小了,而界面上并没有扩容的选项,此时需要安装VirtualBox Extension Pack,使用其中的VBoxManage命令行工具扩容。
安装后用管理员权限打开cmd.exe,执行命令cd /d C:\Program Files\Oracle\VirtualBox\,进入扩展包的安装目录。
再执行脚本VBoxManage.exe modifyhd YOUR_VIRTUAL_MACHINE_VDI_PATH --resize SIZE_IN_MB。其中YOUR_VIRTUAL_MACHINE_VDI_PATH是虚拟机vdi文件的完整路径,如D:\VirtualMachine\Ubuntu\Ubuntu.vdiSIZE_IN_MB则是尺寸大小,如20480。
关于VBoxManage的更多用法可以参看官网Manual

解决权限不足导致的符号连接错误问题

在虚拟机共享目录(形如sf_xxx的目录)中进行符号连接时,有时会提示错误ln: creating symbolic link 'foo': Read-only file system
这是权限不足造成的。还是使用前文提到的扩展包解决。
用管理员权限打开cmd.exe。如前文所述到VBoxManage所在目录执行VBoxManage.exe setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1。其中VN_NAME是vdi的名字,如Ubuntu;SHARE_NAME是共享目录没有sf_前缀的名字。
然后用管理员权限打开VirtualBox开始使用。注意一定要用管理员权限打开,不然符号连接时仍会遇到错误ln: failed to create symbolic link '': Protocal error

更新gcc到4.9版本

安装:

1
2
3
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9

链接:

1
2
3
4
5
cd /usr/bin
rm gcc g++ cpp
ln -s gcc-4.9 gcc
ln -s g++-4.9 g++
ln -s cpp-4.9 cpp

生成core文件

程序遇到错误异常退出时,会希望用gdb对core文件进行调试。而ubuntu14.04默认是不生成core文件的,需要做一些设置。
在命令行输入ulimit -c unlimited取消对core文件大小的限制,再执行ulimit -a即可查看设置结果。
另外,通过查看/usr/src/linux/Documentation/sysctl/kernel.txt文件我们还发现,在[/proc/sys/kernel/]core_pattern配置文件中如果第一个字符是|,那么core dump不会生成独立文件,而是传输给程序的标准输出。
kernel.txt文件中对core_pattern的解释如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
core_pattern:
core_pattern is used to specify a core dumpfile pattern name.
. max length 128 characters; default value is "core"
. core_pattern is used as a pattern template for the output filename;
certain string patterns (beginning with '%') are substituted with
their actual values.
. backward compatibility with core_uses_pid:
If core_pattern does not include "%p" (default does not)
and core_uses_pid is set, then .PID will be appended to
the filename.
. corename format specifiers:
%<NUL> '%' is dropped
%% output one '%'
%p pid
%P global pid (init PID namespace)
%i tid
%I global tid (init PID namespace)
%u uid (in initial user namespace)
%g gid (in initial user namespace)
%d dump mode, matches PR_SET_DUMPABLE and
/proc/sys/fs/suid_dumpable
%s signal number
%t UNIX time of dump
%h hostname
%e executable filename (may be shortened)
%E executable path
%<OTHER> both are dropped
. If the first character of the pattern is a '|', the kernel will treat
the rest of the pattern as a command to run. The core dump will be
written to the standard input of that program instead of to a file.

可以通过sudo sysctl -w kernel.core_pattern=/tmp/core.%E.%p修改此配置。
如果你在共享文件夹sf_xxx中生成core文件,由于权限问题,大小可能为0字节。建议还是生成在/tmp目录里。


[1] https://courses.edx.org/courses/course-v1:LinuxFoundationX+LFS101x.2+1T2015/info
[2] http://imcn.me/html/y2011/4053.html
[3] http://www.xuzefeng.com/post/85.html
[4] http://www.cnblogs.com/huanghuang/archive/2011/09/23/2185968.html
[5] http://forum.ubuntu.org.cn/viewtopic.php?p=3074035
[6] http://www.linuxidc.com/Linux/2014-04/100476.htm
[7] http://hajuria.blogspot.com/2013/12/how-to-increase-virtualbox-disk-size-in.html
[8] http://serverfault.com/questions/345341/cant-create-symlinks-in-virtualbox-shared-folders
[9] http://askubuntu.com/questions/428198/getting-installing-gcc-g-4-9-on-ubuntu
[10] http://stackoverflow.com/questions/2065912/core-dumped-but-core-file-is-not-in-current-directory
[11] https://www.sourceware.org/ml/gdb/2011-09/msg00009.html