注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

Linux: 无人值守安装系统盘制作(基于Grub)  

2014-06-05 14:50:52|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在Linux环境下工作,免不了需要重新安装系统。用系统iso文件刻光盘安装是比较方便操作的方式,但是需要有人点击配置才能进行安装过程,且后续不能修改。

实际项目中,有可能安装过程复杂,需要熟练技术人员才能操作;或者在系统安装完成之后需要部署特别的环境;再或者工厂需要批量安装系统并灌装特定软件产品。在这些情况中,如果可以通过无人值守的方式安装系统就可以大大提高工作效率,同时减少因为操作失误而导致出错的可能性。

这篇文章以安装CentOS 6.4为例,介绍在Linux环境下通过 kickstart 配置制作系统安装盘(U盘)的过程。本文中的操作都是在 root 用户下演示,其中部分命令在普通用户环境下可能需要用su。

制作系统安装盘主要有以下步骤:
1. 选择合适容量的U盘。CentOS 6.4的DVD镜像iso文件大于5G,所以建议使用8G或者更大容量的U盘。
2. U盘制作分区。因为通常系统iso文件和需要部署环境的库文件不会经常变化,所以建议划分两个分区:第一个分区做boot分区和kickstart配置文件存放;第二个分区存放iso文件和待部署的库或者软件产品。当然只分一个区,或者分更多的区都没有问题,看实际需求而定。
3. 制作boot引导。这样系统就可以从U盘启动开始安装。
4. 导入系统镜像iso及其它待部署内容。
5. 编写kickstart配置文件。
6. 安装测试。

下面对制作过程做详细的说明。

1. U盘制作分区

首先确认U盘有被识别,并且没有挂载(方便之后格式化)。

[root@localhost mnt]# fdisk -l
... ...
    Device    Boot    Start      End        Blocks   Id     System
/dev/sdb1        *           2    4659    15240672    c     W95 FAT32 (LBA)


如果U盘先前有做过分区,则用命令直到所有分区被删除:

[root@localhost mnt]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
                 switch off the mode (command 'c') and change display units to
                 sectors (command 'u').

Command (m for help): d
Selected partition 1

Command (m for help): d
No partition is defined yet!


这里把U盘分为两个区:第一个区1G,作为boot分区足矣;剩下的空间作为第二分区。分区完成之后,做保存。

[root@localhost mnt]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
                 switch off the mode (command 'c') and change display units to
                 sectors (command 'u').

Command (m for help): n
Command action
       e extended
       p primary partition (1-4)
p
Partition number (1-4): 1

First cylinder (1-4658, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-4658, default 4658): 1000

Command (m for help): n
Command action
       e extended
       p primary partition (1-4)
p
Partition number (1-4): 2

First cylinder (1001-4658, default 1001):
Using default value 1001
Last cylinder, +cylinders or +size{K,M,G} (1001-4658, default 4658):
Using default value 4658

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.


对分区做格式化,可以都用ext格式化两个分区,也可以Fat32格式化第一分区。第二分区需要用ext格式化,原因是Fat32无法保存大于4G的文件格式;而第一分区用Fat32格式化的好处是,未来在Windows环境下也可以对分区内的kickstart配置文件做适当调整。

[root@localhost mnt]# mkfs.vfat /dev/sdb1
mkfs.vfat 3.0.9 (31 Jan 2010)
[root@localhost mnt]# mkfs.ext4 /dev/sdb2
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2) 

Stride=0 blocks, Stripe width=0 blocks
889440 inodes, 3555072 blocks
177753 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3640655872
109 block groups 32768 blocks per group,
32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
             32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

至此,U盘两个分区制作完毕。

2. 制作boot引导

首先挂载U盘:

[root@localhost mnt]# mount /dev/sdb1 /mnt/usb1
[root@localhost mnt]# mount /dev/sdb2 /mnt/usb2


使用grub-intall命令,将grub安装到U盘第一分区:

[root@localhost mnt]# grub-install --root-directory=/mnt/usb1 /dev/sdb1
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/usb1/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0)     /dev/fd0
(hd0)    /dev/sda
(hd1)    /dev/sdb


可以看到第一分区中多了/boot/grub/目录,并且已经生成一些文件:

[root@localhost mnt]# cd usb1
[root@localhost grub]# ll boot/grub/
total 272
-rwxr-xr-x. 1 root root        45  Jun 5 17:07  device.map
-rwxr-xr-x. 1 root root   13380  Jun 5 17:07  e2fs_stage1_5
-rwxr-xr-x. 1 root root   12620  Jun 5 17:07  fat_stage1_5
-rwxr-xr-x. 1 root root   11748  Jun 5 17:07  ffs_stage1_5
-rwxr-xr-x. 1 root root   11756  Jun 5 17:07  iso9660_stage1_5
-rwxr-xr-x. 1 root root   13268  Jun 5 17:07  jfs_stage1_5
-rwxr-xr-x. 1 root root   11956  Jun 5 17:07  minix_stage1_5
-rwxr-xr-x. 1 root root   14412  Jun 5 17:07  reiserfs_stage1_5
-rwxr-xr-x. 1 root root      512  Jun 5 17:07  stage1
-rwxr-xr-x. 1 root root 125992  Jun 5 17:07  stage2
-rwxr-xr-x. 1 root root   12024  Jun 5 17:07  ufs2_stage1_5
-rwxr-xr-x. 1 root root   11364  Jun 5 17:07  vstafs_stage1_5
-rwxr-xr-x. 1 root root   13964  Jun 5 17:07  xfs_stage1_5


从device.map中可以看到硬盘的对应关系:

[root@localhost grub]# cat device.map
(fd0)     /dev/fd0
(hd0)    /dev/sda
(hd1)    /dev/sdb


执行grub命令,在我的环境中/dev/sdb对应于“hd1”,所以用“hd1”。
命令行中 “root (hd1,0)” 的第二个参数“0”表示第一个分区,以此类推;注意"root"后面有空格:

[root@localhost grub]# grub
Probing devices to guess BIOS drives. This may take a long time.
      GNU GRUB version 0.97 (640K lower / 3072K upper memory)
   [  Minimal BASH-like line editing is supported. For the first word, TAB
      lists possible command completions. Anywhere else TAB lists the possible
      completions of a device/filename. ]

grub> root (hd1,0)
root (hd1,0)
  Filesystem type is fat, partition type 0x83
grub> setup (hd1)
setup (hd1)
  Checking if "/boot/grub/stage1" exists... yes
  Checking if "/boot/grub/stage2" exists... yes
  Checking if "/boot/grub/fat_stage1_5" exists... yes
  Running "embed /boot/grub/fat_stage1_5 (hd1)"... 25 sectors are embedded.
succeeded
  Running "install /boot/grub/stage1 (hd1) (hd1)1+25 p (hd1,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.
grub> quit
quit


接下去在 boot/grub/ 目录下创建一个名为 grub.conf 的文档,编写文档内容如下。
其中,ks.cfg 就是之后需要编写的kickstart配置脚本;而 /isolinux/vmlinuz 和 /isolinux/initrd 提取自CentOS的镜像文件。
【重要】特别需要注意的是,这个 grub.conf 配置文档是在U盘在做系统安装时被调用。所以在指定文件路径时,需要重新考虑U盘所在的位置——比如在我的环境中(Dell R620),当开机设置从U盘启动后,U盘被挂载到 /dev/sda,而不是正常情况下的/dev/sdb,所以这里配置参数为 ”hd0“。
同理,我把 ks.cfg 放在U盘第一分区,所以是sda1:

[root@localhost usb1]# cd boot/grub/
[root@localhost grub]# vim grub.conf

[root@localhost grub]# cat grub.conf
default 0
splashimage=(
hd0,1)
/isolinux/splash.jpg
timeout 5
hiddenmenu
title CentOS 6.4 install
    root (
hd0,1)
    kernel /isolinux/vmlinuz ks=hd:
sda1:/ks.cfg ro
    initrd /isolinux/initrd.img

注:如果只是做一个安装盘(U盘启动+图形界面手动安装),则不需要“ ks=hd:sda1:/ks.cfg ro”,也不需要制作ks.cfg配置文件,只要完成下面步骤3就OK。

3. 导入系统镜像及所需部署软件产品/依赖库文件

据悉CentOS 6~6.4版本都需要提取iso文件中的 /isolinux/vmlinuz 和 /isolinux/initrd 才能正常安装,所以需要把两个文件夹特别拷贝出来。(CentOS 6.5 可能不需要,这一点没有测试过,不确定)
把系统镜像文件和两个提取出来的文件夹导入U盘第二分区中:

[root@localhost usb2]# mount -o loop /home/hadoop/CentOS-6.4-x86_64-bin-DVD1.iso /mnt/dvd
[root@localhost usb2]# cp -R /mnt/dvd/images ./

[root@localhost usb2]# cp -R /mnt/dvd/isolinux ./

[root@localhost usb2]# ll
total 24
dr-xr-xr-x. 3 root root   4096   Jun 5 17:30   images
dr-xr-xr-x. 2 root root   4096   Jun 5 17:29   isolinux

drwx------. 2 root root 16384   Jun 5 04:02   lost+found

[root@localhost usb2]# cp /home/hadoop/CentOS-6.4-x86_64-bin-DVD1.iso ./
[root@localhost usb2]# cp /home/hadoop/CentOS-6.4-x86_64-bin-DVD2.iso ./


4. 编写kickstart配置文件

kickstart配置文件功能强大,想完全掌握可以另行查阅相关专业文档,这里只做最简单的配置介绍。
kickstart配置文件可以手动创建,也可以用可视化工具生成(之后再手动微调):

[root@localhost usb2]# yum install system-config-kickstart
[root@localhost usb2]# system-config-kickstart


该工具界面大致如下,可以通过简单的勾选和编辑就可以产生大体的脚本框架:
Linux: 无人值守安装系统盘制作 - 乂乂 - 分享,态度 ·~~

典型的配置文件如下:

[root@localhost usb1]# cat ks.cfg
#platform=x86, AMD64, ?.Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use hard drive installation media
harddrive --partition=sda2 --dir=
# Root password
rootpw --iscrypted $1$RP94tpDV$mRf58w8gxLxYi2rlBv4lK1
# System authorization information
auth --useshadow --passalgo=sha512
# Use graphical install
graphical
firstboot --disable
# System keyboard
keyboard us
# System language
lang en_US
# SELinux configuration
selinux --disabled
# Installation logging level
logging --level=info
# Reboot after installation
reboot
# System timezone
timezone --isUtc Asia/Shanghai
# Network information
#network --onboot no --device eth0 --bootproto dhcp --noipv6
#network --onboot no --device eth1 --bootproto dhcp --noipv6
# System bootloader configuration
bootloader --location=mbr --driveorder=sdb --append="crashkernel=auto rhgb quiet"
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --drives=sdb --initlabel
# Disk partitioning information
part /boot --fstype="ext4" --size=200 --ondisk=sdb
part swap --fstype="swap" --size=4096 --ondisk=sdb
part / --fstype="ext4" --grow --size=1 --ondisk=sdb

# All devices to one

#part /boot --fstype=ext4 --size=500

#part pv.008002 --grow --size=1

#part pv.008018 --grow --size=1

#volgroup VolGroup --pesize=4096 pv.008002 pv.008018

#logvol /home --fstype=ext4 --name=lv_home --vgname=VolGroup --grow --size=100

#logvol / --fstype=ext4 --name=lv_root --vgname=VolGroup --grow --size=1024 --maxsize=51200

#logvol swap --name=lv_swap --vgname=VolGroup --grow --size=8016 --maxsize=8016


#repo --name="CentOS" --baseurl=hd:sda2: --cost=100

%post
# Custom tasks
%end


%packages --ignoremissing
@base
@compat-arch-support
@console-internet
@core
@editors
@hardware-monitoring
@performance
@server-platform
@server-policy
@system-tools
@workstation-policy
certmonger
device-mapper-persistent-data
krb5-workstation
oddjob
pam_krb5
pax
perl-DBD-SQLite
samba-winbind
sgpio
# ... more ...

%end

其中,%post 部分可以识别shell脚本;通过脚本,可以自定义系统在安装完毕之后所需的操作,例如部署依赖包、安装软件产品等等。
如果系统有多张硬盘,也可以如上面注释的代码合成一张逻辑卷。(这里只讨论未组raid的情况。)

以下内容来自一位同事的总结,记在这里供参考:
=========================================================================
几点需要注意:
1:harddrive --partition=sda1 --dir=
这里设置的是启动的时候,安装比如驱动,根文:件系统在哪里引导。
重点是--partition比较重要,因为启动的时候,U盘可能会被scsi认为是sda,也可能是sdb,(一般都是sda)。
harddrive --partition=sda2 --dir=    -->这里指定ISO文件在什么地方
2:bootloader --location=mbr --driveorder=sdb --append="crashkernel=auto rhgb quiet"
这里主要是设置系统安装在哪个盘上
--location=mbr --driveorder=sdb  -->表示的是,mbr安装到sdb盘(系统盘上)。这个会影响启动是从哪里启动的。
3:install的方式:
如果是网络安装:
nfs --server=IP --dir=/install
#url --url=http://IP/install
#url --url=ftp://install:install@IP/目录  --》根目录下的install文件

可能碰到的问题:
1:"Unable to read package metadata"
原因:
1) ISO文件出现问题
2) 指定的地址不对,找不到对应的文件
2: U盘的boot分区被格式化
原因:clearpart 必须指定需要格式化的盘。否则可能会连U盘的boot分区也被格式化。
如:clearpart --drivers=sdb --all --initlabel
这里设置第一块硬盘上的分区都被格式化掉(因为启动是U盘引导所以U盘是sda)
3: "NO escaped character"
原因:由于在设置ip的时候,由于比较长,我使用了“\”连接,但kickstart不认这个字符导致。
错误:
         network --device em1 --bootproto static --ip 172.12.7.157 \
         --netmask 255.255.0.0 --gateway 172.12.0.1
正确:
         network --device em1 --bootproto static --ip 172.12.7.157 --netmask 255.255.0.0 --gateway 172.12.0.1
4:找不到image文件。
原因:harddrive --partition=sda2 --dir= 这里设置有问题。
在我们的dell服务器上,比较特殊,不是将硬盘的盘符固定的。是随启动项改变的。
比如:设置为U盘引导的时候,U盘是sda。如果是硬盘引导的时候,第一块硬盘就是sda。
这个比较重要。

%post部分简介
可以使用如下方式:
#!/bin/sh
/sbin/chkconfig --level 0123456 xfs off
mkdir -p /root/mds

比如我们的部分服务在安装完成后需要安装的,可以利用脚本再次实现。
========================================================================
有关脚本其它参数的含义,也可以参照:
https://www.centos.org/docs/5/html/Installation_Guide-en-US/s1-kickstart2-options.html

至此,定制化的CentOS 6.4 已经制作完毕,可以拿U盘去测试了,祝好运。

  评论这张
 
阅读(1116)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017