macOS新平台工作环境的设置和迁移

  感谢厨神Tim Cook在10月27日短暂而又精彩的新款MacBook Pro发布会,让我在期待了大半年之后,终于毫不犹豫地下单购买了2015年初期版本的老款MacBook Pro。新版MacBook Pro做的更加轻薄靓丽,无不彰显了Apple强大的工业设计能力,但是抛开缺了苹果标志的信仰灯不能装逼了暂且不说,MacBook Pro不仅仅是专供美工使用的,对于广大程序员同志而言缺失实体Esc和Fn键是不能容忍的,况且这次更新后处理器、内存方面并没有什么变更,对于实用主义者来说新款版本更新动力不大(不过主要原因还是因为穷,而新款价格贼贵了许多)。
  其实对于Linux平台的程序员而来,当经历过人生最能折腾的年代玩遍各大发行版之后,绝大多数人都投皈依到了macOS的门下,而现在我就属于其中的一位,其中最主要的原因就是macOS系统和Linux系统具有着极大的亲缘性,macOS的很多组件都移植自开源的BSD系统,所以Linux程序员在macOS下用Terminal会有十分亲切的感觉,同时对于原生没有打包进macOS的软件和工具,外挂神器homebrew更是让其如虎添翼,基本Linux下的绝大多数软件包括gcc都可以一句命令安装,方便的不得了。除此之外就是MacOS系统良好的美学设计和极为完善的软件生态系统,大多Windows下的软件都有Mac的版本,更是可以让那些长久以往而来对Linux桌面怒其不争的人彻底摆脱双系统的困扰。至于如果还遇到用Mac装逼说,这类同事可以断绝交往了,现在中端PC的价格都和Mac差不多了,如果还觉得用Mac是装逼的话,你的伙伴逼格有多Low啊!
  macOS系统的软件,参见文章末尾的两个推荐链接就可以了。能力充裕财务自由的还是买正版吧,毕竟自己也是做软件的,破解软件虽然能省几个钱,但是有些需要打开系统安装未认证软件的权限,风险得失自己平衡。其实对于一个开发者一款软件十刀也还是可以接受的,只是我们大多数人没有养成为软件付费的习惯而已。我把自己用到的软件罗列如下:

  iTerm、搜狗输入法、WizNote、ShadowsocksX、WingIDE、Chrome、QQ、WeChat、SlickEdit、DropBox、Steam、KeePassX、VLC、ThunderBird、Sublime、Microsoft Office 2016、Photoshop CC、网易云音乐、Thunder、VMware Fusion、BetterZip、Navicat Premium、iStat Menus、MacVim、Snip、Adobe Acrobat Pro、CheetSheet、PopClip、CleanMyMac3、iExplorer、GnuPG2、Manico、Go2Shell、HazeOver、Quitter、Tickeys、Memory Cleaner、CopyClip、Recess、Moom、Bartender 2、Dash、Reeder 3、Tweetbot、TotalFinder、SSH Shell、EasyFind、Typora、OmniGraffle、Clion、Keka、Ulysses、Meld    

  当然上面的软件可能不是最优的,主要是考虑到之前一些常在Windows和Linux下面使用的软件保存了一些数据,如果换成别软件那么数据的迁移会比较的麻烦,因此不是特别差的也将就着用了。退一万步不说如果iTerm不能满足你的需求,那么SSH Shell这类客户端还是买个正版的吧,为了自己也为了公司负责,之前那个汉化Putty后门自动上传主机账号密码的事情想想真是瘆得慌。
  关于虚拟机,可能大家会疑惑,前面刚把万能的macOS系统吹的天花乱坠兼容类Unix系统,有着类似Windows系统良好软件生态圈,为什么还是摆脱不了虚拟机的宿命呢?其实对于大多数不涉及系统级的开发,macOS算是够用了,但是作为服务端开发的人,时常需要使用操作系统底层的异步特性,虽然select是Posix标准以至于连Windows都支持,但是对于高性能的异步构架却不然:Windows使用的I/O completion ports,BSD、macOS使用的kqueue,Linux使用的epoll,基本是各自为政的状态,同时Linux操作系统还有很多系统调用,所以要进行Linux的服务端软件开发调试,就不得不安装个虚拟机,然后再装一个原生的Linux操作系统才行。
  macOS下面的虚拟机算Parallels Desktop、Vmware Fusion、VirtualBox三分天下,VirtualBox据说其代码写的稀烂(我没看过,不过别人评价说这个软件能编译跑起来简直就是个奇迹)就PASS了,Parallels Desktop在苹果上使用的最为广泛,但是发现其对最新的Ubuntu 16.04 LTS支持的不好,最后就选择了Vmware Fusion了,其向来对Linux相关支持最为完善,而且现在虚拟机的催化剂VMware Tools也已经交与社区维护了,各大主流的Linux发行版的官方仓库都集成了open-vm-tools-desktop软件包,可以一键虚拟机加速了,每个发行版都会对其进行测试验证然后加入仓库,所以显然对Guest OS的支持是最优的了。
  安装系统就不说了,需要注意的是:把虚拟机完全备份之后要排除在TimeMachine之外,否则很快你的备份硬盘就会被撑爆掉,其次Guest OS就不要开高分Retina分辨率了,虽说Ubuntu对高分屏支持的不错,但是你的显卡会爆掉的。这里主要讲究的是在macOS和Linux之间通过NFS的方式共享文件,为啥选择NFS而不是CIFS或者vmhgfs,主要是因为NFS是类Unix下原生的东西,对Linux文件系统的特性和语义算是支持的最好的,虽然要真让我说个所以然来还比较困难,操作如下:
  (1). 在Host MacOS上面建立/etc/exports,并且导出自己想要共享出去的目录,后面-mapall是要共享出去的user和group。注意MacOS下面nfsd服务端文件共享的配置格式和Linux平台下是不一样的(如果不想便捷配置文件,可以安装一个NFS Manager辅助生成之)

1
2
3
4
➜  cat /etc/exports
/Users/taozj/Dropbox/ReadTheCode/ -network 172.16.20.0 -mask 255.255.255.0 -mapall=taozj:staff:ubuntu
/Users/taozj/Dropbox/GitHub/ -network 172.16.20.0 -mask 255.255.255.0 -mapall=taozj:ubuntu:staff

  (2). 让nfsd开启自动启动,然后每次修改了上面的/etc/exports,都可以用nfsd update进行刷新

1
2
3
➜  sudo nfsd enable
➜ sudo nfsd start
➜ sudo nfsd update

  (3). 使用nfsd checkexports可以检查/etc/exports是否有配置错误,showmount -e列出本机成功共享出去的目录信息

1
2
3
4
5
➜  nfsd checkexports
➜ showmount -e
Exports list on localhost:
/Users/taozj/Dropbox/ReadTheCode 172.16.20.0
/Users/taozj/Dropbox/GitHub 172.16.20.0

  (4). 这个时候可以在Linux平台命令行挂载是否成功,如果你是Ubuntu系统,你会看到共享过来的文件属主为(501,dialout),那是因为在MacOS配置nfsd的时候使用的-mapall=taozj参数,我的用户taozj的uid和gid刚好是(501,20),而Ubuntu上面默认第一个常规用户的uid是从1000开始的,而gid=20刚好代表dialout组,所以得到了这么个奇怪的用户所有者。解决的方法要么配置idmapd服务进行id映射,这个在Linux下好办但是macOS下比较难折腾,我就找了个简单的方法偷个懒,在Linux下面将当前用户的uid变成和MacOS一样的501

1
2
3
root@ubuntu:~# usermod -u 501 user
root@ubuntu:~# usermod -a user -G dialout
root@ubuntu:~# find / -user 1000 -exec chown -h user {} \;

  通过这个操作,用户user的uid将会从1000变成现在的501,同时/home/user目录下的所有文件的属主也会自动被修改,但是其他位置的文件可能需要手动chown操作,挂载测试是否成功,读写是否正常,没有问题的话就可以写入/etc/fstab中开机自动挂载

1
2
172.16.20.1:/Users/taozj/Dropbox/ReadTheCode/	/home/user/MacOS/ReadTheCode	nfs	auto,rw,noatime,nolock,intr,tcp,actimeo=1800	0	0
172.16.20.1:/Users/taozj/Dropbox/GitHub/ /home/user/MacOS/GitHub nfs auto,rw,noatime,nolock,intr,tcp,actimeo=1800 0 0

  然后在网络上无意中浏览到了MacOS移植了BSD的xhyve容器库,不知道怎么样,玩容器的伙伴又可以摆弄了。
  电脑买回来预装的EI Caption,用着这个版本也好,因为每次苹果系统的升级都会修复旧款设备运行过于流畅的Bug,况且据说新版的macOS Sierra软件兼容性和其他稀奇古怪的问题之多多,本人也就懒得升级了。工作环境的切换真心费神费力,希望这次入驻Mac平台后,Dropbox和TimeMachine能够保平安,让我把有限的精力投入到更加有意义的事情上去。

  MacOS平台软件推荐帖

  PS:用了一段时间,发现坑点还是蛮多的。虽然说Terminal支持很多Unix的工具,但是有的工具还是跟Linux有所差别,可能是因为苹果是BSD系的吧,当初耍FreeBSD的时候就遇到过类似的问题。默认的编译器是Clang,编译最新的Boost还是会出现这样那样的问题,想把默认编译器换成homebrew安装的gcc-5.4.0,但是貌似做不到,哭。。。
  此外,大多数的软件对gcc支持好,但是Clang就不一定了,比如最新upstream在Linux用gcc编译重来没出现过问题,但是Apple Clang一直都有问题,最后切换到boost-1.62.0发布版本才可以。不过逼近寡人主要做后台服务端,势必会和系统调用强耦合,现在基本都虚拟机开发了。
  虽然买的256G硬盘,另外扩充了一个Jet Drive 128G,存储空间是够用的,但是发现开启虚拟机、或者多开几个IDE的情况下内存压力很大的说,有些后悔当时没有下狠心剁手16G内存版本的。目前解决的方式就是装了个Memory Cleaner定时清理内存,同时装了一个Quitter,可以计时将长久不活跃的软件自动退出掉。

  PPS:上班的时候,需要使用Windows电脑但是又想工作内容都在网盘中,这时候最简单的方法就是把Windows当作共享服务器,然后Linux挂载共享分区到自己的路径中。因为Windows对CIFS的支持算是最好的,Windows导出共享文件夹也是极为的简单,而且Linux作为客户端挂在也毫无压力:

1
2
3
4
5
6
7
8
9
 ➜  ~ id taozj uid=1007(taozj) gid=1007(taozj) groups=1007(taozj) ➜  ~
mkdir remote_build ➜ ~ sudo mount -t cifs
//192.168.1.194/Users/taozj/Dropbox/BitBucket/v5kf_dev /home/taozj/remote_build
-o username="taozj",uid="1007",gid="1007" -v Password for
taozj@//192.168.1.194/Users/taozj/Dropbox/BitBucket/v5kf_dev: *************
mount.cifs kernel mount options:
p=192.168.1.194,unc=\\192.168.1.194\Users,uid=1007,gid=1007,user=taozj,prefixpat
th=taozj/Dropbox/BitBucket/v5kf_dev,pass=******** ➜ ~ ls -l remote_build total
0 drwxr-xr-x 2 taozj taozj 0 Feb 10 09:43 aimlsrvd

  PPPS:现在又在一个新公司上班了,比较开放的环境已经完全用macOS办公了,贫穷惨淡的生活还是抵挡不住内心的喜悦,macOS是个好东西。

本文完!