目录
需求产生
自从业的第三个年头开始,本人的ARM嵌入式开发环境一直都是Windows + Virtualbox + Ubuntu + Zsh + Tmux + Vim + Putty这几个黄金搭档。每次电脑重启后的统一操作都是 启动Virtualbox -> 等待完全启动 -> 启动Putty -> SSH 远程登录到Ubuntu -> 启动Tmux 开启多个标签页。这个些操作由于过于统一和频繁,因此在很早之前就已经被自动化了(自动化的原理和流程打算后面有空再写一篇文章来专门描述)。由于囊状羞涩,这些年使用的笔记本内存几乎都是统一的8G, Windows启动后默认占用2.4G,虚拟机一般分配2.5G(已经很少了),Chrome一般占用500M,外加一些其他的必须软件,系统基本在开发环境运行时就已经占用了6G,运行一段时间后内存占用一般会到7G,近乎90%的长期占用量,让我这种强迫症患者很是难受。于是在想在不花钱换电脑的情况下有没有办法让内存的占用量降低点,日常使用长期占用率在80%以下那将会大大降低的我对内存的焦虑感。
分析问题
有了想法自然就会心心念念,于是终于在一个闲暇的下午我开始认真的分析了一下这个问题。首先看一下内存的占用情况,Windows的2~3G内存占用一般是不太能动了,花精力各种精简系统也许可以换来500M的节省,但这样做势必会导致windows功能不全,动不动系统就报这个没有那个没有的体验肯定划不来。Ubuntu18.04一般在开机后默认会占用2G以上的空间,因此,实际上2.5G的内存分配量,在系统启动后往往完全空闲的空间就只剩200~300M了(可怜的虚拟机,还没干活就只剩这么点内存了)。Ubuntu之所以一启动就占用2G以上的内存, 一是因为启图形界面占用了大概800M的空间,二是因为启动图形界面过程中载入的大量文件缓存也占用了超过1G的空间。虽然从Ubuntu系统角度上看, 这些文件缓存随时都可以被回收重利用,但从Windows系统上看,这些缓存就是一启动就一直被占用内存空间。而嵌入式开发的实际流程中,Linux虚拟机的存在一般只是用来折腾各种嵌入式开发板的SDK,一个配置的牛逼点的VIM往往可搞定一切开发过程中的源码编辑工作。这么看来如果是纯嵌入式开发,实际上Linux虚拟机的图形界面是可有可无的。实际的情况也的确如此,如果你习惯于使用Putty+SSH登录本地的虚拟机来完成开发任务。那么Ubuntu的图形界面打开使用的概率几乎是不到百分之一。至此就很明显了,如果能干掉这个虚拟机的图形界面,内存占用就可以降低。
解决问题
切换默认启动到字符界面
有了方向就可以着手修改了,简单百度一下,可以知道Ubuntu16.04之后系统改用Systemd作为init管理进程了,在Systemd架构下关闭图形界面直接进入字符界面的配置指令如下:
sudo systemctl set-default multi-user.target # 切换启动目标到多用户的字符界面
该操作后重启系统将自动进入简单的tty1终端,整个图形界面都将不会启动。它的逆操作为:
sudo systemctl set-default graphical.target # 开启用户图形界面
设置启动到multi-user.target模式后重新启动后将自动跳转到tty1终端的用户登录界面,此时输入用户名+密码即可登录到tty1终端。虽然这个古老到连中文都不能正常显示的tty1终端使用的频率很小,但每次启动后还要手动登录的体验明显不好,我们可以通过如下方法来实现这个tty1终端的自动登录操作:
sudo vi /etc/systemd/system/getty.target.wants/getty@tty1.service
修改
ExecStart=-/sbin/agetty --noclear %I $TERM
为
ExecStart=-/sbin/agetty -a boddy --noclear %I $TERM
注意:其中的boddy是你真实的用户名。
选择共享剪切板实现的方式
通过Putty + SSH + VIM的方式作为开发环境时一个可以在虚拟机和Windows之间完全共享的全局剪切板特性是非常重要的,在我之前"有关VIM的共享剪切板实现"的文章中有提到,这种共享剪切板的实现有两种办法:
1. 通过绑定Xwindow的图形界面到本地(export DISPALY=:0)外加virtualbox提供的增强功能中剪切板共享功能即可实现Linux和Windows之间的剪切板共享。该方法实现原理可以简单描述如下:Virtualbox在给虚拟机系统安装了增强功能后将会在Linux虚拟机中添加并自动启动“/usr/bin/VBoxClient --clipboard”程序,该程序负责连接Xwindow的系统全局剪切板并配合virtualbox本身完成和Windows系统剪切板同步工作。这种方式实现的共享剪切板的桥梁就是那个VBoxClient程序,该程序是在图形界