Gentoo安装与应用实践

我从去年开始接触LINUX系统,开始的时候觉得linux系统完全是个天方夜谭,连最起码的:在桌面情况下,进入终端系统,我都很困难。后来,我开始看网上的视频教程,学习别人的操作步骤,模仿别人的操作。再过了一阵子,我不甘心一直这样,于是我开始了自己的探索之旅。

开始,我为了追求大众化,想到了LINUX的全球霸主厂商——readhat,于是开始了我的Fedora之旅,初次用linux的我不知道其中有什么应用价值,只是想把它变成windows的替代品,于是我开始搞一些现在看起来很没有意义的东西。后来,我看到网上的评论说:“fedoraredhat的小白鼠,好的功能将来会在RHEL上体现出来,差的功能就会被淘汰掉”。于是我心有不甘,再加上由于我的升级举动、使用的不熟练,导致了内核经常性的崩溃,我失望了。于是,我开始寻找我linux之旅中的第二个发行版,因为之前很多人用ubuntu,因为其简单易用,很多操作也是点点鼠标就行了。但是,这时我使用linux的方向发生了变化,我并不追求那些花哨的东西,开始研究一些命令之类,当然也都是一些日常的操作,因为平时还要上课,也就没什么时间搞。这一时期,我使用的是Debian系统,最近我才知道原来Debian做服务器并不比RHEL逊色。当时的想法是Debian反正是Ubuntu他爸,有什么问题可以有玩Ubuntu的人撑腰,一下子自信心大涨。于是使用了一段时间的Debian,又感觉它的软件版本太旧了,不符合我追新的个性。于是,我开始寻找那种可以经常更新的linux版本,终于找到了archgentoo两个版本。开始,我不顾自己依然是个小白,选择了编译安装的gentoo,由于心理上的害怕,我在虚拟机上开始尝试gentoo安装,一次不行两次,两次不行三次,这样一连十多次,每次都是失败,然后不甘心了,我怀疑自己是依赖虚拟机的方便了。放寒假了,我迫不及待地在实体机上开始尝试安装gentoo,又装了大约一个星期的时间,终于成功了一次,但是后面的桌面系统还是没有搞出来,寒假很快过去,水平并没有什么长进,但是基本系统命令都掌握了,后来认识到情况的不容乐观,我又装回了Ubuntu,就这样,我用Ubuntu一个多月之后,知道有UEFI,而自己的电脑又支持,最后经历了升级BIOS的心惊胆战之后,终于用上了UEFI+GPT启动的Ubuntu,心里很激动。再过一阵子,折腾的心又起来,迫不及待地换到了ARCH,直到这个暑假,我一直使用arch,这是我使用时间最长的linux发行版。

暑假回来了,对于寒假里折腾gentoo的遗憾,我决定弥补一下,同时我很自信地认为自己水平还可以了。于是,我把机器上的所有系统全部删除了,只装了一个gentoo




下面是我的安装过程:

采用UEFI引导,GPT磁盘分区表格式,EFISTUB KernelsystemdKDE

  1. 使用ubuntulivecd光盘,在UEFI引导下启动(启动前进BIOS更改启动模式为UEFI,关闭SecureBoot)。

  2. 进入livecd,开启终端,设置root密码,切换到root账户。

  3. 使用partedgdisk分区,我的分区方案是(EFI分区,//usr/portage/home),这样分区的理由是:这个系统以后是我日常使用的系统,并且计划运行虚拟机。

  4. 添加文件系统:除了EFI分区是fat32linux下的vfat)分区,其他均为ext4分区。

  5. 挂在分区:

    mkdir –v /mnt/gentoo 
    mount –vt ext4 /dev/sda2/mnt/gentoo 
    mkdir –pv /mnt/gentoo/boot/ 
    mkdir –pv /mnt/gentoo/home 
    mkdir –pv/mnt/gentoo/usr/portage 
    mount –vt vfat /dev/sda1/mnt/gentoo/boot
    mount –vt ext4 /dev/sda3 /mnt/gentoo/usr/portage
    mount –vt ext4 /dev/sda4 /mnt/gentoo/home

  1. 下载并解压stage3

    cd /mnt/gentoo 
    tar –xvf stage3*.tar.gz

  2. nano –w /mnt/gentoo/etc/portage/make.conf
    添加Gentoo源:GENTOO_MIRRORS="http://mirrors.163.com/gentoo"
    
    添加portage源:RSYNC=”rsync://mirrors.163.com/Gentoo-portage”
    
    添加ACCEPT_KEYWORDS=”amd64 x86”
    
    ACCEPT_LICENSE=”*”
    
    MAKEOPTS=”-jN”(N为处理器核心数加1,Intel的可以多设一点,因为有超线程技术。)
    
    LINGUAS=” zh_CN zh_TW”
    
    修改CFLAGS –march=native –fomit-frame-pointer
    
    修改USE:-gnome –gtk qt4 kde cdr alsa dvd 
    顺便贴上我的make.conf
    # These settings were set by the catalyst build script that automatically
    # built this stage.
    # Please consult /usr/share/portage/config/make.conf.example for a more
    # detailed example.
    ACCEPT_KEYWORDS="amd64 x86"
    ACCEPT_LICENSE="*"
    CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer"
    CXXFLAGS="${CFLAGS}"
    # WARNING: Changing your CHOST is not something that should be done lightly.
    # Please consult http://www.gentoo.org/doc/en/change-chost.xml before changing.
    CHOST="x86_64-pc-linux-gnu"
    MAKEOPTS="-j9"
    LINGUAS="zh_CN zh_TW"
    INPUT_DEVICES="evdev synaptics"
    VIDEO_CARDS="nouveau intel"
    # These are the USE flags that were used in addition to what is provided by the
    # profile used for building.
    USE="-gnome -gtk qt4 kde alsa cdr dvd systemd X consolekit networkmanager udisks policykit"
    PORTDIR="/usr/portage"
    DISTDIR="${PORTDIR}/distfiles"
    PKGDIR="${PORTDIR}/packages"
    GENTOO_MIRRORS="http://mirrors.ustc.edu.cn/gentoo/"
    SYNC="rsync://mirrors.ustc.edu.cn/gentoo-portage/"
    
    source /var/lib/layman/make.conf
    


  1. 复制DNS信息:

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

  2. 挂在虚拟文件系统:

            

     mount –t proc /proc /mnt/gentoo/proc

     mount --rbind /sys /mnt/gentoo/sys
     mount --make-rslave /mnt/gentoo/sys
     rm -rf /dev/shm && mkdir /dev/shm
     mount -t tmpfs -o nosuid,noexec,nodev shm /dev/shm  #(由于我使用的live里的/dev/shm是一个符号链接,所以要重新挂载一下,不然chroot过后就找不到了)
     mount --rbind /dev /mnt/gentoo/dev
     mount --make-rslave /mnt/gentoo/dev


  1. 切换根目录,进入目标系统:

    chroot/mnt/gentoo /bin/bash 
    source /etc/profile
    export PS1="(chroot) $PS1"  //我觉得这部就是标记chroot,其他没什么作用

  2. 自动同步最新portage

    emerge-webrsync
    emerge --sync


  3. 选择profileKDE/systemd

    eselect profile list
    eselect profile set X

  4. 选择时区:

    echo “Asia/Shanghai”  >> /etc/timezone


  5. 使时区生效:

    emerge --config sys-libs/timezone-data

  6. 配置字符集:zh_CNzh_HK zh_TW en_US locale-gen

    cat >> /etc/locale.gen << "EOF"
    en_US.UTF-8 UTF-8
    zh_CN.UTF-8 UTF-8
    zh_HK.UTF-8 UTF-8
    zh_TW.UTF-8 UTF-8
    EOF
    

  7. 选择系统语言

    eselect locale list
    eselect locale set X
    我设置为英文

  8. 更新环境变量

    env-update && source /etc/profile

  9. 手工配置编译内核:

    emerge gentoo-sources
    
    cd /usr/src/linux
    
    make defconfig
    make menuconfig
    
    make && make install modules_install
    

     28. 我的fstab贴上:

    

# /etc/fstab: static file system information.
#
# noatime turns off atimes for increased performance (atimes normally aren't 
# needed); notail increases performance of ReiserFS (at the expense of storage 
# efficiency).  It's safe to drop the noatime options if you want and to 
# switch between notail / tail freely.
#
# The root filesystem should have a pass number of either 0 or 1.
# All other filesystems should have a pass number of 0 or greater than 1.
#
# See the manpage fstab(5) for more information.
#

#                                           

# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
#/dev/BOOT              /boot           ext2            noauto,noatime  1 2
/dev/sda1               /boot           vfat            defaults        0 0
/dev/sda2               /               ext4            noatime         0 1
/dev/sda3               /usr/portage    ext4            defaults        0 0
/dev/sda4               /home           ext4            defaults        0 0
/dev/sda5               /share          vfat            defaults        0 0
/dev/sda6               none            swap            sw              0 0
/dev/cdrom              /mnt/cdrom      auto            noauto,ro       0 0
#/dev/fd0               /mnt/floppy     auto            noauto          0 0


  1. 更改hostname,hwclock(local)

    nano -w /etc/conf.d/hostname
    在hostname=后的双引号内写上主机名
    
    nano -w /etc/conf.d/hwclock
    
    如果有windows系统,就把UTC改为local,不然会显示时间不对,没有win的忽略。

  2. 编译dhcpcd

    emerge dhcpcd 
    rc-update add dhcpcd default

  3. 编译安装systemd

    内核选项中勾选systemd

  4. 直接在make.conf中USE标记上加入systemd,然后emerge -avuDN world,会自动装好systemd

  5. 编译安装Xorg

    1、在/etc/portage/make.conf中添加显卡、输入设备信息:

    VIDEO_CARDS=”nouveau intel”(nouveau是nVidia的开源驱动)
    
    INPUT_DEVICES=”evdev synaptics keyboard mouse”


    2编译xorg驱动

    emerge linux-firmware
    
    emerge–ask xorg-drivers


    3、编译xorg-x11

    emerge–ask xorg-x11
     这里一般会提示有几个USE条件不满足,要求添加:
    cat >> /etc/portage/package.use << “EOF”
    x11-base/xorg-server udev
    x11-libs/libdrm libkms
    EOF

 
             最后编译KDEBASE 
  
        emerge -pv kdebase-meta
        看一下要写入package.use的局部use,按照上面的方法写入。



使用部分:



gentooUSE比较复杂,为了更深入地了解每一个USE的作用,我们可以编译安装gentoolkit,其中有很多命令比如:equery uses + 包名,就可以查询包的每一个USE的用法,euse可以帮助我们修改make.conf中的USE




中文输入法的安装(fcitx

由于我在全局USE中去除了对gtk的支持,为了使fcitx能够在gtk程序使用,我必须在package.use中加上fcitxgtk的支持:echo“app-i18n/fcitx gtk gtk3”,接下来我们可个编译安装fcitx了,

emerge-avt fcitx fcitx-sunpinyin

但是,这是如果我们运行fcitx&,是看不到fcitx的窗口的,怎么办呢?我又想起了gentoowikiwiki.gentoo.org,绝对是个好东西,没事多看看),还要安装kde的一个插件kde-base/kdeplasma-addons,在package.use中写上kde-base/kdeplasma-addonsfcitx,接着emergekde-base/kdeplasma-addons,最后在我们熟悉的桌面上添加wiget即可,但是也许这样你还是切换不出中文输入法的,我们必须在用户home目录下的.xprofile文件中加上:

export XMODIFIER=”@im-fcitx”

export QT_IM_MODULE=fcitx

export GTK_IM_MODULE=fcitx

加上这三行之后,再重新启动一次,我终于看见我的中文输入法,心里一阵激动。


推荐几款软件:

下载工具:ktorrent,amule

影音播放:kmplayer


我遇到的问题:


由于自己的一些原因,我第一次做EFISTUB Kernel遇到了很大的阻力:

首先启用EFI支持需要四项支持:

CONFIG_EFI_PARTITION=y

CONFIG_EFI=y

CONFIG_EFI_STUB=y

CONFIG_EFI_VARS=y

CONFIG_EFIVAR_FS=m


第一次我都没编译全,现在看到最后一个居然还是编译成模块了,真搞笑,以后再修改吧,

如果你的硬盘分区分了/usr分区的话,需要启用initramfs支持,但EFISTUBKernel就是一个EFI文件,怎么弄initramfs,我又去请教wiki先生了,他告诉我要将initramfs编译到内核,并且不能启用压缩选项,还要使用cpio的后缀,我一下子被吓傻了,后来仔细一看选项,才知道也就是一个选项而已,而后缀对于linux来说也就是个更改文件名的事,最重要的是内核启动参数的设置(也就是我们要做一个编译在内核的命令行),

下面我讲讲我的做法:

Processortype and features勾选Built-inkernel command line,在下面的Built-incommandstring里写上root的设备号(/dev/sda2这是我的)和rootfstype=ext4,还有引导程序的具体位置,所以最后写下来就是:

root=/dev/sda2 rootfstype=ext4 init=/usr/lib/systemd/systemd quiet


GeneralSetup下面勾选InitialRAM filesystem and RAM disk(initramfs/initrd)support,并在下方的子选项中填写存储initramfs的位置,我的是/boot/initramfs-x86_64-3.12.21.cpio,注意这个后缀一定要是cpio,如果不是的话,编译内核的时候会出错的。

最后我们使用makemakeinstall来编译安装内核到/boot上。

make-jN && make install modules_install


这时我们在/boot分区已经可以看到我们编译好的内核、initramfsconfig信息,下一步是要把内核变成efi文件,怎么变呢?也是很简单的,EFI引导起默认是扫描EFI分区上Boot目录下的efi文件,然后把启动权交给它,知道这层原理之后,我们可以在/boot分区上创建几个目录:

mkdir -pv /boot/EFI/Boot


接下来把内核文件改名为bootx64.efi并复制到这个目录下:

cp /boot/内核名 /boot/EFI/Boot/bootx64.efi



至此我们已完成EFISTUB Kernel的制作,我们可以不用安装任何引导器,直接使用EFI引导引入系统了。


U盘无法使用的问题:

我的U盘是fat32格式的,插上去KDE毫无反应,第一反应是内核的fat支持没有编译,后来进入相关内核选项,发现是编译好的,第一个错误排除,那还能有什么错误呢?我以为KDE无法自动挂载USB设备,于是我百度看下如何使用KDE的自动挂载功能,百度告诉我要启用全局的hal应用,于是我启用了,并

emege -avtDN world

一下,发现没有东西要重新编译,再到群里一问,才知道这个包早已不用了,为此还被群里的菜老师狠狠奚落一下,他告诉我用 udisks ,还告诉我要加 USE ,但我偏偏头脑愚钝,又去百度了,结果半天也无果,于是又去 wiki 看看,告诉我要用 DBUS polkit ,于是全局加上这三个 USE ,再次 Emerge-avtDNworld ,还是没有任何包可以编译,心里想肯定不是这几个包的问题,况且 systemd 还和 consolekit 冲突,怎么可能让两个冲突的包都在全局的 USE 中呢?于是我打开 google 苦苦搜寻,终于找到了 partprobe 命令,
partprobe /dev/sdb (/dev/sdb是设备号,根据自己情况换)

,我终于打开了我的 U 盘,至此问题全部解决,我两天的努力也得到了回报。


NetworkManagerdhcpcd:

这两个包,networkmanager需要添加到全局USE中,

emerge -avt networkmanager dhcpcd

,后期开机启动的时候只需要启动networkmanager,如果两个都设置开机启动的话,是无法使用networkmanager的。


无线网卡显示site0

这个问题一般可以通过编译linux-firmware这个包来解决,只要你是内核驱动都编译正确的话。内核编译驱动的时候可以有两种手段找到正确的驱动程序:

1lspci查看硬件的信息,然后到内核里去找

2、编译内核前可以先执行make defconfig,再执行make menuconfig,这样系统会根据目标系统的相关信息先生成一个config文件,然后自己再在上面修改,会比较方便点。

编译内核是个精细活,不要期待一次性优化到最佳,后期再慢慢优化。



参考资料:

1http://unix.stackexchange.com/questions/52206/partition-table-not-recognized-by-linux-kernel

2http://wiki.gentoo.org/wiki/EFI_stub_kernel

3http://wiki.gentoo.org/wiki/KDE

4http://wiki.gentoo.org/wiki/Xorg/Configuration

5http://wiki.gentoo.org/wiki/Fcitx

6https://wiki.gentoo.org/wiki/NetworkManager



你可能感兴趣的:(Linux)