Mac OS X 上基于 FreeBSD/bhyve 的虚拟技术 xhyve

FreeBSD 下的虚拟技术 bhyve (The BSD Hypervisor) 是去年1月份正式发布的,包含在了 FreeBSD 10.0 发行版中。今天要玩的这个 xhyve 是基于 bhyve 的 Mac OS X 移植版本,也就是说我们想在 Mac 上运行 Linux 的话除了 VirtualBox, VMware Fusion 外,现在有了第三种选择。

xhyve 超级小,只有 230 KB,不依赖其他软件或库。下面的步骤基本按照 xhyve 作者的文档 xhyve – Lightweight Virtualization on OS X Based on bhyve 实现,不过跟着别人的文档并不总会一帆风顺,虽然文档已经很详细,总有碰到自己的问题的时候,有人报告说在自己的 Macbook (OS X 10.10.3) 上运行不成功。我在测试的过程中遇到的一个问题是硬盘分区问题,稍后会提到。我的编译和测试环境是 OS X Yosemite 10.10.4 + Xcode 6.3.2.

xhyve

xhyve 发布的是源代码,需要编译后运行,所以 Mac 上没有安装 Xcode 的话需要先到 App Store 安装。

使用 git 下载源码后编译,运行 xhyverun.sh 后会启动一个简单的 Tiny Core Linux 虚拟机:

$ git clone https://github.com/mist64/xhyve.git

$ cd xhyve
$ make

$ ./xhyverun.sh

上面的 Tiny Core Linux 只是测试和确定 xhyve 能运行,下面我们将在 xhyve 上安装和运行完整的 Ubuntu 14.04 Server 虚拟机。

在上面的 xhyve 目录里新建一个 ubuntu 目录用来存放所有和 ubuntu 虚拟机相关的东东。下载 ubuntu-14.04.2-server-amd64.iso,并把 iso 里面的两个系统启动需要的文件 vmlinuz 和 initrd.gz 拷贝出来:

$ mkdir ubuntu
$ cd ubuntu

$ wget http://releases.ubuntu.com/14.04/ubuntu-14.04.2-server-amd64.iso
$ dd if=/dev/zero bs=2k count=1 of=/tmp/ubuntu.iso
$ dd if=ubuntu-14.04.2-server-amd64.iso bs=2k skip=1 >> /tmp/ubuntu.iso
$ hdiutil attach /tmp/ubuntu.iso

$ cp /Volumes/Ubuntu-Server\ 14/install/vmlinuz .
$ cp /Volumes/Ubuntu-Server\ 14/install/initrd.gz .

创建一个 10GB 大小的硬盘文件当作 ubuntu 虚拟机的硬盘:

$ dd if=/dev/zero of=ubuntu.img bs=1g count=10

转到上层目录(xhyve)后新建一个脚本文件 ubuntu_install.sh,然后修改脚本文件为可执行:

$ cd ..

$ vi ubuntu_install.sh
#!/bin/sh

KERNEL="ubuntu/vmlinuz"
INITRD="ubuntu/initrd.gz"
CMDLINE="earlyprintk=serial console=ttyS0 acpi=off"

MEM="-m 1G"
#SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_CD="-s 3,ahci-cd,ubuntu/ubuntu-14.04.2-server-amd64.iso"
IMG_HDD="-s 4,virtio-blk,ubuntu/ubuntu.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"

build/xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD -f kexec,$KERNEL,$INITRD,"$CMDLINE"

$ chmod +x ubuntu_install.sh

启动这个文件需要 sudo 权限哦:

$ ./ubuntu_install.sh
virtio_net: Could not create vmnet interface, permission denied or no entitlement?

$ sudo ./ubuntu_install.sh

xhyve

这时候会看到 ubuntu 的标准文本格式的安装程序,安装过程中唯一要注意的是硬盘分区的时候不要选择自动分区,也不要选择 LVM 分区,选择手动分区,使用最简单的一个 root 区一个 swap 区。我碰到的一个问题就是选择自动分区后到后来安装完毕启动系统的时候挂在那里不动。

还有一个要注意的地方,安装完毕后,这时候选择 Go Back,因为我们要到 Execute a shell 命令行界面把里面的内核文件拷贝出来留作以后启动用:

  ┌─────────┤ [!!] Finish the installation ├──────────┐
  │                                                                        │
┌│                         Installation complete                          │
││ Installation is complete, so it is time to boot into your new system.  │
││ Make sure to remove the installation media (CD-ROM, floppies), so      │
││ that you boot into the new system rather than restarting the           │
││ installation.                                                          │
││                                                                        │
└│     <Go Back>                               <Continue>                 │
  │                                                                        │
  └────────────────────────────────────┘

选择 Execute a shell 后转到目标目录,知道虚拟机的 IP 地址后用 nc 把虚拟机和外面的世界(Mac)连起来传输文件:

BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

~ # cd /target/
/target # sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr da:ae:82:16:cf:32
          inet addr:192.168.64.3  Bcast:192.168.64.255  Mask:255.255.255.0
          inet6 addr: fe80::d8ae:82ff:fe16:cf32/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24426 errors:0 dropped:0 overruns:0 frame:104
          TX packets:13283 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:32881668 (32.8 MB)  TX bytes:924462 (924.4 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/target # tar c boot | nc -l -p 9000

在 Mac 上接受文件:

$ cd xhyve/ubuntu
$ nc 192.168.64.3 9000 | tar x

有了 vmlinuz-3.16.0-30-generic 和 initrd.img-3.16.0-30-generic 内核文件,我们就可以启动 ubuntu 虚拟机了,注意这时候 root=/dev/vda1 哦:

$ cd ..

$ vi ubuntu_boot.sh
#!/bin/sh

KERNEL="ubuntu/boot/vmlinuz-3.16.0-30-generic"
INITRD="ubuntu/boot/initrd.img-3.16.0-30-generic"
CMDLINE="earlyprintk=serial console=ttyS0 acpi=off root=/dev/vda1 ro"

MEM="-m 1G"
#SMP="-c 2"
NET="-s 2:0,virtio-net"
#IMG_CD="-s 3,ahci-cd,ubuntu/ubuntu-14.04.2-server-amd64.iso"
IMG_HDD="-s 4,virtio-blk,ubuntu/ubuntu.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"

build/xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD -f kexec,$KERNEL,$INITRD,"$CMDLINE"

$ chmod +x ubuntu_boot.sh
$ sudo ./ubuntu_boot.sh

运行成功:

xhyve

一个能并列高亮显示文件比较结果的小工具 icdiff

很久没有更新博客了,一直在忙今年的收尾工作,先前的存储服务器计划出了点小问题,资金刚刚到账,这两天完成订购后剩下的事情就留到明年了。

发现一个刚出炉的文件比较小工具 icdiff. icdiff 可以并列显示两个文件的不同,比传统的 diff 好看多了。

虽然传统 diff 很强大,估计没几个人喜欢看这样的比较结果:

$ diff 1.css 2.css

diff

icdiff 是 python 程序,从 github 上下载的是可执行文件,直接运行就可以了。icdiff 能并列显示比较结果,还能高亮显示差异,找起问题来容易多了:

$ git clone https://github.com/jeffkaufman/icdiff.git
$ cd icdiff
$ ./icdiff 1.css 2.css

diff

使用 OSXFUSE/SSHFS 远程挂载的组权限问题

今天在 Mac 上使用 OSXFUSE/SSHFS 挂载一个远程服务器目录的时候发现一个问题,使用的 username 属于 admin 用户组却无法访问 admin 组拥有的文件和目录,从 ssh 一直 debug 到 pam/ldap/kerberos /nfs 都没发现问题,最后才怀疑到是这个 sshfs 客户端的问题。

根据这里讨论给的提示,OSXFUSE 自己的 SSHFS 程序在挂载的时候会默认忽略用户的 gid (group id),这就是为啥不能读服务器上的用户组 admin 的文件和目录了,组权限被忽略了。解决办法是,在 sshfs 挂载的时候添加参数 -o defer_permissions:

$ sshfs -o defer_permissions [email protected]:/root test/

升级到 Mac OS X 10.10 Yosemite (Beta)

上周四苹果发布了 Mac OS X 10.10 Yosemite Beta 公开测试版,如果你提前加入了 OS X Beta Program 的话会收到邮件,按照提示提取或手动输入 Redemption Code 后就可以下载安装了。和升级 Mac OS X 10.9 Mavericks 时候一样,升级 Mac OS X 10.10 Yosemite 直接通过 App Store 就可以完成。

目测改变最大的是界面,继续向扁平化、iOS 7 风格靠拢,菜单字体也变了。自己用得最多、最在意的两个程序是 Safari 和 Terminal.

Safari.app 改进挺大,终于加上了 Google Chrome 几年前就有的 “直接在地址栏搜索”,因为从来不关机,所以浏览器经常会有 n 个 tab 页放在那里,时间长了这些 tab 不容易找,单从 tab 上面的 title 没法快速识别自己要找哪个 tab,Safari 菜单上的 show all tabs 能快速预览所有 tabs,正是我想要的。

Mac OS X 10.10 Yosemite

Terminal.app 没有多大变化,依然没有 iTerm2.app 那种多窗口切分功能,只能依靠 tmux 做窗口、会话切分。

Calendar.app 也是常用的 app,这年头记不住事,全靠 Calendar/Reminder/Notes/Timer 之类的工具。不知道大脑退化是否和这些 app 有关,反正自从可以用电脑打字以后,很少碰过笔,现在拿笔写出来的字惨不忍睹~,不知道大家还记不记得曾经有 “书法” 这个词~

Mac OS X 10.10 Yosemite

Spotlight 功能大大加强,而且搜索的速度大大提高,也可能是因为硬盘是 SSD 的缘故,搜索结果基本上可以做到实时显示。

Notifications 增加了 “Today” 标签页,用户可以在 “Today” 里看日历、提醒、天气、股票、计算器等常用信息,据说苹果开放了 API,第三方程序也可以将信息显示到 “Today” 里,貌似苹果打算这个新的信息展示页面替代老的 Dashboard.

iCloud Drive 可以到 System Preferences -> iCloud 开启,5GB 免费,和 Dropbox 用法一样。

可能因为我的使用习惯是保持系统最简,不怎么用第三方软件,不会出现乱七八糟的软件兼容、干扰等问题,Mac OS X 10.10 Yosemite 公开测试版在我的 Mac 上运行很稳定,完全可以当作正式版用~

修改 Mac 的 MAC 地址

以前在学校下载电影 IP 老是被封,后来进化到管理员封物理网卡地址(MAC),每隔一段时间就得换个 MAC 地址。听说苹果在最新将要发布的 iOS 8 上增加了 MAC 地址随机化功能,也就是说在扫描 Wi-Fi 的时候会随机生成 MAC 地址,扫描完成后才会给出真实 MAC 地址,这个功能可以更好的保护用户的隐私和安全,据说一些营销和数据分析公司会通过免费的 Wi-Fi 收集信息,这点信息也不放过实在可恶,所以在外面用公共的 Wi-Fi 最好加一层 VPN 后再用。

假设在 Mac 上通过 ifconfig 查到 Wi-Fi 网卡接口是 en0,更换一个随机的 MAC 地址一句话就可以搞定:

$ sudo ifconfig en0 ether `openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'`

上面的命令没有加到系统启动文件里,所以每次系统启动后会还原真实 MAC 地址。除非系统出问题,一般不会重启 Mac,平时用 Mac 也没必要关机,一般屏幕一合上就走人~

在 Linux 的 KVM 上安装 Mac OS X Mavericks 虚拟机

现在我们很方便就能在 Mac 上通过 VirtualBox 安装 Mac OS X 虚拟机,如果没 Mac 的话也能很容易在 Linux/Windows 下通过 VirtualBox 体验 Mac,甚至把 Mac OS X 直接装在 PC 上也是可能的。如果想在数据中心这种 KVM/Xen 虚拟环境里安装 Mac OS X 呢?通过 Apple Remote Desktop 连接 n 个 Mac 虚拟机,应该会比较好玩吧。

以下操作在 CentOS 6.5 上测试通过。更详细的资料请参考 Running Mac OS X as a QEMU/KVM Guest.

首先需要 Linux 3.x 以上的内核,CentOS 6.5 上默认是 2.6.x 内核,所以需要另装或升级内核,我们这里用 CentOS 官方 Xen 源(Xen4CentOS6)里面的最新 Linux 内核,注意这里用的是源里的普通内核,不是要用 Xen 内核,你也可以用其他第三方源的内核或者自己下载内核编译。注意修改 grub.conf 文件的 default=0 部分确认系统启动后启动的是普通内核(不是启动 Xen 内核):

# yum install centos-release-xen
# yum update

# vi /etc/grub.conf
...
default=0
...

# reboot

当前的主流 Linux 发行版自带的 kvm/qemu 都不支持 OS X 作为 guest 系统,所以我们需要自己编译 kvm, kvm-kmod, qemu 加上 OS X 的支持。下载 kvm 和 kvm-kmod 源代码后编译,编译会出错,解决办法见后面:

# yum install git
# yum groupinstall 'Development Tools'

# git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.git
# git clone git://git.kiszka.org/kvm-kmod.git
# cd kvm-kmod
# ./configure
# make LINUX=../kvm clean sync all
...
/root/kvm-kmod/x86/assigned-dev.c: In function ‘assigned_device_enable_host_msix’:
/root/kvm-kmod/x86/assigned-dev.c:434:2: error: implicit declaration of function ‘pci_enable_msix_exact’ [-Werror=implicit-function-declaration]
  r = pci_enable_msix_exact(dev->dev,
  ^
cc1: some warnings being treated as errors
make[3]: *** [/root/kvm-kmod/x86/assigned-dev.o] Error 1
make[2]: *** [/root/kvm-kmod/x86] Error 2
make[1]: *** [_module_/root/kvm-kmod] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.10.34-11.el6.centos.alt.x86_64'
make: *** [all] Error 2

修改 assigned-dev.c 这个文件的第434行,用 pci_enable_msix 函数替代 pci_enable_msix_exact,查看 git 修改记录和日志,貌似 pci_enable_msix_exact 是 Linus 上个月刚加上去的,我们这里还原,还是用原先的 pci_enable_msix 就可以了。

# vi /root/kvm-kmod/x86/assigned-dev.c
...
        /*r = pci_enable_msix_exact(dev->dev,
                                  dev->host_msix_entries, dev->entries_nr);*/
        r = pci_enable_msix(dev->dev, dev->host_msix_entries, dev->entries_nr);
...

修改代码后重新编译,注意这时候 make clean all 不要 sync,否则上面的修改会被重新覆盖:

# make LINUX=../kvm clean all

编译成功后,就可以加载 kvm-intel 内核了,使用 dmesg 确认内核加载成功:

# modprobe -r kvm_intel
# cp ./x86/kvm*.ko /lib/modules/$(uname -r)/kernel/arch/x86/kvm/
# modprobe kvm_intel

# dmesg | tail -n1
loaded kvm module (for-linus-40872-ga4e91d0)

kvm 部分告一段落,现在来编译 qemu:

# yum install zlib zlib-devel glib2-devel pixman-devel

# cd
# mkdir osx

# git clone git://git.qemu.org/qemu.git
# cd qemu
# ./configure --prefix=/root/osx --target-list=x86_64-softmmu
# make clean; make; make install

我们要安装 OS X 当然需要 OS X 的启动盘。到 App Store 里下载 Install OS X Mavericks.app 安装文件,然后在 Mac 上用下面的脚本生成一个可启动的 Mavericks ISO 文件,我们将要用这个 Mavericks.iso 安装系统,所以我们还需要把这个 Mavericks.iso 拷贝到 KVM 服务器上 :

$ vi createiso.sh
# Mount the installer image
hdiutil attach /Applications/Install\ OS\ X\ Mavericks.app/Contents/SharedSupport/InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/install_app

# Convert the boot image to a sparse bundle
hdiutil convert /Volumes/install_app/BaseSystem.dmg -format UDSP -o /tmp/Mavericks

# Increase the sparse bundle capacity to accommodate the packages
hdiutil resize -size 8g /tmp/Mavericks.sparseimage

# Mount the sparse bundle for package addition
hdiutil attach /tmp/Mavericks.sparseimage -noverify -nobrowse -mountpoint /Volumes/install_build

# Remove Package link and replace with actual files
rm /Volumes/install_build/System/Installation/Packages
cp -rp /Volumes/install_app/Packages /Volumes/install_build/System/Installation/

# Unmount the installer image
hdiutil detach /Volumes/install_app

# Unmount the sparse bundle
hdiutil detach /Volumes/install_build

# Resize the partition in the sparse bundle to remove any free space
hdiutil resize -size `hdiutil resize -limits /tmp/Mavericks.sparseimage | tail -n 1 | awk '{ print $1 }'`b /tmp/Mavericks.sparseimage

# Convert the sparse bundle to ISO/CD master
hdiutil convert /tmp/Mavericks.sparseimage -format UDTO -o /tmp/Mavericks

# Remove the sparse bundle
rm /tmp/Mavericks.sparseimage

# Rename the ISO and move it to the desktop
mv /tmp/Mavericks.cdr ~/Desktop/Mavericks.iso

$ sudo sh createiso.sh

在 Mac 上编译 smc_read.c 这个文件并运行得到 SMC,这个 SMC 序号我们会在后面用到:

$ vi smc_read.c
/*
 * smc_read.c: Written for Mac OS X 10.5. Compile as follows:
 *
 * gcc -Wall -o smc_read smc_read.c -framework IOKit
 */

#include 
#include 

typedef struct {
    uint32_t key;
    uint8_t  __d0[22];
    uint32_t datasize;
    uint8_t  __d1[10];
    uint8_t  cmd;
    uint32_t __d2;
    uint8_t  data[32];
} AppleSMCBuffer_t;

int
main(void)
{
    io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
                               IOServiceMatching("AppleSMC"));
    if (!service)
        return -1;

    io_connect_t port = (io_connect_t)0;
    kern_return_t kr = IOServiceOpen(service, mach_task_self(), 0, &port);
    IOObjectRelease(service);
    if (kr != kIOReturnSuccess)
        return kr;

    AppleSMCBuffer_t inputStruct = { 'OSK0', {0}, 32, {0}, 5, }, outputStruct;
    size_t outputStructCnt = sizeof(outputStruct);

    kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2,
             (const void*)&inputStruct, sizeof(inputStruct),
             (void*)&outputStruct, &outputStructCnt);
    if (kr != kIOReturnSuccess)
        return kr;

    int i = 0;
    for (i = 0; i < 32; i++)
        printf("%c", outputStruct.data[i]);

    inputStruct.key = 'OSK1';
    kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2,
             (const void*)&inputStruct, sizeof(inputStruct),
             (void*)&outputStruct, &outputStructCnt);
    if (kr == kIOReturnSuccess)
        for (i = 0; i < 32; i++)
            printf("%c", outputStruct.data[i]);

    printf("\n");

    return IOServiceClose(port);
}

$ gcc -Wall -o smc_read smc_read.c -framework IOKit
$ ./smc_read
REPLACE-YOUR-KEY-HERE(c)AppleComputerInc

快搞定了,最后我们还需要一个硬盘文件来充当虚拟机的硬盘以及 chameleon_svn2360_boot 这个文件,Chameleon 是 Darwin/XNU 系统的启动器(boot loader),用来在非苹果硬件上启动 OS X:

# /root/osx/bin/qemu-img create -f qcow2 osx.img 20G

# wget http://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/chameleon_svn2360_boot

在 KVM 上启动安装这个我们准备已久的 OS X Mavericks 虚拟机吧,注意下面的 osk="REPLACE-YOUR-KEY-HERE(c)AppleComputerInc" 部分用上面的 SMC 序号替代:

# /root/osx/bin/qemu-system-x86_64 -enable-kvm -m 2048 -cpu core2duo \
-smp 2 \
-vga std \
-device ahci,id=ide \
-usbdevice keyboard -usbdevice mouse \
-device isa-applesmc,osk="REPLACE-YOUR-KEY-HERE(c)AppleComputerInc" \
-kernel /root/chameleon_svn2360_boot \
-smbios type=2 \
-device ide-drive,bus=ide.2,drive=MacHDD \
-drive id=MacHDD,if=none,cache=none,file=/root/osx.img \
-vnc 0.0.0.0:1 \
-device ide-drive,bus=ide.0,drive=MacDVD \
-drive id=MacDVD,if=none,snapshot=on,file=/root/Mavericks.iso -boot once=d

打开 VNC 客户端连接上面 KVM 服务器 IP 和端口 5901 就会看到安装界面了,先按回车开始安装,然后用菜单里的 Disk Utility 工具分区,退出 Disk Utility 就可以看到安装盘了,点击安装盘后就可以看到 Install OS X 安装界面了:
mac os x running on linux kvm

安装完后会重启进入系统:

mac os x running on linux kvm

关闭 Mac 上的虚拟内存

MacBook Pro with Retina display 的标配内存是8GB,这个内存足够日常使用了,考虑到 SSD 硬盘寿命的问题,建议关闭系统的虚拟内存(Swap),避免频繁写入。关闭系统 swap 还可以提高性能(参考 Linux 性能监测:MemoryLinux 性能监测:IO 的 swap 部分)。

查看当前正在使用的虚拟内存:

$ sysctl vm.swapusage
vm.swapusage: total = 1024.00M  used = 354.50M  free = 669.50M  (encrypted)

关闭虚拟内存以后,系统里还保留着这些用作虚拟内存的交换文件,可以删除:

$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

$ sudo rm /private/var/vm/swapfile*

用了一段时间还没有遇到系统不稳定问题,如果发现系统不稳的话可以重新开启虚拟内存:

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

升级到 Mac OS X 10.9 Mavericks

现在升级操作系统这种在以前看来很麻烦的事情变得越来越简单,就像升级一次应用程序一样。升级 Tiger 到 Snow Leopard 从订购安装盘到完成升级花了几天的时间,Snow Leopard 时代就不需要安装光盘了,直接到 App Store 购买后下载升级,这次升级到 Mavericks 更快,在苹果发布会宣布的同一天就完成了升级,昨天得知 OS X 10.9 Mavericks 免费后惊呆了,立刻 Software Update… 果然看到 FREE UPGRADE 按钮:

OS X 10.9 Mavericks

下载速度很快,5.29GB 的系统镜像下载+安装不到一小时就搞定了。

OS X 10.9 Mavericks

据说新版系统有200多项改进,玩了两下没发现什么特别激动的,小改进挺多,iCloud Keychain 能方便记住各种密码并且自动同步到其他 Apple 设备上,在 Mac 上输入的密码在 iPad/iPhone 上就不用输入了,很方便;Finder 增加了 Tabs,不用开多个 Finder 窗口了;新系统增加了两个比较有用的应用程序,iBooks 和 Maps;Calendar 改进了很多,类似 iOS 7 的界面风格;点击 Battery 会看到哪些应用程序很耗电(Apps Using Significant Energy),这个能方便用户在需要的时候关闭这些程序 …

这次宣布免费的重量级应用还有 Pages, Numbers, Keynote. 苹果把操作系统和办公套件(Mac OS X + Pages/Numbers/Keynote)都免费了,难道不知道微软是靠 Windows + Word/Excel/Powerpoint 吃饭的么?这算不算 “走别人的路,让别人无路可走” 呢~

在 Mac OS X 终端里使用 Solarized 配色方案

相信长期浸泡在终端和代码的小伙伴们都有一套自己喜爱的配色方案。以前一直在用简单、适合阅读的 Terminal.app 配色方案换到 MacBook Pro with Retina display 后发现这个配色时间看长了眼睛有点累。不断有人推荐 Solarized,看了一些截图,感觉还不错,决定试一下。

Solarized 是目前最完整的 Terminal/Editor/IDE 配色项目,几乎覆盖所有主流操作系统(Mac OS X, Linux, Windows)、编辑器和 IDE(Vim, Emacs, Xcode, TextMate, NetBeans, Visual Studio 等),终端(iTerm2, Terminal.app, Putty 等)。类似的项目还有 Tomorrow Theme.

要在 Mac OS X 终端里舒服的使用命令行(至少)需要给3个工具配色,terminal、vim 和 ls. 首先下载 Solarized:

$ git clone git://github.com/altercation/solarized.git

Terminal/iTerm2

Mac OS X 自带的 Terminal 和免费的 iTerm2 都是很好用的工具,iTerm2 可以切分成多窗口,更方便一些。

如果你使用的是 Terminal 的话,在 solarized/osx-terminal.app-colors-solarized 下双击 Solarized Dark ansi.terminal 和 Solarized Light ansi.terminal 就会自动导入两种配色方案 Dark 和 Light 到 Terminal.app 里。

如果你使用的是 iTerm2 的话,到 solarized/iterm2-colors-solarized 下双击 Solarized Dark.itermcolors 和 Solarized Light.itermcolors 两个文件就可以把配置文件导入到 iTerm 里。

Vim

Vim 的配色最好和终端的配色保持一致,不然在 Terminal/iTerm2 里使用命令行 Vim 会很别扭:

$ cd solarized
$ cd vim-colors-solarized/colors
$ mkdir -p ~/.vim/colors
$ cp solarized.vim ~/.vim/colors/

$ vi ~/.vimrc
syntax on
set background=dark
colorscheme solarized

iterm2 and solarized

ls

Mac OS X 是基于 FreeBSD 的,所以一些工具 ls, top 等都是 BSD 那一套,ls 不是 GNU ls,所以即使 Terminal/iTerm2 配置了颜色,但是在 Mac 上敲入 ls 命令也不会显示高亮,可以通过安装 coreutils 来解决(brew install coreutils),不过如果对 ls 颜色不挑剔的话有个简单办法就是在 .bash_profile 里输出 CLICOLOR=1:

$ vi ~/.bash_profile
export CLICOLOR=1

vim and solarized

MacBook Pro with Retina display

上周订购的13寸 MacBook Pro with Retina display 到了,本来13寸的 MacBook Air 也在我这次的考虑范围内,没有选它的主要原因是屏幕,Retina 屏实在好太多了,可以说这是小伙伴们目前在大众市场上能买到的最好笔记本屏幕了,没有之一,好吧,我忘了还有 Google Chromebook Pixel,不过目测感觉一般。也考虑过 15寸的 MacBook Pro (Retina),不过根据上两次的使用经验来看,15寸体积有点大,移动办公的时候不方便,不适合我的工作场景。

对于程序员、IT 屌丝、office lady 或任何每天使用电脑超过6小时的人士来说,好的电脑屏幕不但可以显著提高生产力,还能保护眼睛,说 “屏幕” 能 “保护眼睛” 可能不妥,换个说法,“和劣质屏幕相比,好屏幕能减少对眼睛的伤害”,眼睛很重要,你懂的。

没有选 MacBook Air 还有一个原因(对于我来说)就是太薄,亲,薄难道不是优点吗?有的人可能喜欢轻巧的机器,不过 MacBook Air 在我手里会有种把它折断的担心。

13 寸的 MacBook Air 和 MacBook Pro (Retina) 硬件配置差不多,MacBook Pro 的 CPU 稍微好一点。MacBook Air 标配的是 4GB 内存(可选配 8GB),MacBook Pro 标配 8GB,内存足够用了,同时开几个虚拟机都没问题。SSD 硬盘确实提升了不少性能,一些大型应用程序基本能瞬间打开,感觉很明显,目测都能看出来。

为什么国外程序员爱用 Mac?” 是几年前无意写的一篇吐槽文居然引来近两百个回复,其中不乏一些高质量的评论,实在难得。如果有人要问 Mac 的最大优点是什么?不同的人可能有不同的看法,个人认为,Mac 最大的优点是生产力,Mac 极大的提高了本人的工作效率。通过一流的软件和硬件设计 Mac 帮助使用者简化了操作、简化了配置、简化了界面,大幅提高了使用者的生产力。

Life is short, get a Mac:)

macbook pro with retina display
macbook pro with retina display