Gentoo 服务器安装手记

1951 查看

Gentoo 安装方案

第一步:下载安装介质

GentooMinimal Install CD 每周都会自动构建一个版本,服务器一般使用最新的 x86_64 版本。 国内的镜像下载地址是:

第二步:启动机器,设置网络环境和开启 SSH 服务

Minimal Install CD 光盘启动进入到 livecd 的环境,在安装前需要设置网络环境。 如果网络环境里配置了 DHCP,通过命令 ifconfig 命令检查机器是否分配到IP。

可以通过下面的几条命令自行设置,也可以使用 net-setup 命令进行设置:

ifconfig eth0 192.168.1.10/24 #设置IP地址:192.168.1.10
route add default gw 192.168.1.1 #设置网关:192.168.1.1
echo nameserver 192.168.1.1 > /etc/resolv.conf #设置域名解析服务器

Important

实际过程中有可能遇到从 Minimal Install CD 启动后,系统无法找到网卡,使得安装无法进行下去。遇到此类问题需要查看网卡的硬件情况,查看是否有加载对应的驱动模块。譬如在 DELL R610 机型中使用 Broadcom Corporation NetXtreme II 5709C 双端口千兆以太网卡时遇到虽然加载了驱动模块,但是依然无法识别网卡的情况,最终先将驱动模块删除再重新加载后才使得网卡设备被识别。

lspci -k #查询到网卡的驱动模块为bnx2。
lsmod #查询是否加载了bnx2驱动模块。
rmmod bnx2 #移除加载的bnx2驱动模块。
modprobe bnx2 #重新加载驱动模块。
net-setup eth0 #设置网络。

Important

如果使用新版本的 Minimal Install CD,由于 udev 版本已经升级到 200 以上,不一定能使用 eth0 来连接网络,新的连接的名称可以用以下代码来获得:

udevadm test-builtin net_id /sys/class/net/eth0 2> /dev/null

名称一般为 enps

启动 SSH 服务:

/etc/init.d/sshd start #启动ssh服务

设置 root 用户的密码:

passwd

现在可以使用 PuTTY 或者 Terminal 远程登录到机器进行安装。

第三步:准备使用 fdisk 命令对硬盘分区

fdisk /dev/sda
The number of cylinders for this disk is set to 6527.
There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):

fdisk 的几个基本命令:

  • n 创建一个分区
  • p 显示所有的分区
  • a 指定一个分区为启动分区,显示的时候这个分区标有一个 *****
  • d 删除一个分区
  • t 改变一个分区的类型,Linux swap / Solaris 的编号是 82
  • l 显示所有的分区类型

使用这些命令为硬盘创建一个 boot 分区,一个 swap 区和一个 root 分区:

Disk /dev/sda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x5f13998e
Device Boot Start End Blocks Id System
/dev/sda1 * 1 17 136521 83 Linux
/dev/sda2 18 83 530145 82 Linux swap / Solaris
/dev/sda3 84 6527 51761430 83 Linux

使用 w 命令保存结果退出。

Important

创建两块硬盘使用 RAID 1 的情况,需要采用相同的分区格式化 sdasdb 两块硬盘,并且两块硬盘的 root 分区和 boot 分区都指定为 Linux raid autodetect 类型( fdisk 中用 t 命令指定分区类型时输入编号 fd )。

Device Boot Start End Blocks Id System
/dev/sda1 * 1 17 136521 83 Linux raid autodetect
/dev/sda2 18 83 530145 82 Linux swap / Solaris
/dev/sda3 84 6527 51761430 83 Linux raid autodetect

第四步:格式化分区并挂载到 Livecd 环境

由于 Grub 不支持 ext4boot 分区,所以 boot 分区格式化为 ext2 类型, root 分区可以格式化 ext3 或者 ext4 类型。

mke2fs /dev/sda1 #格式化ext2的boot分区
mke2fs -j /dev/sda3 #格式化ext3的root分区
mkswap /dev/sda2 && swapon /dev/sda2 #初始化和激活交换分区
#挂载分区
mount /dev/sda3 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda1 /mnt/gentoo/boot
cd /mnt/gentoo

格式化 ext4 类型的 root 分区。

mkfs.ext4 /dev/sda3 #格式化ext4的root分区

Important

创建两块硬盘使用 RAID 1 的情况,需要先使用 partprobe 命令重新读取硬盘的分区表。

partprobe /dev/sda
partprobe /dev/sdb

使用 mknodmdadm 创建节点和设备。

mknod /dev/md1 b 9 1
mknod /dev/md3 b 9 3
mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=0.90 /dev/sda1 /dev/sdb1
mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3

格式化创建的节点和交换分区。

mke2fs /dev/md1
mke2fs -j /dev/md3
mkswap /dev/sda2 && mkswap /dev/sdb2
swapon -p 1 /dev/sda2 && swapon -p 1 /dev/sdb2

挂载 md1md3 两个节点。

mount /dev/md3 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/md1 /mnt/gentoo/boot
cd /mnt/gentoo

第五步:安装最新版本的 Stage 和 Portage

使用 links 命令下载最新版本的 x86_64 Stage3portage,然后进行解压到当前目录。

links http://mirrors.sohu.com
tar xvjpf stage3-*.tar.bz2
tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr

第六步:配置编译选项

的环境是没有 VIM 的,只能使用 nano 编辑配置文件。

nano -w etc/portage/make.conf

make.conf 中添加 MAKEOPTS 参数,使用 MAKEOPTS 可以定义在安装软件的时候同时编译的数量,一般是 CPU 的数目加 1

MAKEOPTS="-j3"

添加 unicode 的全局编译参数,保证编译的软件支持 unicode 编码。

USE="bindist unicode bash-completion vim-syntax jpeg png mmx sse sse2"

添加 GENTOO_MIRRORSSYNC 参数,指定下载的镜像地址

GENTOO_MIRRORS="http://mirrors.sohu.com/gentoo/"
SYNC="rsync://rsync.cn.gentoo.org/gentoo-portage"

其它的一些常用的设置项

APACHE2_MODULES="authz_host cgi dir mime actions alias asis auth_basic auth_digest authn_alias authn_anon authn_dbd authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_owner authz_user autoindex cache cern_meta cgid charset_lite dav dav_fs dav_lock dbd deflate disk_cache dumpio env expires ext_filter file_cache filter headers ident imagemap include info log_config log_forensic logio mem_cache mime_magic negotiation proxy proxy_ajp proxy_balancer proxy_connect proxy_ftp proxy_http reqtimeout rewrite setenvif speling status substitute unique_id userdir usertrack version vhost_alias unixd socache_shmcb authn_core authz_core"
NGINX_MODULES_HTTP="addition fastcgi flv geo geoip sub access auth_basic charset dav gzip gzip_static image_filter limit_req limit_zone map memcached perl proxy realip referer rewrite secure_link ssi stub_status upstream_ip_hash userid xslt random autoindex browser cache_purge degradation empty_gif headers_more push random_index scgi split_clients uwsgi slowfs_cache upload upload_progress"
NGINX_MODULES_MAIL="imap pop3 smtp"
ACCEPT_LICENSE="*"
PHP_TARGETS="php5-4"
PHP_INI_VERSION="production"
LINGUAS="en_US zh_CN zh_TW"

第七步:切换系统

cd /
mount -t proc proc /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
cp -L /etc/resolv.conf /mnt/gentoo/etc/
chroot /mnt/gentoo /bin/bash
env-update && source /etc/profile
export PS1="(chroot) $PS1" #盘符从livecd变为(chroot)。

第八步:设定locale、时区和主机名

时区的配置文件都保存在 /usr/share/zoneinfo 中。

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Important

当服务器提供的服务需要为跨时区的应用提供服务时,且使用 MongoDBNodeJS 时要将时区设为 GMT0,避免因为服务器的时区造成数据的时间错误,减少客户端在时区判断上判断的流程。

如果需要把主机设置成格林威治标准时间,则把 GMT0 文件拷贝到 /etc/localtime

cp /usr/share/zoneinfo/GMT0 /etc/localtime

为了能够使用中文,在 locale 中添加中文 UTF-8 的支持,修改 /etc/locale.gen 文件。

nano -w /etc/locale.gen

添加:

en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK

执行 locale-gen 命令让修改的 locale 生效。

locale-gen

设定主机的名称。

nano -w /etc/conf.d/hostname

修改文件中的 hostnamegentoo

第九步:配置编译内核

emerge -avt gentoo-sources genkernel
zcat /proc/config.gz > /root/config/kernel-3.8.13.config
genkernel --color --loglevel=5 --menuconfig --save-config --makeopts=-j9 --kernel-config=/root/config/kernel-3.8.13.config all

编译后会在 /boot 目录下生成内核文件。

Important

很多软件和驱动的运行都需要有内核的支持,具体的依赖关系在此文的附录中有一些说明,这里只强调使用 RAID 1 模式时需要选择 Multi-device support (RAID and LVM) 下的全部编译选项

第十步:编辑 /etc/fstab

在默认的 fstab 文件中,BOOTROOTSWAP 需要用实际的分区名替换掉。

nano -w /etc/fstab
/dev/sda1 /boot ext2 noauto,noatime 1 2
/dev/sda3 / ext3 noatime 0 1
/dev/sda2 none swap sw 0 0

如果是 ext4 文件系统,需要将对应的 ext3 改为 ext4

/dev/sda3 / ext4 noatime 0 1

系统启动时会读取 fstab 中的配置并自动对硬盘进行挂载,因此如果有其他硬盘需要自动挂载,也需在 fstab 中进行配置。例如服务器有第二块硬盘 /dev/sdb 并分成一个分区 /dev/sdb1 ,文件系统为 ext4,需要在系统启动时挂载到 /opt,则需在 fstab 中加入如下一行配置:

/dev/sdb1 / ext4 noatime 0 1

Important

RAID 1 情况的 fstab 文件写法不同,主要是分区名应该为创建的节点名,没有为交换分区创建节点,所以2个 swap 分区都要写到 fstab 文件中。

/dev/md1 /boot ext2 noauto,noatime 1 2
/dev/md3 / ext3 noatime 0 1
/dev/sda2 none swap sw 0 0
/dev/sdb2 none swap sw 0 0

boot 分区的启动参数中 noauto 的意思是说启动分区不自动 mount 到系统中。

第十一步:系统基本配置

配置系统的网络地址、启动 SSH 服务、设置 root 用户的密码、安装一些系统的基本服务和在系统启动时启动一些服务。 eth0 根据不同机器需要改成相应名字。

echo 'config_eth0="192.168.1.10/24" ' >> /etc/conf.d/net
echo 'routes_eth0="default via 192.168.1.1" ' >> /etc/conf.d/net
echo 'dns_servers_eth0="192.168.1.1 8.8.8.8" ' >> /etc/conf.d/net

passwd

emerge -avt syslog-ng vixie-cron pciutils gentoolkit
rc-update add sshd default
rc-update add syslog-ng default
rc-update add vixie-cron default

Important

RAID 1 需要 mdadm 在启动的时候就运行,所以需要在系统安装完成之前就安装,并把它的启动级别设为 boot

emerge -avt mdadm
mdadm --detail --scan >> /etc/mdadm.conf
rc-update add mdadm boot

第十二步:配置引导程序

Gentoo 推荐使用 Grub 来引导系统, 这里介绍的配置文件写法不涉及多个系统共存,安装 grub 后配置 grub.conf 文件。

emerge -avt grub
nano -w /boot/grub/grub.conf
default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Gentoo Linux 3.8.13
root (hd0,0)
kernel /boot/kernel-genkernel-x86_64-3.8.13-gentoo root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/sda3 rootfstype=ext4
initrd /boot/initramfs-genkernel-x86_64-3.8.13-gentoo

Important

如果是 ext4 的分区,需要在 kernel 一行加入 rootfstype=ext4 的参数。

使用 grub-install 命令安装。

grep -v rootfs /proc/mounts > /etc/mtab
grub-install --no-floppy /dev/sda

Important

RAID 1 的模式不能使用 grub-install 命令安装,只能使用 grub 命令进行安装。

grub
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot/
grub/menu.lst"... succeeded
Done.
grub> root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
grub> quit

第十三步:重启进入新系统

exit
umount /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo/boot /mnt/gentoo
reboot

经过这样的安装有了一个最基本的系统。

第十四步:更新系统

emerge --sync
emerge -avt gentoolkit
emerge --update --deep --newuse -avt @world
revdep-rebuild
etc-update

完成后就把当前系统更新到最新的版本,可以开始对系统进行更详细的定制。

第十五步:定制hostname和domain

修改 /etc/conf.d/hostname :

hostname="abc"

修改 /etc/conf.d/net :

dns_domain="xxxxx.com"

最终在 console 的登录上显示为 abc.xxxxx.com

第十六步:定制SSHD登录方式

使用 ssh-keygen 创建 rsa 算法的 key

ssh-keygen -t rsa -C 'abc.xxxxx.com'
cp id_rsa.pub authorized_keys

生成的 id_rsa 私钥拷贝到需要登录的机器,修改文件权限为 400。修改 /etc/ssh/sshd_config 配置文件:

Port 18402
AddressFamily any
PasswordAuthentication no
ChallengeResponseAuthentication no

使用 ssh 命令登录到机器的命令时使用 -i-p 两个参数:

ssh -i .ssh/id_rsa.dashboard -p 18402 root@222.222.222.222

第十六步:设定Shorewall防火墙

修改 shorewall.conf 配置文件:

STARTUP_ENABLED=Yes

interfaces 文件中加入网卡,其中 enp4s0 为当前机器的网卡名:

net     enp4s0      tcpflags,nosmurfs,routefilter,logmartians,sourceroute=0

zones 中加入网络的设置:

net     ipv4

修改 policy 文件:

$FW net ACCEPT
net all DROP  info
all all REJECT info

修改 rules 文件,加入 18402 端口的开放:

#Don't allow connection pickup from the net
#
Invalid(DROP) net   all   tcp
Invalid(DROP) net   all   udp
#
# Allow Ping from the local network
#
Ping(ACCEPT)  net   $FW
#
# Accept 80(Nginx) connection from internet
#
ACCEPT net $FW tcp 80
#
# Accept 18402(SSH) connection from internet
#
ACCEPT net $FW tcp 18402

第十七步:配置系统默认参数

/etc/security/limits.conf

root soft noproc 65535
root hard noproc 65535
root soft nofile 65535
root hard nofile 65535

root 代表用户,如果设置任意用户,可以使用 *****,noproc 为进程数量,nofile 为文件数量,root soft noproc 65535root 用户能够打开的最大进程数的软限制是 65535。注意软限制不能超过硬限制。

/etc/pam.d/login

session required /lib/security/pam_limits.so

登陆时调用 pam_limits.so,该库将会从 /etc/security/limits.conf 中读取配置参数并自动设置。

/proc/sys/fs/file-max

echo "65535" > /proc/sys/fs/file-max

注意 /proc/sys/fs/file-max 不能直接用编辑工具修改。

Nginx

worker_rlimit_nofile 51200; #修改最大文件数为51200

events {
  use epoll;
  worker_connections 51200; #修改worker的最大连接数为51200
}

/etc/sysctl.conf

net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 16384 33554432
net.ipv4.tcp_wmem = 4096 16384 33554432
net.ipv4.tcp_mem = 786432 1048576 26777216
net.ipv4.tcp_max_tw_buckets = 360000
net.core.netdev_max_backlog = 2500
vm.min_free_kbytes = 65536
vm.swappiness = 0
net.ipv4.ip_local_port_range = 1024 65535

特定机型的记录

Dell R610

DELL R610 中使用 20120516LiveCD 安装后启动出现错误:

bnx2: Can't load firmware file "bnx2/bnx2-mips-06-06.2.1.fw" 

最终修改内核:

CONFIG_FIRMWARE_IN_KERNEL=N

安装 linux-firmware

emerge -avt linux-firmware