CentOS에서 Kickstart 파일의 %pre 섹션에서 사용할 수 있는 명령은 무엇입니까?

CentOS에서 Kickstart 파일의 %pre 섹션에서 사용할 수 있는 명령은 무엇입니까?

환경: CentOS 5.5 및 6.4

고객이 표준 이하의 서버 하드웨어에 소프트웨어를 설치하지 않도록 설치 전에 하드웨어를 분석해야 합니다. 예를 들어 메모리, 디스크 공간, CPU, 네트워크 카드 등을 확인하는 경우, ks.cfg 파일의 %pre 섹션이 이 작업을 수행하기에 완벽한 장소인 것 같습니까? ? ? 그런데 free to work 같은 명령은 못 나오네요... %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

설치의 첫 번째 부분에서 화면에 "하드웨어 분석 중..."이 표시되지만 아무 것도 표시되지 않습니다.

답변1

%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등. ~을 위한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.)

답변2

이와 같은 명령은 일반적으로 %pre킥스타트 섹션에서 사용할 수 없습니다.

발췌-http://narrabilis.com/book/export/s5/6

%예비의

%pre 섹션에서는 시스템을 설치하기 전에 실행할 명령을 지정할 수 있습니다. 여기에 배치된 명령은 루트가 지정된 설치 환경에서 실행되지 않습니다. %pre킥스타트 파일의 끝에 있어야 합니다. 이 %pre줄에 --interpreter를 추가하면 규정이 다음과 다른 인터프리터를 실행하도록 할 수 있습니다./bin/sh

%preFedora 문서에서는 섹션에서 사용할 수 있는 내용도 설명합니다.4장 사전 설치 스크립트Anaconda/Kickstart 문서.

발췌

ks.cfg를 구문 분석하고 lang, 키보드 및 url 옵션을 처리한 후 즉시 시스템에서 실행할 명령을 추가할 수 있습니다. 이 섹션은 킥스타트 파일의 끝(명령 뒤)에 있어야 하며 %pre 명령으로 시작해야 합니다. %pre 섹션에서 네트워크에 접속할 수 있지만 현재는 이름 서비스가 구성되지 않았으므로 IP 주소만 사용할 수 있습니다.

마지막으로 공식 Red Hat 문서에는 다음과 같은 내용이 나와 있습니다.32.6. 사전 설치 스크립트:

kickstart의 사전 설치 스크립트 부분은 여러 설치 트리나 소스 미디어를 관리할 수 없습니다. 사전 설치 스크립트는 설치 프로세스의 두 번째 단계에서 발생하므로 생성하는 모든 ks.cfg 파일에는 이 정보가 포함되어야 합니다.

따라서 인터프리터(Bash, Python 등)에 포함된 명령에만 액세스할 수 있지만 그 외의 명령에는 액세스할 수 없습니다.

답변3

좀 더 조사한 결과 문제의 섹션을 실행하는 동안 볼 수 /proc있는 풍부한 시스템 정보를 발견했습니다 . 필요한 모든 정보를 얻으려면 dmidecode와 /proc의 파일을 확인하세요. 이것은 나에게 효과적입니다.%preks.cfg

%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

관련 정보