在MacBook上安装Gentoo

制作Gentoo Linux安装U盘

  • 在OS X 的Terminal终端,使用以下命令将.iso文件转换成.img

hdiutil convert -format UDRW -o livedvd-amd64-multilib-20140826.img livedvd-amd64-multilib-20140826.iso

这里选择使用livedvd而不是常用的minimal是因为:

Mac设备需要使用EFI stub loader,但是需要注意EFI限制了boot loaderc参数,所以需要将参数结合到内核中 (How to install Gentoo ONLY Mid-2012 macbook airarrow-up-right)。UEFI Gentoo Quick Install Guidearrow-up-right指出需要使用UEFI-enabled启动介质,如LiveDVD或者Gentoo-based SystemRescueCDarrow-up-right,详细参考 Gentoo Handbookarrow-up-right。此外,也可以参考Arch Linux on a MacBookarrow-up-right

OS X会自动添加.dmg文件名后缀,所以实际生成的文件名是livedvd-amd64-multilib-20140826.img.dmg

OS X的hdiutil支持各种镜像文件的转换,例如.iso文件的格式,称为UDTO,则可以使用如下命令转换img文件到iso文件,类似如下:

hdiutil convert -format UDTO -o Fedora-Server-DVD-x86_64-23.img Fedora-Server-DVD-x86_64-23.iso
  • 检查当前可用设备,可以看到插入的U盘的对应设备

diskutil list

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *16.0 GB    disk2
   1:                 DOS_FAT_16 NO NAME                 209.7 MB   disk2s1
   2:                 DOS_FAT_32 DATA                    15.8 GB    disk2s2
  • 卸载掉被挂载的分区

sudo diskutil unmountDisk /dev/disk2s2
  • 执行镜像写入U盘

安装

rEFInd

MacBook使用EFI stub loader,需要安装rEFIndarrow-up-right来管理启动

  • 重启主机,在听到chime声音的时候按Command+R(进入Mac的recovery模式)

  • 当OS启动后,选择 Utilities -> Terminal

  • 进入到下面的目录(和你存放refind下载解压缩的目录有关,这里假设用户名是jerry,所以用户目录就是/Volume/OS X/Users/jerry

再次启动系统,参考在Mac上双启动linux方式划分好用于Linux的分区,就可以开始安装。

磁盘设备准备

参考 Preparing the disksarrow-up-right

建议使用GPT分区,但是对于使用BIOS-based主机中使用GPT,则会导致双启动Microsoft Windows失败。这是因为当Windows检测到GPT分区标记时会从EFI启动。

使用UEFI

当将Gentoo安装在使用UEFI来启动操作系统(代替BIOS)的诸暨市,注意需要创建一个EFI系统分区。EFI系统分区需要是一个FAT32分区(或者在Linux系统中显示为vfat):

如果启动分区不是使用FAT32(vfat)文件系统,则系统UEFI firmware将不能找到Linux内核和启动系统

分区的数量

分区的数量高度依赖环境,良好的文件系统分区可以提高性能。对于内存足够的系统,甚至可以不使用swap空间,但是对于使用hibernation功能,则需要使用swap空间来存储整个内存

使用parted来划分分区

然后print命令显示当前分区

可以看到第一个分区是系统的EFI启动分区,并且是vfat文件系统,可以看到Mac主机的默认分区表就是使用GPT,所以不需要改变分区类型。(更改分区类型会导致磁盘所有数据擦除

删除分区2和3,只保留EFI分区

创建新的Linux分区( /boot 分区 256M / 分区 56G ,保留6G左右作为OP)

保留6G空间不分配是因为MacBook Air使用SSD作为存储,需要预留一些空间不使用作为OP,可以提高访问性能和延长SSD使用寿命

使用EXT4文件系统 - SSD存储的EXT4文件系统优化

最后的分区

不过,参考Intel SSD存储优化,使用secter作为单位,设置4k对齐,采用如下的分区(64G的SSD保留6G)

对于 128G 的SSD分区如下(保留10G)

parted /dev/sda中,输入unit s,然后计算并调整边界

创建文件系统

对于小的分区(小于8GB),当使用ext2,ext3或ext4,需要使用相应的参数以便保留足够的inode。mke2fs使用bytes-per-inode参数来计算需要使用多少inode。对于小分区,将建议增加inode数量

ext2,使用以下命令

在ext3和ext4,添加-j参数激活日志

以下是实际操作记录

然后挂载文件系统

安装stage tar文件

下载stage包

验证SHA512 checksum

或者使用

验证 Whirlpool checksum

对比存储在.DIGESTS(.asc)文件中的值确认文件没有被破坏

解压缩

p参数表示Preserve permissions,--xattrs表示包含在归档中的扩展属性

配置编译参数

编辑 /mnt/gentoo/etc/portage/make.conf

以上是基本配置,后续可以再做调整

为了能够从最快的镜像网站同步,可以执行以下命令添加最快镜像的3个站点到make.conf - 参考 GENTOO_MIRRORSarrow-up-right

复制DNS信息

挂载文件系统

--make-rslave参数在后面安装的systemd支持所需

进入新系统

如果ssh再次登陆则还要执行一遍

配置portage

安装一个portage snapshot

如果要更新portage,则使用emerge --sync,这个命令使用rsync协议同步最新portage

如果同步后有提示需要你阅读新消息,则使用命令

来查看提示信息

配置正确的profile

profile是任何Gentoo系统的构建块。它不仅设置默认的USECFLAGS以及其它重要的变量,而且它还锁定系统到一系列包版本

显示输出

如果要构建纯64位环境,没有任何32位应用程序和库,可以使用non-multilib profile

配置USE变量

USE是Gentoo提供给用户最有力的变量,应用程序可以被编译支持或不支持某些特性。

所有USE flags的完整描述见 /usr/portage/profiles/use.desc

如果要完全自己控制参数,可以默认忽略所有USE设置,即开头使用 -*

配置时区

BIOS时间设置local模式

编辑 /etc/timezone 设置

编辑 /etc/conf.d/hwclockclock="UTC" 修改为 clock="local" 表示系统时间是本地时间而不是格林威治时间

/etc/localtime 做软链接指向时区

矫正系统时间

启动前要具备 openrc 环境

将矫正后的时间写入BIOS

配置locales

编辑 /etc/locale.gen

至少要设置一个UTF-8 locale

然后运行

重新加载环境

设置locale方法参考 Localization/Guidearrow-up-right

选择默认locale

然后 eselect locale set 4 设置en_US.utf8

其实就是创建了 /etc/env.d/02locale 配置文件

# 安装源代码

Gentoo提供了几种内核源代码,对于amd64-based系统,建议使用sys-kernel/gentoo-sources

编译内核源代码有两个方式

  • 手工配置并编译

  • 使用genkernel工具自动编译和安装Linux内核

为方便编辑文件,安装vim

emerge一个sys-apps/pciutils来使用lspci获取主机的硬件信息

检查系统硬件

可以看到2011年版MacBook Air 11 硬件配置如下

2014年版MacBook Air 13

注意:2011年MacBook Air的USB是2.0版本,使用的是EHCIOHCI驱动,而2014年MacBook Air是USB 3.0版本,使用的是xHCI驱动。我最初编译内核是在2014年的MacBook Air 13上,同样的配置在2011年MacBook Air 11上需要修改USB驱动选项(或者都编译成模块方式),否则会导致键盘无法使用(键盘是通过USB驱动)。

MacBook Air 11的无线网卡 Broadcom Corporation BCM43224 802.11a/b/g/n (rev 01) 可以使用开源驱动b43(参考Broadcom 43xxarrow-up-right),但是MacBook Air 13的无线网卡Broadcom Corporation BCM4360 802.11ac Wireless Network Adapter (rev 03)无法使用开源驱动,需要使用闭源的net-wireless/broadcom-sta来驱动。

配置内核

编译

有关无线网络设备,参考 Wifiarrow-up-right

MacBook Air 11使用的无线网卡是Broadcom b43,需要安装 sys-firmware/b43-firmwarearrow-up-right

还需要安装需要的 sys-kernel/linux-firmwarearrow-up-right

内核配置参考 Apple Macbook Pro Retinaarrow-up-right,我遇到过编译后内核启动无法使用键盘和声卡问题

配置rEFInd

参考 Apple_Macbook_Pro_Retina Bootloaderarrow-up-right

挂载EFI分区

可以看到这个分区有EFI目录,我们需要将编译好的内核存放到这个分区

每次编译内核需要,需要编辑 /Volumes/efi/refind/refind.conf来添加内核,就如同使用GRUB的方式。在最后添加一段(不需要的内容清理掉)

这里PARTUUID是分区UUID,需要使用blkid命令获得 (参考Why can't I specify my root fs with a UUID?arrow-up-right

使用命令

可以看到如下输出

其中 f99cd3be-245e-4dcb-8594-ac21d1fe3d83 就是UUID,需要输出PARTUUID则使用blkid命令(这个命令更完整输出UUIDPARTUUID

输出内容类似如下:

有关通过UUID方式持久化块设备名字,参考 [Arch Linux文档:Persistent block device naming (简体中文)](https://wiki.archlinux.org/index.php/Persistent_block_device_naming_(简体中文arrow-up-right))

内核模块

需要自动加载到内核模块配置在 /etc/conf.d/modules,并且可以按照需要添加内核参数

要查找所有可用模块,运行find命令

安装firmware

一些驱动需要在工作前加载firmware,通常是网卡,特别是无线网卡

文件系统

创建 /etc/fstab 内容

有关fstab使用UUID参考 [Arch Linux文档:fstab (简体中文)](https://wiki.archlinux.org/index.php/Fstab_(简体中文arrow-up-right))

使用UUID是为了避免系统启动时因为磁盘设备识别变化而导致无法挂载文件系统

网络信息

编辑 /etc/conf.d/hostname

配置网络 /etc/conf.d/net - 所有的网络信息都在这个配置文件,有关不同配置案例解释位于 /usr/share/doc/netifrc-*/net.example.bz2 ,可以通过net-misc/netifrc获得

配置静态IP的案例/etc/conf.d/net

配置动态HDCP案例

设置启动时自动启动网络

hosts文件 - /etc/hosts

系统信息

设置root密码

Init和启动配置

Gentoo可使用 OpenRC ,这样就使用 /etc/rc.conf 来配置启动服务

系统日志服务

采用systemd可以不需要

Cron服务

文件索引

远程访问

文件系统工具

默认已经安装了ext文件系统工具 e2fsprogs

网络工具

安装dhcp客户端

安装bind(DNS)客户端工具

无线

参考 Wifiarrow-up-right

安装b43(仅适用于MacBook Air 11 2011版)

注意:需要加载私有firmware的b43驱动需要编译成模块,不能直接编译进内核。

不过,重启以后依然无法识别无线网卡,最后还是参考 Apple Macbook Pro Retina - Closed source Broadcom driverarrow-up-right,但是这个驱动 不支持 802.11n

MacBook Air 13的Broadcom BCM4360不能使用开源的b43驱动 - 参考Linux wireless b43文档arrow-up-right可以看到b43不支持BCM4360,建议使用wl。所以还是参考Apple Macbook Pro Retina - Closed source Broadcom driverarrow-up-rightGentoo无线网卡安装之broadcom-sta(wl)篇arrow-up-right使用闭源驱动。

内核配置

然后执行

注意:每次升级内核都需要重新编译broadcom-sta驱动

上述安装 broadcom-sta 提示内核配置需要屏蔽掉 BCMASSBMAC80211PREEMPT_RCU(不要设置Preemption Model成"Preemptible Kernel",应该选择其他选项),不能设置CONFIG_PREEMPT

上述安装完成后会在 /lib/modules/uname–r/net/wireless/ 目录下产生wl.ko驱动文件。重启操作系统后,使用ifconfig可以看到新的无线网络设备名字wlp3s0

安装linux-firmware

参考 wpa_supplicantarrow-up-right

  • 配置802.1q认证

wpa_supplicant配置实现802.1q认证后使用网络:

配置/etc/wpa_supplicant/wpa_supplicant.conf

启动wpa_supplicant服务和dhcpcd服务,就可以获得网络分配ip并连接上网络

有线网络连接配置类似,配置一个/etc/wpa_supplicant/wpa_supplicant_lan.conf,内容如下

然后使用一个start_lan.sh脚本来连接启动wpa_supplicant_lan.conf认证(dhcpcd已经启动),同样也能通过有线访问公司网络

选择boot loader (仅供参考,实际MacBook Air使用UEFI不需要grub)

默认使用GRUB2

配置GRUB2

创建配置

内核配置参考

参考 Apple Macbook Pro Retina Kernel Configurationarrow-up-right 配置内核

驱动

使用Apple USB以太网卡是AXIS网卡,需要编译支持

重启系统

触摸板

MacBook的触摸板非常灵敏,并且支持tap to click(也就是轻触等同于点击),非常方便使用。不过,默认在X Window下没有启用这个功能,导致非常不习惯。

参考 Tuning the Macbook touchpad in Linuxarrow-up-right,可以使用如下脚本命令实现

解释:参考 Tap-to-click not working in Ubuntu 12.04arrow-up-right

TapButton(number) sets the mouse event to trigger when you tap your trackpad with (number)fingers. "0" means disabled, "1" means left-click, "2" means middle-click, "3" means right-click.

即,单指轻触是左键,双指轻触是中键,三指轻触是右键

另外,发现键盘输入的时候,手掌很容易碰到触摸板导致鼠标漂移输入混乱。

Touchpad Synapticsarrow-up-right提供了详细的触摸板配置说明,可以参考

中文设置

  • 安装ibus

我使用KDE桌面,所以安装app-i18n/ibus-qt,对于Gnome环境,安装app-i18n/ibusGentoo IBusarrow-up-right

遇到编译报错

  • 安装后在普通用户环境下设置

只要基本设置就可以

  • 在用户目录 ~/.xinitrc 中添加

然后重新登录就可以使用。

gentoo升级经验

如果只是常规更新和升级软件包,使用如下命令

如果想完全重新编译整个系统

在编译过程中如果有某个软件包失败,可以采用暂时跳过 emerge --resume --skipfirst -avte world ,等整个系统基本完成后,再单独解决个别软件包编译安装问题。

删除软件包以及无用的依赖软件包 (参考 Safely uninstall a package in Gentooarrow-up-right

参考

Last updated