環境:CentOS 5.5および6.4
インストール前にハードウェアを分析して、お客様が標準以下のサーバーハードウェアにソフトウェアをインストールしないようにしてほしいとの要望があります。たとえば、メモリ、ディスク容量、CPU、ネットワークカードなどを調べているので、ks.cfgファイルの%preセクションは、これを行うのに最適な場所のようです。しかし、自由に動作するようなコマンドを取得することはできません。 。ks.cfgの%preセクションがこれを行うのに適していない場合、どこですか?これが私がこれまでに試したものであり、何も出力されません:
ks.cfg:
%pre
(echo "Analyzing Hardware...") >/dev/tty1
free >/dev/tty1
free_txt=`free -o`
(echo "$free_txt") >/dev/tty1
%end
インストールの最初の部分で画面に「ハードウェアを分析しています...」と表示されますが、その後は何も表示されません。
もう少し掘り下げた後、/proc
の%pre
セクションの実行時に表示できるks.cfg
に大量のシステム情報が見つかりました。/procのdmidecodeとファイルをチェックアウトして、必要なすべての情報を取得します。これが私のために働いたものです:
%pre --log=/tmp/ks_pre.log
#!/bin/sh
#----------------------------------------------
# echos message to console screen and a log file
#----------------------------------------------
echo_screen_n_log() {
msg=$1
# Send to console screen
(echo "$msg") >/dev/tty1
# Send to log
echo "$msg"
}
echo_screen_n_log ""
echo_screen_n_log "Analyzing Hardware..."
echo_screen_n_log ""
#----------------------------------------------
# System Memory
#----------------------------------------------
IFS=$'\n'
mem_info=(`dmidecode --type memory`)
unset IFS
sys_mem_sizes=""
sys_mem_banks=""
sys_tot_mem=0
cntr=0
bank_cntr=0
for i in "${mem_info[@]}"
do
# echo_screen_n_log "i: $i"
# Maximum system memory that can be placed on the motherboard
REG_EX="Maximum Capacity: (.*)$"
if [[ $i =~ $REG_EX ]]
then
sys_mem_max=${BASH_REMATCH[1]}
fi
# How many memory slots are on the motherboard
REG_EX="Number Of Devices: (.*)$"
if [[ $i =~ $REG_EX ]]
then
sys_mem_slots=${BASH_REMATCH[1]}
fi
REG_EX="^[[:space:]]+Size: (.*)$"
if [[ $i =~ $REG_EX ]]
then
sys_mem_sizes[cntr]=${BASH_REMATCH[1]}
cntr=$(( $cntr + 1 ))
fi
REG_EX="^[[:space:]]+Bank Locator: (.*)$"
if [[ $i =~ $REG_EX ]]
then
sys_mem_banks[bank_cntr]=${BASH_REMATCH[1]}
bank_cntr=$(( $bank_cntr + 1 ))
fi
done
cntr=$(( $cntr - 1 ))
echo_screen_n_log "Max system memory: $sys_mem_max"
echo_screen_n_log "Total system slots: $sys_mem_slots"
i=0
while [ $i -le $cntr ]
do
echo_screen_n_log "Memory Bank Location ${sys_mem_banks[$i]} : ${sys_mem_sizes[$i]}"
REG_EX="No Module Installed$"
if [[ ! ${sys_mem_sizes[$i]} =~ $REG_EX ]]
then
REG_EX="^([0-9]+) [A-Z][A-Z]$"
if [[ ${sys_mem_sizes[$i]} =~ $REG_EX ]]
then
sys_tot_mem=$(( $sys_tot_mem + ${BASH_REMATCH[1]} ))
fi
fi
i=$(( $i + 1 ))
done
echo_screen_n_log "System Total Memory: $sys_tot_mem MB"
#--------------------------------------------
# Get Disk size information
#--------------------------------------------
IFS=$'\n'
disk_info=(`cat /proc/partitions`)
unset IFS
total_disk_space=0
type=""
# Grab from minor column starting with 0 ending in 3 letters (drive node)
REG_EX="0\s+([0-9]+) [a-z][a-z][a-z]$"
for i in "${disk_info[@]}"
do
# echo_screen_n_log "i: $i"
if [[ $i =~ $REG_EX ]]
then
total_disk_space=${BASH_REMATCH[1]}
total_disk_space=$(( $total_disk_space * 1024 ))
type="GB"
div_num=1000000000
if [ "$total_disk_space" -lt $div_num ]
then
type="MB"
div_num=1000000
fi
total_disk_space=$(( $total_disk_space / $div_num ))
fi
done
echo_screen_n_log "Disk Space: $total_disk_space $type"
#-----------------------------------------------------
# Get CPU model name
#-----------------------------------------------------
cpu_grep=`grep 'model name' /proc/cpuinfo`
cpu_model_nm="Not Found!"
REG_EX="^.*: (.*)$"
if [[ $cpu_grep =~ $REG_EX ]]
then
cpu_model_nm=${BASH_REMATCH[1]}
fi
echo_screen_n_log "CPU Model: $cpu_model_nm"
#-------------------------------------------------------
# Get number of physical CPUs
#-------------------------------------------------------
IFS=$'\n'
cpu_count=(`grep "physical id" /proc/cpuinfo`)
unset IFS
last_cpu_id=""
total_cpu_cnt=0
# Add up all cores of the CPU to get total MIPS
total_cpus=0
REG_EX="^physical id\s+: ([0-9]+)$"
for i in "${cpu_count[@]}"
do
# echo_screen_n_log "i: $i"
if [[ $i =~ $REG_EX ]]
then
cpu_id=${BASH_REMATCH[1]}
if [ ! "$last_cpu_id" = "$cpu_id" ]
then
total_cpu_cnt=$(( $total_cpu_cnt + 1 ))
last_cpu_id=$cpu_id
fi
fi
done
echo_screen_n_log "System physical CPUs: $total_cpu_cnt"
#-------------------------------------------------------
# Get number of CPU cores
#-------------------------------------------------------
IFS=$'\n'
cpu_cores=(`grep -m 1 "cpu cores" /proc/cpuinfo`)
unset IFS
total_cpu_cores=0
REG_EX="^cpu cores\s+: ([0-9]+)$"
for i in "${cpu_cores[@]}"
do
# echo_screen_n_log "i: $i"
if [[ $i =~ $REG_EX ]]
then
total_cpu_cores=${BASH_REMATCH[1]}
fi
done
echo_screen_n_log "CPU cores: $total_cpu_cores"
#-------------------------------------------------------
# CPU MHz
#-------------------------------------------------------
IFS=$'\n'
dmi_cpu_MHz=(`dmidecode --string processor-frequency`)
unset IFS
cpu_MHz=0
REG_EX="^[0-9]+ "
for i in "${dmi_cpu_MHz[@]}"
do
# echo_screen_n_log "i: $i"
if [[ $i =~ $REG_EX ]]
then
cpu_MHz=${BASH_REMATCH[1]}
fi
done
echo_screen_n_log "CPU MHz: ${dmi_cpu_MHz:0:1}.${dmi_cpu_MHz:1:$(( ${#dmi_cpu_MHz} - 1 ))}"
#-------------------------------------------------------
# Get CPU bogomips (Millions of instructions per second)
#-------------------------------------------------------
IFS=$'\n'
cpu_mips=(`grep "bogomips" /proc/cpuinfo`)
unset IFS
# Add up all cores of the CPU to get total MIPS
total_mips=0
REG_EX="\s([0-9]+)\..*$"
for i in "${cpu_mips[@]}"
do
# echo_screen_n_log "i: $i"
if [[ $i =~ $REG_EX ]]
then
cpu_bogomips=${BASH_REMATCH[1]}
total_mips=$(( $total_mips + $cpu_bogomips ))
fi
done
echo_screen_n_log "Total CPU MIPS (Millions of instructions per second) : $total_mips"
echo_screen_n_log ""
(echo -n "Press <enter> to continue..") >/dev/tty1
read text
%end
インストールのベースシステムがどのように見えるかを決定するための基準を追加するだけで完了です。
これを詳細情報で更新しました...%preセクションのディスク情報に対して次のこともできます:
IFS=$'\n'
parted_txt=(`parted -l`)
unset IFS
for i in "${parted_txt[@]}"
do
# (echo "i: \"$i\"") >/dev/tty1
REG_EX="^Model: (.*)$"
if [[ $i =~ $REG_EX ]]
then
disk_model=${BASH_REMATCH[1]}
# (echo "Disk Model: \"$disk_model\"") >/dev/tty1
fi
REG_EX="^Disk (.*): ([0-9]+).[0-9]([A-Z][A-Z])$"
if [[ $i =~ $REG_EX ]]
then
disk_device=${BASH_REMATCH[1]}
disk_capacity=${BASH_REMATCH[2]}
disk_capacity_type=${BASH_REMATCH[3]}
(echo "Device: \"$disk_device\" \"$disk_capacity\" $disk_capacity_type") >/dev/tty1
IFS=$'\n'
disk_txt=(`udevadm info --query=all --name=$disk_device`)
unset IFS
is_USB_drive=0
for j in "${disk_txt[@]}"
do
#(echo "j: \"$j\"") >/dev/tty1
REG_EX="^ID_BUS=usb$"
if [[ $j =~ $REG_EX ]]
then
# USB keys are not to be included in total disk space
# (echo "$disk_device is a USB drive!") >/dev/tty1
is_USB_drive=1
fi
done
if [ "$is_USB_drive" = "0" ]
then
total_capacity=$(( $total_capacity + $disk_capacity ))
fi
fi
done
(echo "Disk Model: $disk_model") >/dev/tty1
(echo "Disk $disk_device Capacity: $total_capacity $disk_capacity_type") >/dev/tty1
キックスタート実行の%pre
セクションインストーラー環境内。
以下は、RHEL6.5のインストーラー環境で使用できる便利なコマンドのリストです。
Arch awk basename bash cat chattr chgrp chmod chown chroot clear clock consoletype cp cut date df dmesg du echo egrep env expr false fgrep find getopt grep head hwclock id kill killall killall5 less ln ls lsattr mkdir mknod mktemp mv pidof ps pwd readlink rm rmdir sed sh shred sleep sort split sync tac tail tee top touch true tty uname uniq wc which xargs
less more vi
md5sum sha1sum sha256sum
gzip bzip2 cpio dd tar rpm
fsck
/mkfs
/etc。 ext2 ext3 ext4 xfs btrfs msdos vfat
mkswap swapon swapoff dmraid dmsetup mdadm mdmon dump restore mt lvm lvs vgs pvs ...
arp arping curl dhclient dhclient-script ftp ifconfig hostname ip ipcalc mtr nc ping rcp rdate rlogin telnet nslookup ntpdate route rsh rsync ssh ssh-keygen sshd scp sftp wget
biosdevname blkdeactivate blkid blockdev dmidecode lshal lspci lsscsi sginfo smartctl
eject dump restore hdparm smartctl losetup kpartx parted fdisk sfdisk
chvt consolehelper openvt whiptail zenity
logger rsyslogd syslogd
python
手動インストールを実行する場合、VT2のターミナルに切り替えることができます(CtrlAltF2)そして、インストーラ環境内で利用できるすべてのものを見つけるためにぶらつきます。 compgen -c | sort -u
は、利用可能なすべてのコマンドをリストする簡単な方法であり、/sys
と/proc
には多くのシステム情報があります。
(そして、はい、キックスタートは%pre
スクリプトの実行後に再解析されるため、%pre
はキックスタートを編集したり、%include
で使用する新しいキックスタートスニペットを生成したりできます。)
これらのようなコマンドは、通常、キックスタートの%pre
セクションでは使用できません。
抜粋- http://narrabilis.com/book/export/s5/6
%pre
%preセクションでは、システムをインストールする前に実行するコマンドを指定できます。ここに配置されたコマンドは、chrootされたインストール環境では実行されません。
%pre
は、キックスタートファイルの最後に置く必要があります。%pre
行に--interpreterを追加して、preスクリプトで/bin/sh
とは異なるインタープリターを実行することができます。
Fedoraのドキュメントでは、Anaconda/Kickstartドキュメントのセクション Chapter 4. Pre-installation Script の%pre
で利用できるものについても説明しています。
抜粋
Ks.cfgが解析され、lang、キーボード、およびurlオプションが処理された直後にシステムで実行するコマンドを追加できます。このセクションは、キックスタートファイルの最後(コマンドの後)にあり、%preコマンドで始まる必要があります。 %preセクションでネットワークにアクセスできます。ただし、この時点ではネームサービスが構成されていないため、IPアドレスのみが機能します。
最後に、Red Hatの公式ドキュメントには次のようなタイトルが付けられています。 2.6。プレインストールスクリプト :
キックスタートのプレインストールスクリプトセクションでは、複数のインストールツリーまたはソースメディアを管理できません。プレインストールスクリプトはインストールプロセスの第2段階で実行されるため、作成されたks.cfgファイルごとにこの情報を含める必要があります。
したがって、インタープリターに含まれているコマンド(Bash、Pythonなど)にアクセスできますが、それ以外はほとんどありません。