RedHat Linux Standard Install 프로젝트 결과물로서 UEFI, Legacy BIOS 자동 탐색 적용과 메모리에 따른 swap, crash 파티션 용량 자동 계산 스크립트가 적용되었다.
목차
1. 준비물
VM : VMWare Workstation (by 10.0.7 build-2844087)
Build Server : RHEL 6.5 64 Bit (VMWare Work Station), RAM 1G
ISO File : rhel-server-6.5-x86_64-dvd.iso, rhel-server-6.6-x86_64-dvd.iso
* VM 구성 및 빌드서버 OS 설치에 관련된 내용은 생략한다.
참고 : UEFI PXE를 위한 grub.efi는 grub package에 포함, Legacy PXE를 위한 pxelinux.0 는 syslinux package에 포함 되어 있다. 또한 bootloader의 옵션은 UEFI와 Legacy에 따라 차이가 많이 난다는 것을 유념 해야한다.
2. Kickstart Build Server 구성
2.1. dhcpd 구성
필요 패키지 :
dhcp-4.1.1-38.P1.el6.x86_64
[root@Kicksatrt-server ~]# vim /etc/dhcp/dhcpd.conf allow bootp; allow booting; max-lease-time 60; default-lease-time 60; ddns-update-style none; option domain-name-servers 168.126.63.1, 168.126.63.2; option pxe-system-type code 93 = unsigned integer 16; class "PXE" { match if substring(option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.168.0.140; # Kickstart 서버 ip #filename "pxelinux.0"; #filename "BOOTX64.efi"; if option pxe-system-type = 00:07 { filename "BOOTX64.efi"; } else { filename "pxelinux.0"; } } subnet 192.168.0.0 netmask 255.255.255.0 { option broadcast-address 192.168.0.255; option routers 192.168.0.1; # gateway 지정. 외부망 연결이 필요 없다면 없어도 되고, 만약 라우터의 dhcp 서버가 on 이면 충돌이 나므로 지정하지 않거나 router의 dhcp server를 off로 하고 지정한다. option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.0.2 192.168.0.99; # kickstart OS 설치 때 부여받는 dhcp ip 영역 default-lease-time 21600; max-lease-time 43200; pool { allow members of "PXE"; range 192.168.0.201 192.168.0.230; # pxe dhcp ip 영역 } }
- dhcpd 서버 : 192.168.0.140
- kickstart 서버의 dhcpd를 구동할 땐 공유기의 dhcpd 기능을 off로 해둔다.
└ on으로 하여도 동작에는 문제가 없다. 하지만 kickstart 서버로 부터 ip를 받지 않을 경우 messages 로그를 통해 dhcp client ip 로그를 확인할 수 없다.
- 라우터(gateway)는 사무실내의 로컬네트워크상의 공유기 192.168.0.1으로 설정 하였으므로 공유기의 dhcp가 off로 되어 있어도 dhcp client 장치들의 인터넷 통신에는 문제가 없다.
2.2. tftpd 구성
필요 패키지 :
xinetd-2.3.14-39.el6_4.x86_64
tftp-server-0.49-7.el6.x86_64
[root@Kicksatrt-server ~]# vim /etc/xinetd.d/tftp service tftp { disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot per_source = 11 cps = 100 2 flags = IPv4 }
- xinetd 를 통해 tftpd 가 구동 되므로 xinetd가 없으면 먼저 설치를 해야한다.
- /tftpboot 디렉토리를 tftpd 홈 디렉토리로 설정을 하였다.
2.3. httpd 구성
필요 패키지 :
httpd-2.2.15-29.el6_4.x86_64
[root@Kicksatrt-server ~]# vim /etc/httpd/conf/httpd.conf . . Alias /ks /tftpboot/kickstart Alias /redhat6.5 /rhel65 Alias /redhat6.6 /rhel66
- kickstart cfg 파일과 DVD repo를 웹을 통해 전송 하도록 하였다.
- NFS, FTP 방식으로도 구성이 가능하다.
- 위에서 지정한 repo를 위해 아래와 같이 DVD(또는 ISO 파일)를 mount 한다.
[root@Kicksatrt-server ~]# mkdir /rhel65 ; mkdir /rhel66 [root@Kicksatrt-server ~]# mount /dev/sr0 /rhel65 [root@Kicksatrt-server ~]# mount /dev/sr1 /rhel66
[root@Kicksatrt-server ~]# vim /etc/rc.local mount /dev/sr0 /rhel65/ mount /dev/sr1 /rhel66/
2.4. smb 구성
필요 패키지 :
samba-3.6.9-164.el6.x86_64
[root@Kicksatrt-server /]# vim /etc/samba/smb.conf [Global] workgroup = WORKGROUP security = share map to guest = bad user #netbios name = kickstart server string = KickstartServer load printers = no printing = bsd printcap name = /dev/null disable spoolss = yes [ISO] path = /data1/MakeISO force user = root force group = root browsable = no writable = yes guest ok = yes read only = no
- samba는 OS 자동 설치를 위해 없어도 되지만, 생성된 ISO 파일을 Windows PC상의 VMWare 에서 Direct로 잡아서 설치 시 필요한 것이다. 즉, DVD 설치 테스트 시 ISO 파일을 복사하지 않고 바로 잡아서 쓰기 위함.
- /data1/MakeISO 디렉토리는 ISO 파일이 위치하는 곳이다.
2.5. service on
[root@Kicksatrt-server ~]# /etc/init.d/dhcpd start; /etc/init.d/xinetd start; /etc/init.d/httpd start; /etc/init.d/smb start [root@Kicksatrt-server ~]# chkconfig dhcpd on ; chkconfig xinetd on ; chkconfig httpd on ; chkconfig smb on
2.6. 디렉토리 구성
디렉토리 생성, 파일 복사 :
[root@Kicksatrt-server ~]# mkdir /tftpboot [root@Kicksatrt-server ~]# mkdir /tftpboot/kickstart [root@Kicksatrt-server ~]# mkdir /tftpboot/pic [root@Kicksatrt-server ~]# mkdir /tftpboot/pxelinux.cfg [root@Kicksatrt-server ~]# mkdir /tftpboot/redhat6.5 [root@Kicksatrt-server ~]# mkdir /tftpboot/redhat6.6 [root@Kicksatrt-server ~]# cp /rhel65/isolinux/{vmlinuz,initrd.img} /tftpboot/redhat6.5 [root@Kicksatrt-server ~]# cp /rhel66/isolinux/{vmlinuz,initrd.img} /tftpboot/redhat6.6 [root@Kicksatrt-server ~]# cp /rhel65/EFI/BOOT/BOOTX64.efi /tftpboot [root@Kicksatrt-server ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
- 기타 부수적인 파일들은 텍스트 파일이기 때문에 직접 만들어서 사용하면 된다.
- /usr/share/syslinux/pxelinux.0 파일은 syslinux-4.02-8.el6.x86_64 패키지에 포함된 파일이다.
/tftpboot 디렉토리 구조 :
[root@Kicksatrt-server /]# tree /tftpboot /tftpboot ├── BOOTX64.efi ├── efidefault ├── kickstart │?? ├── basic_65.sh │?? ├── basic_66.sh │?? ├── firstcheck.sh │?? ├── kernel-2.6.32-504.8.1.el6.x86_64.tar.gz │?? ├── ks65.cfg │?? ├── ks66.cfg │?? ├── osinstallcheck.sh │?? └── sec_20150202.tar ├── menu.c32 ├── pic │?? ├── ost-splash.png │?? └── ost-splash.xpm.gz ├── pxelinux.0 ├── pxelinux.cfg │?? └── default ├── redhat6.5 │?? ├── initrd.img │?? └── vmlinuz ├── redhat6.6 │?? ├── initrd.img │?? └── vmlinuz └── vesamenu.c32
권한 : # chmod -R 755 /tftboot 필요.
- efidefault
└ UEFI 펌웨어 형태의 부트로드 메뉴다. /tfpboot에 위치
└ tftp를 통해 BOOTX64.efi 파일을 받아서 부트로더 메뉴를 띄운다.
└ 부트메뉴의 배경그림은 pic 디렉토리의 ost-splash.xmp.gz 를 참조
- default
└ Legacy Bios 형태의 부트로드 메뉴다. /tfpboot/pxelinux.cfg에 위치
└ tftp를 통해 pxelinux.0 파일을 받아서 부트로더 메뉴를 띄운다.
└ 부트메뉴의 배경그림은 pic 디렉토리의 ost-splash.png 를 참조
- kickstart
└ apache 설정에 의해 ks 라는 디렉토리로 alias
└ kickstart cfg 파일을 다운 받는 장소
└ %post 작업에 필요한 파일을 다운 받는 장소
- redhat6.5
└ initrd.img : RHEL 6.5의 ramfs 파일이다. 각 OS 버전에 맞는 파일이 필요함.
└ vmlinuz : RHEL 6.5의 압축된 커널 이미지. 각 OS 버전에 맞는 파일이 필요함.
- redhat6.6
└ initrd.img : RHEL 6.6의 ramfs 파일이다. 각 OS 버전에 맞는 파일이 필요함.
└ vmlinuz : RHEL 6.6의 압축된 커널 이미지. 각 OS 버전에 맞는 파일이 필요함.
- munu.c32, vesamenu.c32
└ 별도의 (ost-splash.png, ost-splash.xpm.gz)을 사용하였기 때문에 해당 파일은 없어도 된다.
└ 두 파일은 /usr/share/syslinux 디렉토리에 위치해 있다.
2.7. efidefault 내용
[root@Kicksatrt-server ~]# vim /tftpboot/efidefault default 0 timeout 10 hiddenmenu splashimage (nd)/pic/ost-splash.xpm.gz title Boot local hard drive root (hd0,0) chainloader /EFI/redhat/grub.efi title RHEL 6.5 root (nd) kernel /redhat6.5/vmlinuz ks=http://192.168.0.140/ks/ks65.cfg ksdevice=link initrd /redhat6.5/initrd.img title RHEL 6.6 root (nd) kernel /redhat6.6/vmlinuz ks=http://192.168.0.140/ks/ks66.cfg ksdevice=link initrd /redhat6.6/initrd.img
- efidefault 와 defualt 는 부트로더 메뉴 설정은 차이가 있으므로 주의 할 것.
└ append 옵션이 들어가거나, root (nd) 설정 등이 빠지면 부팅이 안 된다.
└ timeout, default 와 같은 옵션의 파라미터도 다르게 쓰인다.
└ chainloder는 legacy(default)의 localboot 와 같은 옵션이다.
- 원인은 모르지만 PXE 부팅 후 UEFI 부트로더를 통해서는 로컬 디스크 부팅이 안된다.
└ 아래와 같은 메시지가 발생을 하면서 되지 않는다.
file path : /File(\efi\redhat\)/File(grub.efi)/EndEntire
└ 아래 레드햇 사이트를 참조하였으나 부팅 안 됨.
https://access.redhat.com/solutions/629813
└ 특이하게도 Custom DVD로는 로컬 디스크 부팅이 정상적으로 된다.
2.8. default 내용
[root@Kicksatrt-server ~]# vim /tftpboot/pxelinux.cfg/default default vesamenu.c32 timeout 100 menu tabmsg Press ENTER to Install or TAB to edit a menu entry menu background pic/ost-splash.png menu title #### OS Installer Boot Menu #### label 0 menu label Boot local hard drive LOCALBOOT 0 label RHEL 6.5 kernel /redhat6.5/vmlinuz append ksdevice=link load_ramdisk=1 initrd=/redhat6.5/initrd.img network ks=http://192.168.0.140/ks/ks65.cfg label RHEL 6.6 kernel /redhat6.6/vmlinuz append ksdevice=link load_ramdisk=1 initrd=/redhat6.6/initrd.img network ks=http://192.168.0.140/ks/ks66.cfg
2.9. kickstart cfg 파일 작성
- 각 옵션에 대한 설명은 cfg 파일 내용의 주석 부분을 참고 할 것.
- rhel 6.6은 그에 맞게 ks66.cfg 파일명으로 하고 파일 내용도 65 -> 66, 6.5 -> 6.6 으로 수정 적용하면 된다.
[root@Kicksatrt-server ~]# vim /tftpboot/kickstart/ks65.cfg ## Install 진행 install ## kickstart 진행을 text 모드로 text ## 설치 매체 설정 url --url http://192.168.0.140/redhat6.5 # cd롬을 매체로 설치시엔 cdrom을 지정 #cdrom ## redhat subscription 설정 #key --skip은 skip, key 서브스크립션 넘버는 등록 옵션 key --skip ## 언어설정 # 참고 : ko_KR.eucKR 으로 지정하면 설치 시 글자가 깨지지만 설치 완료 후 OS 구동시엔 글자가 깨지는 문제가 발생하지 않음. lang ko_KR.UTF-8 #lang ko_KR.eucKR #lang en_US.UTF-8 #langsupport ko_KR --default=en_US #langsupport en_US --default=ko_KR ## 입력장치 설정 keyboard us #mouse none ## 네트워크와 기타 설정들 network --device link --bootproto dhcp --noipv6 --hostname Sample-local rootpw !test123 firewall --disabled # minimal 설치를 할 경우 RHEL 6.6부터는 아래와 같은 설정으로는 selinux disable 이 되지 않는다. %post 작업에 넣음. selinux --disabled authconfig --enableshadow --passalgo=sha512 ## 시간대 설정. 글로벌 서비스를 위한 서버의 경우 UTC를 GMT 기준으로 맞춘다. #timezone Asia/Seoul #timezone --utc Asia/Seoul #timezone --utc Etc/GMT timezone --utc Etc/GMT ##### 디스크 설정 부분 설명 ##### # %pre 부분에 선언 됨 # ## 부트로더 설치 위치와 커널 옵션 #printk.time=1 은 dmesg의 timestamp 적용 # ex) #bootloader --location=mbr --driveorder=sda --append="crashkernel=auto printk.time=1" ## Disk 초기화 # OS가 설치될 sda disk를 초기화 시킨다. zerombr과 ignoredisk 옵션이 빠지면 새 disk의 경우 kickstart 도중 disk를 initialaze 하라는게 나와서 자동 진행을 방해한다. # HP DL360 장비의 경우 디스크가 레이드컨트롤러 디바이스명인 /dev/cciss 로 잡히므로 ignoredisk 에서 sda로 하면 kickstart 도중 에러가 발생한다. DL380 부터는 레이드볼륨이 /dev/sda로 잡히므로 괜찮다. #zerombr #clearpart --initlabel --all ## 만약 실수로 USB 메모리 한개만 꽂고서 kickstart 진행을 했을 경우 sda 장치로 잡히는 USB 메모리의 파티션 초기화를 방지한다. # USB 메모리를 통한 설치 방법에 해당된다. #ignoredisk --only-use=sda ##### 디스크 설정 부분 설명 끝 ##### ## 설치 후 전원 off # 설치가 모든 끝난 시스템은 전원이 꺼지도록해서 진행이 모두 끝났음을 쉽게 알 수 있도록 한다. # kickstart의 맨 마지막 작업으로 kickstart 설정 파일에서의 라인 위치에 상관 없이 마지막에 동작한다. # 원인은 모르지만 %pre 설정 아래에 poweroff 또는 shutdown 설정을 할 경우, 시스템의 전원이 꺼지지 않고 reboot이 된다. 따라서 %pre 구문이 있을 경우에는 %pre 구문 위에 위치 시킬 것. poweroff ## Disk partitioning # kickstart 수행 전 사전작업(pre)으로 파티셔닝 작업을 한다. # UEFI 지원 시스템일 경우 자동으로 bootloader의 위치를 partition으로 하고 /boot/efi 파티션을 vfat으로 생성하도록 적용하였다. # UEFI : /boot/efi/EFI/redhat/ 디렉토리에는 EFI 어플리케이션으로 EFI 펌웨어 아키텍처 용으로 컴파일된 GRUB 버전 grub.efi가 들어있다. 서버 설치 후 df로 확인시 300KB 미만을 사용한다. # 기본적으로 EFI 부트 관리자는 디폴트 부트로더로 grub.efi를 선택하고 이를 메모리로 불러온다. # 레드햇 권고 /boot/efi 파티션 사이즈 : 200MB # -> The /boot/efi partition should be at least 50 MB in size; its recommended size is 200 MB. # boot : /boot 파티션은 200MB ~ 1GB 사이즈가 레드햇 권장이다. # kdump: /var/crash 파티션은 레드햇 권장치인 "메모리 크기 * 1.3" 사이즈로 잡는다. # swap : - 레드햇 공식 문서에서는 RHEL6, RHEL7 OS를 기준으로 아래와 같이 권장한다. # * 2G 미만 시스템은 2배 # * 2 ~ 8G는 동일 용량 # * 8G 이상 시스템은 최소 4G보다 크면된다. # - 서버의 RAM을 확인하여 이 기준으로 자동으로 적용되도록 한다. 이 기준은 S사 시스템을 위한 기준치다. # 1) 2G 이하 : "메모리 사이즈 * 2"로 설정 # 2) 2 ~ 64G : 16G로 설정 # 3) 64G 이상 : 32G로 설정 (아래 스크립트에서 64G RAM을 63000(63G)로 기준으로 한 이유는 일부 시스템의 경우 VGA에 Share한 메로리로 인해 실제 RAM 사이즈보다 작을 수도 있기 때문) # 참고 : kickstart config 옵션은 = 기호가 빠져도 구동에 문제가 없다. 예로 --size=512 와 --size 512 는 동일하다. 마찬가지로 efidefault와 같은 config 파일도 = 이 빠져도 동일한 동작을 한다. # %pre 구문은 %end로 막지 않으면 %pre를 실행하기도 전에 그 다음 구문들이 실행되어 버린다. 따라서 꼭 %end로 막을 것. # %include는 설치 때 임시 디렉토리인 /tmp 디렉토리에 임시로 파일을 생성하게 해준다. 파일에 기록된 파티션 정보를 바탕으로 파티셔닝을 해준다. %include /tmp/part-include %pre #!/bin/sh # Script Code By OST(Open Source Technology Co.) ## Define Partition Size (variable) - 아래 파티션 사이즈(5가지)를 원하는 만큼 MB 단위로 설정한다. # 참고 : /home을 파티셔닝 하려면 Partion Create - Function 부분의 home 을 주석 해제 할 것. BOOTSIZE=1024 ROOTSIZE=30720 VARSIZE=15360 USRSIZE=15360 HOMESIZE=10240 ## Automatic Partition Script # MEM Info and Sizing - Function GatherSizing () { MEMINFO=$(cat /proc/meminfo | grep MemTotal | awk -F " " '{print $2}') MEMSIZE=$(($MEMINFO / 1024)) CRASHSIZE=$(echo "$MEMSIZE 1.3" | awk '{printf "%.f", $1 * $2}') SWAPSIZE1=$(($MEMINFO / 1024 * 2)) SWAPSIZE2=$(echo "16384") SWAPSIZE3=$(echo "32768") } # Clear Disk - Function Clearing () { echo "zerombr" >> /tmp/part-include echo "ignoredisk --only-use sda" >> /tmp/part-include echo "clearpart --initlabel --all" >> /tmp/part-include } # UEFI System Boot Create - Function PartitioningEfiBoot () { echo "bootloader --location partition --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE" >> /tmp/part-include echo "part /boot/efi --fstype vfat --size 256" >> /tmp/part-include } # Legacy system Boot Create - Function PartitioningLegacyBoot () { echo "bootloader --location mbr --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE" >> /tmp/part-include } # Partion Create - Function PartitioningCommon () { echo "part pv.01 --size 1 --grow" >> /tmp/part-include echo "volgroup rootvg pv.01" >> /tmp/part-include echo "logvol / --fstype ext4 --vgname rootvg --size $ROOTSIZE --name rootlv" >> /tmp/part-include if [ $MEMSIZE -le 2048 ]; then echo "logvol swap --fstype swap --vgname rootvg --size $SWAPSIZE1 --name swaplv" >> /tmp/part-include elif [ $MEMSIZE -ge 63000 ]; then echo "logvol swap --fstype swap --vgname rootvg --size $SWAPSIZE3 --name swaplv" >> /tmp/part-include else echo "logvol swap --fstype swap --vgname rootvg --size $SWAPSIZE2 --name swaplv" >> /tmp/part-include fi echo "logvol /var --fstype ext4 --vgname rootvg --size $VARSIZE --name varlv" >> /tmp/part-include echo "logvol /var/crash --fstype ext4 --vgname rootvg --size $CRASHSIZE --name crashlv" >> /tmp/part-include echo "logvol /usr --fstype ext4 --vgname rootvg --size $USRSIZE --name usrlv" >> /tmp/part-include #echo "logvol /home --fstype ext4 --vgname rootvg --size $HOMESIZE --name homelv" >> /tmp/part-include } # Action if [ -d /sys/firmware/efi ] ; then GatherSizing; Clearing; PartitioningEfiBoot; PartitioningCommon; else GatherSizing; Clearing; PartitioningLegacyBoot; PartitioningCommon; fi %end ## Partitioning Sample #part /boot --fstype ext4 --size=512 #part /boot/efi --fstype efi --size=128 #part pv.01 --size=1 --grow #volgroup rootvg pv.01 #logvol swap --fstype swap --vgname=rootvg --size=16384 --name=swaplv #logvol / --fstype ext4 --vgname=rootvg --size=30720 --name=rootlv #logvol /var --fstype ext4 --vgname=rootvg --size=15360 --name=varlv #logvol /var/crash --fstype ext4 --vgname=rootvg --size=157286 --name=crashlv #logvol /usr --fstype ext4 --vgname=rootvg --size=15360 --name=usrlv #logvol /home --fstype ext4 --vgname=rootvg --size=30720 --name=homelv #logvol /oracle11 --fstype ext4 --vgname=rootvg --size=51200 --name=oracle11lv #logvol /data --fstype ext4 --vgname=rootvg --size=1 --grow --name=lv_data ## yum repo 지정 #cd 사용시 #repo --name="Red Hat Enterprise Linux" --baseurl=file:///mnt/source --cost=100 #network 사용시 repo --name="Red Hat Enterprise Linux" --baseurl=http://192.168.0.140/redhat6.5 --cost=100 ## kickstart 설치 후 Graphic 모드로 사용하기 # --startxonboot 를 지정 안하면 /etc/inittab에 id:3 으로 지정이 된다. #xconfig --startxonboot --defaultdesktop=GNOME ## 패키지 설치 부분. # @basic-desktop, @fonts, @x11은 x-window(gnome) 설치를 하기 위한 옵션이다. # packages에 어떤걸 넣어야 될지 잘 모를때는 DVD로 원하는 패키지들을 수동 설치 후 /root/anaconda-ks.cfg 파일을 참조할 것. # Base 설치 + 추가 패키지 설치이다. #%packages #@additional-devel #@base #@client-mgmt-tools #@console-internet #@core #@debugging #@development #@directory-client #@british-support #@storage-client-fcoe #@hardware-monitoring #@java-platform #@korean-support #@large-systems #@legacy-unix #@network-file-system-client #@performance #@perl-runtime #@server-platform #@server-platform-devel #@server-policy #libXinerama-devel #xorg-x11-proto-devel #startup-notification-devel #libgnomeui-devel #libbonobo-devel #libXau-devel #libgcrypt-devel #popt-devel #libXrandr-devel #libxslt-devel #libglade2-devel #gnutls-devel #mtools #pax #python-dmidecode #oddjob #sgpio #device-mapper-persistent-data #systemtap-client #jpackage-utils #samba-winbind #certmonger #pam_krb5 #krb5-workstation #tcp_wrappers #perl-DBD-SQLite #%end # minimal 설치를 위함, --nobase 옵션을 줘야 최소 설치가 된다. %packages --nobase @korean-support @server-policy %end ## 설치 후 DVD를 통해 후 작업 # package 까지 설치한 뒤 후 작업이다. 아래는 OS가 설치되는 disk의 /root 디렉토리에 파일들 copy 작업을 한다. # kickstat로 OS 설치 후 작업이다. --nochroot는 설치 시점의 임시 쉘로 작업하는 것이다. #%post --nochroot #( # echo # [ -d /mnt/source ] || mkdir /mnt/source # mount -o ro /tmp/cdrom /mnt/source # cp -a /mnt/source/ks/basic_66.sh /mnt/sysimage/root/ # cp -a /mnt/source/ks/osinstallcheck.sh /mnt/sysimage/root/ # cp -a /mnt/source/ks/kernel-2.6.32-504.30.3.el6.x86_64.tar.gz /mnt/sysimage/root/ # cp -a /mnt/source/ks/sec_20150908.tar.gz /mnt/sysimage/root/ # cp -a /mnt/source/* /mnt/sysimage/root/rhel65/ # umount /mnt/source #) >> /mnt/sysimage/root/postnochroot # 아래는 --nochroot 없이 chroot(설치된 OS의 쉘상태)로 작업하는 것이다. %post --nochroot 를 통해 file copy를 구지 하지 않아도 된다. # 설치 화면에서 Alt + F2를 눌러 쉘로 진입 후 chroot /mnt/sysimage 명령을 하여 진행하는 것과 같다. #%post #mount /dev/sr0 /mnt #cp -a /mnt/ks/basic_66.sh /root #cp -a /mnt/ks/osinstallcheck.sh /root #cp -a /mnt/ks/kernel-2.6.32-504.30.3.el6.x86_64.tar.gz /root #cp -a /mnt/ks/sec_20150908.tar.gz /root #cat > /etc/yum.repos.d/rhel65.repo << EOF #[rhel] #name=rhel6 #baseurl=http://192.168.0.140/redhat6.5 #gpgcheck=0 #yum install -y bzip ethtool man-pages man-pages-overrides ntp ntpdate openssh-clients sos sysstat unzip vim-enhanced zip nfs-utils rpcbind xinetd tcp_wrappers #rm -f /etc/yum.repos.d/rhel66.repo #chmod 700 /root/basic_66.sh #chmod 700 /root/osinstallcheck.sh #sh /root/basic_66.sh #rm -f /root/basic_66.sh #sed -i '/^%pre/,/^%end/d;/^%post/,/^%end/d' /root/anaconda-ks.cfg #sed -i -e 's/\(^SELINUX=\)enforcing$/\1disabled/' /etc/selinux/config # 설치 후 network를 통해 후 작업 %post cat > /etc/yum.repos.d/rhel65.repo << EOF [rhel] name=rhel6 baseurl=http://192.168.0.140/redhat6.5 gpgcheck=0 EOF # minimal 설치 시 부수적인 패키지 설치이다. Base 설치라면 아래 yum 라인은 주석처리 해도 된다. yum install -y bzip ethtool man-pages man-pages-overrides ntp ntpdate openssh-clients sos sysstat zip unzip vim-enhanced nfs-utils rpcbind xinetd tcp_wrappers rm -f /etc/yum.repos.d/rhel65.repo sed -i '/^%pre/,/^%end/d;/^%post/,/^%end/d' /root/anaconda-ks.cfg sed -i -e 's/\(^SELINUX=\)enforcing$/\1disabled/' /etc/selinux/config %end
- BIOS 펌웨어 형태가 UEFI, Legacy 인지 판별하여 자동으로 그에 맞게 파티셔닝을 하도록 스크립트 적용
- UEFI 모드로 설치 시엔 GPT 파티션 테이블을 사용하므로 확장 파티션이 빠지게 된다.
- 서버의 물리 메모리 크기를 확인하여 swap, crash 파티션을 자동 계산되도록 스크립트 적용
만약 LVM을 사용하지 않는다면 파티션 부분의 함수 3개의 내용을 아래와 같이 적용해야 한다.
PartitioningEfiBoot () { echo "bootloader --location partition --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE --asprimary" >> /tmp/part-include echo "part /boot/efi --fstype vfat --size 256 --asprimary" >> /tmp/part-include if [ $MEMSIZE -le 2048 ]; then echo "part swap --fstype swap --size $SWAPSIZE1" >> /tmp/part-include elif [ $MEMSIZE -ge 63000 ]; then echo "part swap --fstype swap --size $SWAPSIZE3" >> /tmp/part-include else echo "part swap --fstype swap --size $SWAPSIZE2" >> /tmp/part-include fi } PartitioningLegacyBoot () { echo "bootloader --location mbr --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE --asprimary" >> /tmp/part-include if [ $MEMSIZE -le 2048 ]; then echo "part swap --fstype swap --size $SWAPSIZE1 --asprimary" >> /tmp/part-include elif [ $MEMSIZE -ge 63000 ]; then echo "part swap --fstype swap --size $SWAPSIZE3 --asprimary" >> /tmp/part-include else echo "part swap --fstype swap --size $SWAPSIZE2 --asprimary" >> /tmp/part-include fi } PartitioningCommon () { echo "part / --fstype ext4 --size $ROOTSIZE --asprimary" >> /tmp/part-include echo "part /var --fstype ext4 --size $VARSIZE" >> /tmp/part-include echo "part /var/crash --fstype ext4 --size $CRASHSIZE" >> /tmp/part-include echo "part /usr --fstype ext4 --size $USRSIZE" >> /tmp/part-include # 나머지 파티션은 LVM(PV) 구성(아래 한 줄) echo "part pv.01 --size 1 --grow" >> /tmp/part-include #echo "logvol /home --fstype ext4 --vgname rootvg --size $HOMESIZE --name homelv" >> /tmp/part-include }
2.10. OS 설치 테스트
PXE 부팅을 우선순위로 두고 OS를 설치하면 된다.
- UEFI 모로 부팅하여 설치 시 부트로더 메뉴가 보이기 까지, 그리고 vmlinux 압축해제가 느리다.(Legacy 모드 대비하여)
└ 아래와 같이 메모리 할당 정보가 모니터에 찍힌다.(일부 VM에 따라서는 안 찍힐 수도 있다.)
- 아래는 Legacy 모드로 부팅 시 부트로더 화면이다.
3. Custom DVD 제작
3.1. DVD 마운트
- 아래는 물리 DVD ROM을 마운트 하였으나, ISO 파일로도 마운트 할 수 있다.
[root@Kicksatrt-server ~]# mkdir /rhel65 ; mkdir /rhel66 [root@Kicksatrt-server ~]# mount /dev/sr0 /rhel65 [root@Kicksatrt-server ~]# mount /dev/sr1 /rhel66
- 부팅 후 자동 마운트 적용
[root@Kicksatrt-server ~]# vim /etc/rc.local mount /dev/sr0 /rhel65/ mount /dev/sr1 /rhel66/
3.2. 마운트 상태 확인
[root@Kicksatrt-server /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_kicksatrtserver-lv_root 18G 15G 1.8G 90% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda1 485M 39M 421M 9% /boot /dev/sr0 3.6G 3.6G 0 100% /rhel65 /dev/sr1 3.6G 3.6G 0 100% /rhel66 /dev/mapper/vg00-data1 30G 12G 17G 40% /data1
3.3. DVD 복사
[root@Kicksatrt-server ~]# mkdir /data1/custom-rhel66 [root@Kicksatrt-server ~]# rsync -av /rhel66/ /data1/custom-rhel66 . . [root@Kicksatrt-server ~]# ls -la /data1/custom-rhel66 total 500 dr-xr-xr-x 14 root root 4096 Sep 11 03:22 . drwxrwxrwx 5 root root 4096 Sep 15 01:38 .. -r--r--r-- 1 root root 56 Sep 26 2014 .discinfo dr-xr-xr-x 3 root root 4096 Sep 26 2014 EFI -r--r--r-- 1 root root 8724 Nov 8 2012 EULA -r--r--r-- 1 root root 10726 Nov 8 2012 EULA_de -r--r--r-- 1 root root 8724 Nov 8 2012 EULA_en -r--r--r-- 1 root root 10846 Nov 8 2012 EULA_es -r--r--r-- 1 root root 10682 Nov 8 2012 EULA_fr -r--r--r-- 1 root root 10497 Nov 8 2012 EULA_it -r--r--r-- 1 root root 13173 Nov 8 2012 EULA_ja -r--r--r-- 1 root root 9841 Nov 8 2012 EULA_ko -r--r--r-- 1 root root 10033 Nov 8 2012 EULA_pt -r--r--r-- 1 root root 7306 Nov 8 2012 EULA_zh -r--r--r-- 1 root root 18092 Jun 30 2010 GPL dr-xr-xr-x 3 root root 4096 Sep 26 2014 HighAvailability dr-xr-xr-x 3 root root 4096 Sep 26 2014 images dr-xr-xr-x 2 root root 4096 Sep 11 03:25 isolinux drwxr-xr-x 2 root root 4096 Sep 14 21:44 ks dr-xr-xr-x 3 root root 4096 Sep 26 2014 LoadBalancer -r--r--r-- 1 root root 114 Sep 26 2014 media.repo dr-xr-xr-x 2 root root 266240 Sep 26 2014 Packages -r--r--r-- 1 root root 16435 Sep 2 2010 README dr-xr-xr-x 25 root root 4096 Sep 26 2014 release-notes dr-xr-xr-x 2 root root 4096 Sep 26 2014 repodata dr-xr-xr-x 3 root root 4096 Sep 26 2014 ResilientStorage -r--r--r-- 1 root root 3375 Sep 15 2014 RPM-GPG-KEY-redhat-beta -r--r--r-- 1 root root 3211 Sep 15 2014 RPM-GPG-KEY-redhat-release dr-xr-xr-x 3 root root 4096 Sep 26 2014 ScalableFileSystem dr-xr-xr-x 3 root root 4096 Sep 26 2014 Server -r--r--r-- 1 root root 3757 Sep 26 2014 TRANS.TBL -r--r--r-- 1 root root 2742 Sep 26 2014 .treeinfo
- .discinfo 와 .treeinfo 파일이 꼭 있어야 한다. 그렇지 않으면 부팅이 안된다.(복사할 때 주의)
- EFI 디렉토리 : UEFI 부팅 관련 파일들 위치
- isolinux 디렉토리 : Legacy Bios 부팅 관련 파일들 위치
- ks 디렉토리 : kickstart 관련 config 파일들 위치
- EFI 부트로더 관련 디렉토리 내 파일들
[root@Kicksatrt-server ~]# ls -la /data1/custom-rhel66/EFI/BOOT/ total 296 dr-xr-xr-x 2 root root 4096 Sep 11 03:24 . dr-xr-xr-x 3 root root 4096 Sep 26 2014 .. -rwxr-xr-x 1 root root 765 Sep 11 03:24 BOOTX64.conf -r-xr-xr-x 1 root root 253736 Aug 30 2014 BOOTX64.efi -rw-r--r-- 1 root root 22803 Sep 11 03:24 ost-splash.xpm.gz -r--r--r-- 1 root root 1341 May 7 2010 splash.xpm.gz -r--r--r-- 1 root root 672 Sep 26 2014 TRANS.TBL
- BOOTX64.conf : EFI 펌웨어 모드에서의 부트로더 메뉴
- ost-splash.xpm.gz : 부트로더의 배경 그림(custom)
3.4. 부트로더메뉴 설정
- EFI 부트로더 메뉴 BOOTX64.conf 파일의 설정 내용
[root@Kicksatrt-server ~]# vim /data1/custom-rhel66/EFI/BOOT/BOOTX64.conf default=0 splashimage=/EFI/BOOT/ost-splash.xpm.gz hiddenmenu title Boot local hard drive root (hd0,0) chainloader /EFI/redhat/grub.efi title custom-rhel66-standard-ko installed system kernel /images/pxeboot/vmlinuz ks=cdrom:/ks/ks66_standard_ko.cfg initrd /images/pxeboot/initrd.img title custom-rhel66-standard-en installed system kernel /images/pxeboot/vmlinuz ks=cdrom:/ks/ks66_standard_en.cfg initrd /images/pxeboot/initrd.img title Red Hat Enterprise Linux 6.6 kernel /images/pxeboot/vmlinuz initrd /images/pxeboot/initrd.img title Install system with basic video driver kernel /images/pxeboot/vmlinuz xdriver=vesa nomodeset askmethod initrd /images/pxeboot/initrd.img title rescue kernel /images/pxeboot/vmlinuz rescue askmethod initrd /images/pxeboot/initrd.img
- Language 설정에 따라 선택할 수 있도록 ko, en 으로 메뉴를 나눔
- timeout을 뺌으로서 메뉴 엔터 입력이 없으면 메뉴에 계속 머무름
- splashimage 를 ost-splash.xpm.gz 로 지정하여 부트로더에 custom 배경화면을 적용
- Legacy BIOS 부트로더 메뉴 BOOTX64.conf 파일의 설정 내용
[root@Kicksatrt-server ~]# vim /data1/custom-rhel66/isolinux/isolinux.cfg default vesamenu.c32 menu tabmsg Press ENTER to Install or TAB to edit a menu entry menu background ost-splash.png label custom-rhel66-standard-ko menu label ^custom-rhel66-standard-ko installed system menu default kernel vmlinuz append initrd=initrd.img ks=cdrom:/ks/ks66_standard_ko.cfg label custom-rhel66-standard-en menu label ^custom-rhel66-standard-en installed system menu default kernel vmlinuz append initrd=initrd.img ks=cdrom:/ks/ks66_standard_en.cfg label linux menu label ^Install or upgrade an existing system menu default kernel vmlinuz append initrd=initrd.img label vesa menu label Install system with ^basic video driver kernel vmlinuz append initrd=initrd.img xdriver=vesa nomodeset label rescue menu label ^Rescue installed system kernel vmlinuz append initrd=initrd.img rescue label local menu label Boot from ^local drive localboot 0xffff label memtest86 menu label ^Memory test kernel memtest append -
- Language 설정에 따라 선택할 수 있도록 ko, en 으로 메뉴를 나눔
- timeout을 뺌으로서 메뉴 엔터 입력이 없으면 메뉴에 계속 머무름
- kickstart config 내용
[root@Kicksatrt-server ~]# vim /data1/custom-rhel66/ks/ks66_standard_en.cfg install text cdrom key --skip lang en_US.UTF-8 keyboard us network --device link --bootproto dhcp --noipv6 --hostname Sample-local rootpw imsi00 firewall --disabled selinux --disabled authconfig --enableshadow --passalgo=sha512 timezone Asia/Seoul poweroff %include /tmp/part-include %pre #!/bin/sh BOOTSIZE=1024 ROOTSIZE=30720 VARSIZE=15360 USRSIZE=15360 HOMESIZE=10240 GatherSizing () { MEMINFO=$(cat /proc/meminfo | grep MemTotal | awk -F " " '{print $2}') MEMSIZE=$(($MEMINFO / 1024)) CRASHSIZE=$(echo "$MEMSIZE 1.3" | awk '{printf "%.f", $1 * $2}') SWAPSIZE1=$(($MEMINFO / 1024 * 2)) SWAPSIZE2=$(echo "16384") SWAPSIZE3=$(echo "32768") } Clearing () { echo "zerombr" >> /tmp/part-include echo "ignoredisk --only-use sda" >> /tmp/part-include echo "clearpart --initlabel --all" >> /tmp/part-include } PartitioningEfiBoot () { echo "bootloader --location partition --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE --asprimary" >> /tmp/part-include echo "part /boot/efi --fstype vfat --size 256 --asprimary" >> /tmp/part-include if [ $MEMSIZE -le 2048 ]; then echo "part swap --fstype swap --size $SWAPSIZE1" >> /tmp/part-include elif [ $MEMSIZE -ge 63000 ]; then echo "part swap --fstype swap --size $SWAPSIZE3" >> /tmp/part-include else echo "part swap --fstype swap --size $SWAPSIZE2" >> /tmp/part-include fi } PartitioningLegacyBoot () { echo "bootloader --location mbr --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE --asprimary" >> /tmp/part-include if [ $MEMSIZE -le 2048 ]; then echo "part swap --fstype swap --size $SWAPSIZE1 --asprimary" >> /tmp/part-include elif [ $MEMSIZE -ge 63000 ]; then echo "part swap --fstype swap --size $SWAPSIZE3 --asprimary" >> /tmp/part-include else echo "part swap --fstype swap --size $SWAPSIZE2 --asprimary" >> /tmp/part-include fi } PartitioningCommon () { echo "part / --fstype ext4 --size $ROOTSIZE --asprimary" >> /tmp/part-include echo "part /var --fstype ext4 --size $VARSIZE" >> /tmp/part-include echo "part /var/crash --fstype ext4 --size $CRASHSIZE" >> /tmp/part-include echo "part /usr --fstype ext4 --size $USRSIZE" >> /tmp/part-include #echo "logvol /home --fstype ext4 --vgname rootvg --size $HOMESIZE --name homelv" >> /tmp/part-include } if [ -d /sys/firmware/efi ] ; then GatherSizing; Clearing; PartitioningEfiBoot; PartitioningCommon; else GatherSizing; Clearing; echo "ignoredisk --only-use sda" >> /tmp/part-include echo "clearpart --initlabel --all" >> /tmp/part-include } PartitioningEfiBoot () { echo "bootloader --location partition --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE --asprimary" >> /tmp/part-include echo "part /boot/efi --fstype vfat --size 256 --asprimary" >> /tmp/part-include if [ $MEMSIZE -le 2048 ]; then echo "part swap --fstype swap --size $SWAPSIZE1" >> /tmp/part-include elif [ $MEMSIZE -ge 63000 ]; then echo "part swap --fstype swap --size $SWAPSIZE3" >> /tmp/part-include else echo "part swap --fstype swap --size $SWAPSIZE2" >> /tmp/part-include fi } PartitioningLegacyBoot () { echo "bootloader --location mbr --driveorder sda" >> /tmp/part-include echo "part /boot --fstype ext4 --size $BOOTSIZE --asprimary" >> /tmp/part-include if [ $MEMSIZE -le 2048 ]; then echo "part swap --fstype swap --size $SWAPSIZE1 --asprimary" >> /tmp/part-include elif [ $MEMSIZE -ge 63000 ]; then echo "part swap --fstype swap --size $SWAPSIZE3 --asprimary" >> /tmp/part-include else echo "part swap --fstype swap --size $SWAPSIZE2 --asprimary" >> /tmp/part-include fi } PartitioningCommon () { echo "part / --fstype ext4 --size $ROOTSIZE --asprimary" >> /tmp/part-include echo "part /var --fstype ext4 --size $VARSIZE" >> /tmp/part-include echo "part /var/crash --fstype ext4 --size $CRASHSIZE" >> /tmp/part-include echo "part /usr --fstype ext4 --size $USRSIZE" >> /tmp/part-include echo "part pv.01 --size 1 --grow" >> /tmp/part-include #echo "logvol /home --fstype ext4 --vgname rootvg --size $HOMESIZE --name homelv" >> /tmp/part-include } if [ -d /sys/firmware/efi ] ; then GatherSizing; Clearing; PartitioningEfiBoot; PartitioningCommon; else GatherSizing; Clearing; PartitioningLegacyBoot; PartitioningCommon; fi %end repo --name="Red Hat Enterprise Linux" --baseurl=file:///mnt/source --cost=100 %packages --nobase @core @korean-support @server-policy %end %post mount /dev/sr0 /mnt cp -a /mnt/ks/basic_66.sh /root cp -a /mnt/ks/osinstallcheck.sh /root cp -a /mnt/ks/kernel-2.6.32-504.30.3.el6.x86_64.tar.gz /root cp -a /mnt/ks/sec_20150908.tar.gz /root echo "[rhel]" >> /etc/yum.repos.d/rhel66.repo echo "name=rhel6" >> /etc/yum.repos.d/rhel66.repo echo "baseurl=file:///mnt" >> /etc/yum.repos.d/rhel66.repo echo "gpgcheck=0" >> /etc/yum.repos.d/rhel66.repo yum install -y bzip ethtool man-pages man-pages-overrides ntp ntpdate openssh-clients sos sysstat unzip vim-enhanced zip nfs-utils rpcbind xinetd tcp_wrappers rm -f /etc/yum.repos.d/rhel66.repo chmod 755 /root/basic_66.sh chmod 755 /root/osinstallcheck.sh sh /root/basic_66.sh rm -f /root/basic_66.sh sed -i '/^%pre/,/^%end/d;/^%post/,/^%end/d' /root/anaconda-ks.cfg sed -i -e 's/\(^SELINUX=\)enforcing$/\1disabled/' /etc/selinux/config %end
- 주석을 모두 뺀 cfg 파일이다.
- LVM 파티셔닝을 하지 않았다. 단, 파티셔닝 후 나머지 여분의 공간만 PV를 만듬.
3.5. ISO 파일 생성
[root@Kicksatrt-server ~]# cd /data1/custom-rhel66/ [root@Kicksatrt-server custom-rhel66]# pwd /data1/custom-rhel66 [root@Kicksatrt-server custom-rhel66]# mkisofs -U -A "rhel66 x86_64" -V "Custom rhel66 Boot" -volset "Custom RHEL6.6 x86_64" -J -joliet-long -r -v -T -x ./lost+found -o /root/ost-custom-rhel66-standard_150911.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e images/efiboot.img -no-emul-boot .
- DVD 파일들이 위치한 /data1/custom-rhel66 디렉토리에서 mkisofs 명령을 수행해야 된다.
3.6. OS 설치 테스트
smb로 연결된 윈도우 PC의 VMware에서 생성된 ISO 파일을 이용하여 DVD 자동 설치 진행.
이상 없으면 필요 여부에 따라 DVD를 굽는다.
4. 디렉토리 구성 파일[첨부]
- 이 문서를 보고 파일을 만들어도 되지만, 문서를 작성할 당시의 build 서버 내의 구성 파일들을 넣어 두었으니 필요시 아래 파일을 다운 받을 것.
4.1. Network 인스톨을 위한 파일들
- 참고로 redhat6.5, redhat6.6 디렉토리 내의 initrd.img, vmlinuz과 kickstart 디렉토리 내의 별도 패치 파일 등은 용량을 줄이기 위해 뺐다.
- / 디렉토리에 저장 후 / 에 위치하여 압축을 풀면 된다.
4.2. DVD 인스톨을 위한 파일들
- 참고로 isolinux 디렉토리 내의 initrd.img, vmlinuz과 ks 디렉토리 내의 별도 패치 파일 등은 용량을 줄이기 위해 뺐다.
- /data1 디렉토리에 저장 후 /data1 에 위치하여 압축을 풀면 된다.
5. 참고 자료
RHEL 6, 7 - PXE, UEFI, Kickstart
RedHat Linux UEFI 모드 설치 여부 확인하기
이상이다.
UEFI 로컬디스크 부팅이 안 되는 문제는 아래 URL 참고하시면 되겠습니다.
https://access.redhat.com/solutions/6224241
공유 감사합니다. 🙂