====== OS Install: VM Template ======
**General Information**
Creating a VM template "golden image" for Linux.
**Checklist**
* Distro(s): Enterprise Linux 6 or 7
* Other: VMware ESXi 5+
----
====== Create the Virtual Machine ======
* Create a new virtual machine.
* Virtual Hardware:
* Enable CPU -> CPU Hot Plug -> check "Enable CPU Hot Add" (Allows you to add CPUs to a VM while running)
* Enable Memory -> Memory Hot Plug -> check "Enable" (Allows you to add Memory to a VM while running)
* Install the EL OS.
* If the screen resolution is too small
* Press "TAB" on the "Install CentOS.." to edit the boot options
* Add the following to the boot line, which will use a 1024x768 resolutionvga=791
----
===== Partitioning =====
Red Hat Recommendations
* [[https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s2-diskpartrecommend-x86.html|RHEL 6 Recommended Partitioning]]
* [[https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-disk-partitioning-setup-x86.html#sect-recommended-partitioning-scheme-x86|RHEL 7 Recommended Partitioning]]
LVM provides a very flexible partitioning layout. The goal is to create a small disk footprint and allow elastic growing for partitions depending upon the type of server being deployed.
* **Disk Total Size**: 20 GB
* /boot = 512 MB
* LVM = 19.5 GB
* swap = 4 GB
* / = 4 GB
* /home = 2 GB
* /tmp = 2 GB
* /var = 4 GB
* LVM Allocated: 16 GB
* LVM Free: 3.5 GB (Available for minor partition expansion)
**NOTE:** Contrary to a lot of online documentation, it is a BAD idea to put /usr on a separate partition. Especially with CentOS 7.2 (which symlinks /bin, /lib, and /sbin into /usr/{bin,lib,sbin} respectively), there are important files in /usr that should be mounted along with /.
\\
After a CentOS 6.7 minimal install, the disk usage with that partitioning looks like this:\\
TODO - SCREENSHOT
After a CentOS 7.2 minimal install, the disk usage with that partitioning looks like this:\\
TODO - SCREENSHOT
----
====== System Configuration =====
Modify the OS with changes you want to be included on ALL systems. They should be server role generic.
----
===== CentOS 6: Post Install/Pre Template Create =====
The following are some useful post install configuration done to a CentOS 6 minimal install.\\
All of the following will be included in the VM template. Keep it server role generic.
# System Update
yum update
# Extra system packages
yum -y install bash-completion bind-utils dmidecode iotop lsof mailx man mlocate nc nfs-utils openssh-clients rsync tcpdump vim-enhanced wget
# Install VMware Tools
See: https://www.owlbearconsulting.com/doku.php?id=linux_wiki:vmware_tools
# Disable SELinux (/etc/sysconfig/selinux SHOULD be a symlink to first original file)
sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/selinux/config
sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/sysconfig/selinux
# Reboot for selinux to not interfere with the rest of the config changes
shutdown -r now
# Remove Global Network Gateway
sed -i "/GATEWAY/d" /etc/sysconfig/network
# Grub Config => /boot/grub/grub.conf
timeout=3
removed 'hiddenmenu'
removed 'rhgb quiet' from kernel boot lines
# Root's bashrc (/root/.bashrc) => Red Prompt and service shortcut
PS1='\[\033[01;31m\]\u@\h \[\033[01;31m\]\W $ \[\033[00m\]'
#service shortcut
alias sv='service'
# Reboot and verify all changes persistent
shutdown -r now
**Proceed to "CentOS 6: VM Cleanup" before creating template.**
----
===== CentOS 6: VM Cleanup =====
Perform any other customizations/installs prior to the following steps.
# Cleanup => Remove ssh host keys (so each deployed VM has a different fingerprint)
rm -f /etc/ssh/ssh_host_*
# Cleanup => Remove persistent rules and network hw address - prevents eth0 from incrementing
rm -f /etc/udev/rules.d/70-persistent-*
sed -i "/HWADDR/d" /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i "/UUID/d" /etc/sysconfig/network-scripts/ifcfg-eth0
# Cleanup => Remove some of root's files
rm -f /root/anaconda-ks.cfg /root/install.log*
# Cleanup => remove tmp files
rm -rf /tmp/*
# Cleanup => stop auditd from logging, remove log files
# Stop any other service that actively logs to sub directories of /var/log
# Recommended to install sysstat (sar) during a post deployment phase.
service auditd stop
rm -rf /var/log/*
mkdir /var/log/audit
# Update locate's database
updatedb
# Clear history and shutdown for template cloning
history -c && history -w
shutdown -P now
* Create a VM Template from the powered off system.
----
===== CentOS 7: Post Install/Pre Template Create =====
The following are some useful post install configuration done to a CentOS 7 minimal install.\\
All of the following will be included in the VM template. Keep it server role generic.
# System Update
yum update
# Extra system packages (dmidecode,man,openssh-clients installed by default)
yum -y install bash-completion bind-utils iotop lsof mailx mlocate nfs-utils open-vm-tools perl rsync tcpdump vim-enhanced wget
# Update man pages
mandb
# Install VMware Tools (open-vm-tools included in CentOS 7 base repo) - Installed above
# Disable SELinux (/etc/sysconfig/selinux SHOULD be a symlink to first original file)
sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/selinux/config
sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/sysconfig/selinux
# Reboot for selinux to not interfere with the rest of the config changes
shutdown -r now
# Grub Config => kernel options and change network interface names back to legacy
vim /etc/default/grub
timeout=3
#removed 'rhgb quiet' from kernel boot lines ("GRUB_CMDLINE_LINUX")
#append the 'net.ifnames=0 biosdevname=0' to GRUB_CMDLINE_LINUX:
GRUB_CMDLINE_LINUX="rd.lvm.lv=vglocal/lvswap rd.lvm.lv=vglocal/lvroot net.ifnames=0 biosdevname=0"
#generate new grub2 boot file
grub2-mkconfig -o /boot/grub2/grub.cfg
# Change network interface back to legacy scheme (continued)
mv /etc/sysconfig/network-scripts/ifcfg-en0XXXX /etc/sysconfig/network-scripts/ifcfg-eth0
vim /etc/sysconfig/network-scripts/ifcfg-eth0
Name="eth0"
Device="eth0"
#removed UUID
systemctl restart NetworkManager
# Root's bashrc (/root/.bashrc) => Red Prompt and systemctl shortcut
# systemctl shortcut
alias sc='systemctl'
# Turn root's prompt red
PS1='\[\033[01;31m\]\u@\h \[\033[01;31m\]\W $ \[\033[00m\]'
# Disable NetworkManager for old style network scripts
vim /etc/sysconfig/network-scripts/ifcfg-eth0
NM_CONTROLLED="no"
PEERDNS="no"
IPV6_PEERDNS="no"
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl mask NetworkManager
systemctl start network
systemctl enable network
# Reboot and verify all changes persistent
shutdown -r now
**Proceed to "CentOS 7: VM Cleanup" before creating template.**
----
===== CentOS 7: VM Cleanup =====
Perform any other customizations/installs prior to the following steps.
# Cleanup => Remove ssh host keys (so each deployed VM has a different fingerprint)
rm -f /etc/ssh/ssh_host_*
# Cleanup => Remove network hw address - prevents eth0 from incrementing
sed -i "/HWADDR/d" /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i "/UUID/d" /etc/sysconfig/network-scripts/ifcfg-eth0
# Cleanup => Remove some of root's files
rm -f /root/anaconda-ks.cfg /root/install.log*
# Cleanup => remove tmp files
rm -rf /tmp/*
# Cleanup => stop auditd from logging, remove log files
# Stop any other service that actively logs to sub directories of /var/log
# Recommended to install sysstat (sar) during a post deployment phase.
systemctl stop auditd
rm -rf /var/log/*
mkdir {/var/log/audit,/var/log/chrony,/var/log/tuned}
touch /var/log/spooler && chmod 600 /var/log/spooler
# Update locate's database
updatedb
# Clear history and shutdown for template cloning
history -c && history -w
shutdown -P now
* Create a VM Template from the powered off system.
----