Linux虚拟机使用笔记

本文基于在 windows 系统环境下(笔者已经在 windows 7 和 windows 10 下都操作过多次)通过 VMware Workstation 12 Player 安装并使用 Ubuntu 16.04 的经验,描述一些比较典型的问题和详细的应对方法。

和主机的交互增强

通过 ubuntu 官网的镜像文件成功安装 16.04 版本之后,可以在主机和虚拟机之间复制黏贴一些文字了,鼠标的进入和离开也很自然,但这很显然还不足够。
既然玩的是虚拟机,而不是把主机整个改成 Linux 环境,那么就有必要利用主机的资源,使用 VMware 本身提供的 VMware-Tools 可以很轻易的增强虚拟机和主机之间的交互。

VMware-Tools 的重新安装

  1. 进入虚拟机系统,然后点击 VMware 软件上的 Player 按钮,依次选择”管理“-”更新 VMware-Tools“或者”重新安装 VMware-Tools”。
  2. 随后,等待系统的响应。会在下方出现选项,复制其中的 VMware-Tools 压缩包,黏贴到你喜欢的文件夹下,比如也可以,然后右键解压他。
  3. 进入解压后的文件夹,运行命令sudo ./vmware-install.pl(文件名字可能有偏差,总之,是这个解压出来的文件夹下的 .pl 文件)。
  4. 安装过程中会出现很多操作问询,大可一路回车确认下去。

共享文件夹

  1. 重新安装好 VMware-Tools 后,关闭虚拟机,重启 VMware,在左侧列表选中虚拟机之后,进入虚拟机设置,在“选项”列表里,找到“共享文件夹”选项,通过“添加”来选择主机内你想要共享给虚拟机的文件夹。之后的操作都很简单,不赘述。
  2. 上一步的选项都弄好后,启动虚拟机,我们将可以在目录/mnt/hgfs下看到主机共享过来的文件夹。
  3. 需要注意的是:不要在共享文件夹里去放项目。因为实际上,这个共享文件夹还是存在于 Windows 系统里的。所以如果在虚拟机里部署开发环境,而在共享文件夹里去试图开发工程,会发现遇到各种奇怪的编码问题,比如一些字符显示不正常,比如一些依赖安装失败等。共享文件夹尽量只用于从主机里往虚拟机里导入一些简单的文件,千万不要以为这个文件夹能在两个系统里都工作正常!

浏览器共享主机SS代理

  1. 本机设置好代理后,其实不需要在虚拟机里再安装SS,原理是:虚拟机相当于一台注册于本地局域网内的客户机,所以可以通过设置系统代理,直接找主机的SS。在本机里通过ipconfig/all命令可以轻易地看到主机作为虚拟机所在局域网的主机的 ip,比如可能是 192.168.199.1(注意,以下是以此为例
  2. 进入虚拟机,在“网络设置”中的“Network proxy”选项中,选择Manual,这里 4 个代理都可以直接设置为主机的IP地址,一般这个地址是192.168.199.1。(在主机中先查看确认一下)
  3. 以上代理的端口设为主机代理程序的端口,SS默认端口号是1080(你可以在SS的服务器配置里去改成别的,保持一致即可)。
  4. 虚拟机内需要代理的各浏览器,选择“使用系统代理”、或者下载一些好用的插件(比如Chrome可以用Proxy SwitchyOmega,幸运的是,目前下载相关插件并不需要科学上网)。
  5. 如果你主机上使用的是 SS,还需要在SS上勾选“允许来自局域网的连接。
  6. 注意,由于 SS 使用 socks5 协议,而终端很多工具目前只支持 http 和 https 等协议——比如,你是 ping 不通 google 的,因为 ping 不涉及 http/https 等协议,除非你使用 vpn 实现系统级代理,否则以上例子只能让你通过浏览器科学爱国。其他应用程序,比如 npm 需要额外做设置,执行npm config set proxy=http://192.168.199.1:1080才能让它使用主机的代理。
  7. SS 仅在这里作为例子来描述。
  8. 如果不需要科学上网,或者VPS暂时被封了,虚拟机的“网络设置”的“Network proxy”选项中,选择Disabled就好。

服务器端ss安装

防爆,略。只简单提示下新手容易卡住的地方:客户端连接不了可能原因有多种,比如服务端自己的服务没有启动、软件没有开通用户访问权限、服务器端口被防火墙封掉等。


虚拟机使用增强

Chrome 的安装

  1. Chrome应该成为唯一的浏览器rua!rua!rua!
  2. 先通过命令sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/将下载源加入到系统的源列表。如果返回“地址解析错误”等信息,可以百度搜索其他提供 Chrome 下载的源,用其地址替换掉命令中的地址。
  3. 再通过命令wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -导入谷歌软件的公钥,用于下面步骤中对下载软件进行验证。
  4. 如果顺利的话,命令将返回“OK”
  5. sudo apt-get update没什么好说的,对当前系统的可用更新列表进行更新。这是许多 Linux 发行版经常需要执行的操作,目的是随时获得最新的软件版本信息。
  6. 现在我们可以安装 chrome 稳定版本了sudo apt-get install google-chrome-stable
  7. 通过命令/usr/bin/google-chrome-stable运行 chrome,顺手将它锁定到图形界面上吧,以后开启就方便了。至此安装结束。

拼音输入法

ubuntu16.04 并没有自带中文输入法,所以需要额外手动安装。这里和网上许多教程有出路,我实践后发现需要的操作是:

先安装语言支持

  1. 进入“系统设置” -> “语言支持(Language Support)-> “键盘输入法”从 ibus 改成 fcitx(支持搜狗输入法的输入法系统)。
  2. 同一界面里,找到“添加或删除语言…”,进去找到“Chinese(Simple)”打钩。
  3. 注销,重新登陆系统。

搜狗拼音输入法

  1. 先去搜狗拼音官方网站下载搜狗拼音的 deb 安装包(注意是 32 位还是 64 位的)。
  2. 进入安装包所在目录,执行sudo dpkg -i 搜狗拼音deb包名字等待系统报错误提示。
  3. 执行sudo apt-get -f install强制安装所需依赖。
  4. 重新安装 deb 包sudo dpkg -i 搜狗拼音deb包名字
  5. 重新进入系统后,在输入法按钮处进入 ConfigureFcitx 设置,点击在左下角的+号,去掉“only”的 √ 号,并找到搜狗拼音,将其加入。重启系统。之后,你将可以在你的 ubuntu16.04 虚拟机里使用搜狗拼音输入中文。
  6. sublime 中如果需要使用中文输入法,还需要做一些额外的配置,比如使用 github 上的 sublime-text-imfix 项目,具体的操作对应的 readme 里写清楚了。

谷歌拼音输入法

  1. sudo apt install fcitx fcitx-googlepinyin im-config
  2. im-config去指定一下 fcitx 模式
  3. 另外,谷歌拼音切简/繁体很方便,在拼音输入模式下:ctrl+shift+f。但这也是一个坑:毕竟这也是 VSCode 默认开启全局搜索的快捷键…所以建议改一下。
  4. 要修改快捷键可能会有迷惑,其实是在Input Configure里,进入addon选项,则可以找到简繁体切换的功能,点进去,发现可以设置快捷键,可以修改成不容易冲突的,甚至是直接通过esc取消这个快捷键。

修改字体

Unity Tweak Tool

  1. 一个非常方便的Linux的主题管理/桌面自定制工具,对于Unix的桌面用户是非常有用的
  2. 可以通过桌面上的应用管理直接安装,也可以通过命令安装
  3. sudo add-apt-repository ppa:freyja-dev/unity-tweak-tool-daily
  4. sudo apt-get update
  5. sudo apt-get install unity-tweak-tool
  6. 如果出现关于com.canonical.unity.webapps的报错“The following schema is misssing”,就安装sudo apt-get install unity-webapps-service

苹果字体

  1. 毕竟日常工作是Mac电脑的话,修改为苹果的字体也会更加习惯吧。
  2. wget http://drive.noobslab.com/data/Mac/macfonts.zip -O mac-fonts.zip
  3. sudo unzip mac-fonts.zip -d /usr/share/fonts
  4. sudo fc-cache -f -v
  5. 之后就可以通过 Unity Tweak Tool 来修改字体显示了。

程序的删除

  1. 先通过命令dpkg --get-selections | grep <应用程序的部分或者全部名称>获取程序全名。
  2. 调用命令sudo apt-get remove --purge <应用程序名称>来删除相应的程序。
  3. 如果想要手动删除一些配置文件,可以通过命令locate -ir <软件关键字(可以有正则表达式)来定位应用程序相关的文件位置。
  4. 接下来可以执行一些自动的清理工作,比如:
  5. sudo apt-get autoremove删除为了满足应用程序的而安装过,现在不需要了的程序(配置会被保留)。
  6. sudo apt-get autoclean APT 的底层包是 dpkg, 而 dpkg 安装 Package 时, 会将 *.deb 放在 /var/cache/apt/archives/中,该命令会删除 /var/cache/apt/archives/ 已经过期的 deb。
  7. sudo apt-get clean会将 /var/cache/apt/archives/ 的 所有 deb 删掉,可以理解为 rm /var/cache/apt/archives/*.deb这样的命令。

文件权限知识

文件权限除了 r、w、x 外还有 s、t、i、a 权限

  1. s:文件属主和组设置 SUID 和 GUID,文件在被设置了 s 权限后将以 root 身份执行。在设置 s 权限时文件属主、属组必须先设置相应的 x 权限,否则 s 权限并不能正真生效(chomod命令不进行必要的完整性检查,即使不设置 x 权限就设置 s 权限,chmod 也不会报错,当我们ls -l时看到 rwS,大写 S 说明 s 权限未生效)。Linux 修改密码的 passwd 便是个设置了 SUID 的程序,普通用户无读写/etc/shadow 文件的权限确可以修改自己的密码。

    1
    2
    ls -al /usr/bin/passwd
    -rwsr-xr-x 1 root root 32988 2008-12-08 17:17 /usr/bin/passwd
  2. 可以通过字符模式设置 s 权限:chmod a+s filename,也可以使用绝对模式进行设置,如:chmod 4764 filename //设置 SUID

    • 设置 suid:将相应的权限位之前的那一位设置为 4;
    • 设置 guid:将相应的权限位之前的那一位设置为 2;
    • 两者都置位:将相应的权限位之前的那一位设置为 4+2=6。
  3. t :设置粘着位,一个文件可读写的用户并一定相让他有删除此文件的权限,如果文件设置了 t 权限则只用属主和 root 有删除文件的权限,通过 chmod +t filename 来设置 t 权限。
  4. i:不可修改权限 例:chattr u+i filename 则 filename 文件就不可修改,无论任何人,如果需要修改需要先删除 i 权限,用 chattr -i filename 就可以了。查看文件是否设置了 i 权限用 lsattr filename。
  5. a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用 chattr +a 设置追加权限。

安全上下文

  1. 注意到ls -l显示文件时,权限列后面有个点。如:-rw-rw-r--. 1 user group 13767 12月 25 2014 index.html
  2. 这是开启了 SELinux 功能的 Linux 系统才会有这个点,那个点表示文件带有“SELinux 的安全上下文”。
  3. 对于 CentOS 7 默认是开启 SELinux 的,所以会有这个点,如果关闭 SELinux,然后再创建文件,新创建的文件就不会再有这个点了,但是以前创建的文件本来有这个点的还会显示这个点(虽然 SELinux 不起作用了)。

一些方便的命令和快捷键

  1. nautilus 路径:可以从终端打开对应路径的文件目录的图形化界面
  2. win 按键就是 Linux 系统的Super键,非常的有用,可以直接按,也可以组合按键:比如配合方向键来摆放窗口、配合按键 d 来显示桌面等等
  3. ctrl + alt + t可以直接打开一个 termial

虚拟机系统需要注意的一些细节

  1. 断行字符。
    1. DOS 和 Linux 的断行字符不一样。所以,在不通的系统之间复制一些纯文本文件的时候,有必要转换断行格式。
    2. 通过命令cat -A 以DOS(Windows系统)建立的文件(理所当然,这里的文件格式相对Linux是特殊的)可以发现在 DOS 中使用的断行字符为^M$,我们称之为 CR 与 LF 两个符号;而在 Linux 下,仅有LF($)这个断行符号。
    3. Linux 中的命令在执行的时候,判断依据是Enter,DOS 的是 CRLF,多了一个^M 的符号出来,在这样的情况下,如果是一个 shell script 的程序文件,可能发生无法正常执行的状态——会误判程序所执行的命令内容。
    4. 转换方式:k 参数表示保留原本的 mtime 时间格式(不更新文件上次内容被修订的时间)n 参数表示保留旧文件。
      • dos2UNIX [-kn] file [newfile]
      • UNIX2dos [-kn] file [newfile]
  2. 语系编码转换。
    1. iconv --list列出 iconv 支持的语系数据
    2. iconv -f 原本编码 -t 新编码 filename [-o newfilename]f 就是 from,t 就是 to,
  3. 如果有人通过sudo rm -rf /误操作了,可以尝试 iso 引导进入 rescue 模式,然后查看.bash_history,90%概率能找出是谁干的。

虚拟机安装/使用过程的一些问题

某天网络连接突然断开

  1. 如果设置了代理,那么检查代理有没有开、主机ip是否变化。如果都ok,进入下一步。
  2. 在主机里看vmware相关进程是否正常
  3. windows电脑为例,计算机(右键)——管理——服务,找到vmware有关的进程——DHCP和NAT。
  4. 手动选择“启动”。一般都能解决了。

无法更新软件源

  1. 表现是sudo apt-get update的时候报错,提示被锁定了。
  2. 直接到那个目录下去删掉lock文件即可。

vi 编辑器出现故障

  1. 表现是进入输入模式后,方向键不能正常地在文档里移动,而是出现了 ABCD 等字符,backspace 按键也不能正常地删除字符
  2. 解决的方式有很多,最简单的就是cp /etc/vim/vimrc ~/.vimrc
  3. 这个对于在Windows系统下,使用x-shell的时候遇到一样表现的问题的时候也是可以的。

chrome花屏死机

  1. 2019.7发现chrome开多了窗口后,有不确定出现的花屏,会导致chrome假死,虚拟机也无法操作。
  2. 不久后发现VSCode的console用的久了后也会黑屏,需要Kill掉重新开,虽然不算很糟糕,但是还是很烦
  3. 所以尝试将虚拟机vmware的:管理-虚拟机设置-显示器-加速3d图形 里的主机内存提供到2G
  4. 发现VSCode的console还是会黑屏,决定关闭硬件加速看看问题是否复现
  5. 还会复现,so…慢慢找办法吧TODO: