gentoo 安裝在虛擬機上

1. 基本环境

我使用的是笔记本电脑,Gentoo安装在虚拟机上,当然此篇教程同样适用于非虚拟机环境!同时为了安装的顺利,也强烈推荐使用真实环境安装!

虚拟机 CPU 内存 存储
vmware workstation 12 pro core i7 3610 qm 8G 30G hdd

1.1 参考资料

最最最 重要的参考文档就是Gentoo的官方handbook和Gentoo wiki了。记得一定要看官方的英文版的,比较权威,而且比较新。国内的一些翻译的虽然也不错,不过有点过时,你可能因此引发一些奇怪的错误。

如果你有耐心看官方文档,其实建议别看我的教程了,因为肯定没有handbook说的好和完整,而且我也是按照他来的^_^

官方手册地址如下: Gentoo Handbook

1.2 为什么写这个教程

Gentoo的自由选择和独特的包管理深深地吸引了我!仅以此文记录我基于stage3安装Gentoo的过程。记录是为了更好的学习和回顾,也梳理一下自己容易犯的错误和学到的知识点!

2. 基本介绍

安装前准备好如下:

重要提示:请务必在vmware使用IDE的硬盘,试过STAT和SCSI无论怎么都过不了,害得我装了N次!!!!

2.1 关于minimal cd和stage 3以及基本安装过程

3. 安装准备

3.1 设置网络和ssh访问

为了方便ssh连接,我们就用密码登入,记得修改

vi /etc/ssh/sshd_config 
/ 搜索PasswordAuthentication yes  改成yes

3.2 分区

使用parted工具来分区,采用GTP,划分EFI分区。parted工具使用optimal选项更好的进行对齐。

#对sda分区
parted -a optimal /dev/sda

#设置GTP label
mklabel gpt

#使用mb作为单位
unit mib

#划分4个分区,分别给GRUB2,EFI,swap和根分区
mkpart primary 1 3 
name 1 grub
set 1 bios_grub on
print
mkpart primary 3 131
name 2 boot
mkpart primary 131 643
name 3 swap 
mkpart primary 643 -1
name 4 rootfs
set 2 boot on
print
quit

3.3 创建文件系统

mkfs.vfat /dev/sda2
mkswap /dev/sda3
swapon /dev/sda3
mkfs.ext4 /dev/sda4

3.4 挂载文件系统

mount /dev/sda4 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda2 /mnt/gentoo/boot

如果虚拟机关过了,下次记得要重新过载下再继续安装哟!

3.5 下载解压stage 3

#下载到gentoo目录下
cd /mnt/gentoo

links http://mirrors.163.com/gentoo/releases/amd64/autobuilds/current-stage3-amd64/

#解压,xattrs把包含的扩展属性也一起解压
tar xvjpf stage3-amd64-20151001.tar.bz2 --xattrs

下载stage3-amd64-20151001.tar.bz2 当然你也可以直接迅雷下载下来传递给虚拟机(通过xftp),这样可能快点!

3.6 设置下安装包时候的任务并行度

我是4核的就设4个

vi /mnt/gentoo/etc/portage/make.conf

#增加一行
MAKEOPTS="-j4"

4. chrooting

改变根目录,切换到stage3解压出来的gentoo环境中。这个解压出来的基本环境就是你要安装的属于自己的Gentoo.不过现在离完全安装好还远着呢。

4.1 设定一个较快的源(推荐163的,国内比较快也比较更新及时)

空格表示选中,回车确认!

# 安装包的源,推荐163
mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf
#同步SYNC的服务区,选个 china的就行了
mirrorselect -i -r -o >> /mnt/gentoo/etc/portage/make.conf

4.2 拷贝DNS信息

cp -L /etc/resolv.conf /mnt/gentoo/etc/

4.3 挂载必要的文件系统

在把root切换到新的环境时需要保证以下文件系统正常挂载。如果虚拟机重启过了继续之前的安装,不要忘记挂载这些文件哦.


# /proc伪文件系统,通过LINUX内核提供给环境一些重要信息
mount -t proc proc /mnt/gentoo/proc

# sys也是一个伪文件系统,和proc很相似,提供一些更加结构化的信息,这里的--make-rslave是之后使用systemd需要的
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys

# /dev由设备管理器udev管理,下面是所有设备文件。这里rbind意思就是当访问/mnt/gentoo/dev设计上就是访问/dev,毕竟你现在自己的Gentoo还远远没装好呢!
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev

4.4 切换到新的环境

# 根目录从/切换到了/mnt/gentoo
chroot /mnt/gentoo  /bin/bash

#重新生效环境变量
source /etc/profile

#给新的环境设置一个标记,避免误解
export PS1="(chroot) $PS1"

5. portage 配置

portage是Gentoo的核心技术,是一个软件包管理器。它管理着所有的软件包。

5.1 更新portage tree到24小时内最新

#更新portage tree,将现有软件包更新到24小时内最新,使用quiet模式来加速
emerge --sync
#或者
emerge --sync --quiet

5.2 选择profile

CFLAGS是配置C编译器选项的一个环境变量;USE变量在编译安装包的时候对包进行裁剪。通过选择系统提供的几个profile模板可以默认的USE,CFLAGS值。

#罗列系统提供的预制的profile模板
eselect profile list
# no-multilib *选项会设置成纯64位的系统,32位的包和库全部会被弃用
eselect profile set 11

5.3 配置USE变量

Gentoo强大的变量,可以让你在编译安装包的时候自由选择弃用或者启用相应的支持。

#查看当前的USE配置
emerge --info | grep ^USE
#查看USE变量的使用关键字描述
less /etc/portage/profile/use.desc
#修改USE的设置(这里增加的USE都是的profile的default设置基础上增加)
vi /etc/portage/make.conf

6. 语言时区设置

#该目录下保存时区信息
ls /usr/share/zoneinfo
#中国只有上海可以找到,写入到/etc/timezone文件内
echo "Asia/Shanghai" > /etc/timezone
#通过配置系统包按照/etc/timezone更新时间
emerge --config sys-libs/timezone-data

#可选:安装中文字体
emerge wqy-zenhei
emerge wqy-microhei

#指定Local,本地编码
nano -w /etc/locale.gen
#去掉一些项前面的注释,没有则自己添加
en_US ISO-8859-1
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8

#检测下是否可用
locale -a 

#设定全局默认编码(也可以使用eselect locale list | grep zh_CN然后通过set来设置)
nano -w /etc/env.d/02locale
#添加如下内容
LANG="zh_CN.UTF-8"
LC_COLLATE="C"

#设定用户级的locale
nano -w ~/.bashrc
#添加如下
export LANG="zh_CN.UTF-8"
export LC_COLLATE="C"

#更新所有环境变量和应用更改
env-update && source /etc/profile
source ~/.bashrc

#这时候标记没了。。。再加下吧。。。
export PS1="(chroot) $PS1"

7 下载编译内核源代码

下载内核源码了,这个是你启动你自己的Gentoo的必须,现在使用的环境调用的是live cd的内核。

7.1下载内核源码

emerge --ask sys-kernel/gentoo-sources
ls -l /usr/src/linux

7.2 编译内核源码

这里用两种方式,一种是手动编译,另外一种使用genkernel工具。毫无疑问手动的方式更优,能更好的针对个体来对编译进行优化设置。我们选用这种方式。

cd /usr/src/linux
make menuconfig

其他内容保持默认,以下内容勾选

#比较下面哦
Processor type and features  --->
    [*] EFI runtime service support 
    [*]   EFI stub support
General setup  --->
    [*] Configure standard kernel features (expert users)  --->
里面子菜单的可以保持默认
#各种文件系统也一定要写入内核,特别是你们自己用到的,尽量都勾选上
File systems --->
(Select one or more of the following options as needed by your system)
  <*> Second extended fs support
  <*> Ext3 journalling file system support
  <*> The Extended 4 (ext4) filesystem
  <*> Reiserfs support
  <*> JFS filesystem support
  <*> XFS filesystem support
  ...
  Pseudo Filesystems --->
    [*] /proc file system support
    [*] Virtual memory file system support (former shm fs)

vmware使用使用SCSI的话,务必勾选上相关的SCSI支持 其他控制器的类型也要选择

#这个是SCSI磁盘设备模块,必须选择。

  Linux Kernel Configuration
    -> Device Drivers
       -> SCSI device support
          - > SCSI disk support

 #这个是BusLogic设备驱动模块。使用这个设备的的朋友需要选取。

  Linux Kernel Configuration
    -> Device Drivers
       -> SCSI device support
        -> SCSI low-level drivers
          -> BusLogic SCSI support

 #这个是LSI Logic设备驱动模块。使用这个设备的的朋友需要选取。

  Linux Kernel Configuration
    -> Device Drivers
      -> Fusion MPT device support
          -> Fusion MPT (base + ScsiHost) drivers

编译

前面记得已经修改过make.conf并行来执行哦!

make && make modules_install
make install

UEFI启动拷贝内核image到另外个目录

mkdir -p /boot/efi/boot
cp /boot/vmlinuz-4.0.5-gentoo /boot/efi/boot/bootx64.efi

配置modules

#查看可用模块
find /lib/modules/4.0.5-gentoo/ -type f -iname '*.o' -or -iname '*.ko' | less

#使用模块,3c59x是3Com系列网卡的驱动
nano -w /etc/conf.d/modules
modules="3c59x"

安装固件

emerge --ask sys-kernel/linux-firmware

安装genkernel

虽然不用genkernel来编译内核,不过后面systmd有用

emerge genkernel
genkernel --install initramfs

8. 文件系统配置

8.1 挂载点设置

nano -w /etc/fstab
/dev/sda2   /boot        vfat    defaults,noatime     0 2
/dev/sda3   none         swap    sw                   0 0
/dev/sda4   /            ext4    noatime              0 1

/dev/cdrom  /mnt/cdrom   auto    noauto,user          0 0

9. 网络设置

8.1 下载网络配置的例子

emerge --ask --noreplace net-misc/netifrc

8.2 自己配置网络

nano -w /etc/conf.d/net

#静态IP
config_eth0="192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255"
routes_eth0="default via 192.168.0.1"

#动态IP
config_eth0="dhcp"

8.3 开机自动启动网络

cd /etc/init.d
ln -s net.lo net.eth0
rc-update add net.eth0 default

10. 初始化和启动设置

10.1 配置服务、启动和关机

nano -w /etc/rc.conf

11. 其他工具安装

11.1 日志工具logger

emerge --ask app-admin/syslog-ng
rc-update add syslog-ng default

11.2 Cron工具(用来定时自动执行命令)

emerge --ask sys-process/cronie
rc-update add cronie default
#如果使用dcron或者fcron还要执行这句
crontab /etc/crontab

11.3 文件索引工具

emerge --ask sys-apps/mlocate

11.4 固件

emerge --ask sys-kernel/linux-firmware

11.4 远程访问

默认设置为启动

rc-update add sshd default

11.5 dhcp客户端

emerge --ask net-misc/dhcpcd

12. 选择boot loader(UEFI方式)

注意:在虚拟机上使用efibootmgr工具,然后使用UEFI引导会出错,该方式建议在真实环境中使用! ps: 我没有试过grub2工具来使用UEFI引导,可能这样可以成功,有兴趣的同学可以试试。我用efibootmgr通过UEFI,试了各种可能性都不行。当然我觉得这是vmware和gentoo本身的问题,在vmware通过UEFI引导gentoo,我并没搜索到成功的例子!

我们选择比较先进的UEFI方式来启动,因此我们选择采用工具efibootmgr而不是grub2

12.1 安装efibootmgr

emerge --ask sys-boot/efibootmgr

12.2 使用一个支持UEFI引导的live cd重新引导系统

!!重要:必须使用UEFI启动的系统来执行efibootmgr命令才有效,否则报错not support this system 这里推荐使用:ubuntu 的 livel cd,如果想方便点可以直接使用desktop的iso,比如我就是这么做的!

加载ubuntu,挂载相应的disk然后执行efibootmgr

#更改ubuntu密码切换到root
sudo passwd root
su root

#挂载文件系统和disk
mkdir /mnt/gentoo
mount /dev/sda4 /mnt/gentoo
mount /dev/sda2 /mnt/gentoo/boot
mount -t proc proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev

#安装下efibootmgr先
apt-get install efibootmgr

#efibootmgr配合initramfs来加载系统,直接在ubuntu live cd环境下执行
efibootmgr --create --disk /dev/sda --part 2 --label "Gentoo Installed By KamiWan" --loader "\efi\boot\bootx64.efi"

13 选择boot loader(bios引导)

采用vmware来安装gentoo的同学建议使用bios来引导,使用UEFI无法引导gentoo

#安装grub2
root #emerge --ask sys-boot/grub
#配置grub2
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub/grub.cfg

当输出结果中表示找到了启动image的时候,就可以了!

#输出
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.16.5-gentoo
Found initrd image: /boot/initramfs-genkernel-amd64-3.16.5-gentoo
done

14 如果无法引导采用genkernel编译内核

由于内核编译的选项错综复杂,你少勾选了,或者虚拟机本身的原因导致的无法启动,那么请使用genkernel来编译内核吧。然后把生成的内核印象和initramfs使用起来即可

注意,还是需要挂载必要的文件系统哦!

genkernel all
mkdir -p /boot/efi/boot
cp /boot/kernel-genkernel-x86_64-4.0.5-gentoo /boot/efi/boot/bootx64.efi

efibootmgr -c -d /dev/sda -p 2 -L "Gentoo" -l "\efi\boot\bootx64.efi" initrd='\initramfs-genkernel-x86_64-4.0.5-gentoo'

如果需要删除启动的条目

#查看现状
efibootmgr -v
#删除启动条目
efibootmgr -b 编号 -B
執行時間: 0.0649 秒, 瀏覽次數: 4170