|
Dez
06
|
Vor einiger Zeit hatte ich (mehr oder weniger wortlos) die Konfigurationsdatei zur automatisierten Installation von ESX 4.x online gestellt. Seither hat sich einiges getan, es gab viele Detailverbesserungen und die Installation wurde deutlich angepasst. Da dieser (wenn man den Statistiken trauen darf) Beitrag einer der Top Scorer ist, möchte ich die Gelegenheit nutzen, euch die neueste Konfiguration zu zeigen und auch ein wenig erklären.
Die automatisierte ESX Installation verwendet das ISO-Image, wie es von VMware zum Download angeboten wird. Lediglich die kickstart-Dateien habe ich in dieses ISO-Image integriert. Das hat den Vorteil, dass die kickstart-Dateien nicht auf dem Netz liegen müssen und die Installation größtenteils ohne Netzwerk auskommt.
Die Verwendung des ISO-Images ist recht einfach…
ISO-Image per ILO (RIB, KVM, etc) mounten, 5 Kommandozeilenparameter angeben und (je nach Netzwerkverbindung) eine halbe Stunde warten.
Die verwendeten Kommandozeileparameter sind:
ESXIP=xxx.xxx.xxx.xxx (Die IP Adresse, über die später die Serviceconsole erreichbar ist)
ESXMASK=xxx.xxx.xxx.xxx (Subnetzmaske, entsprechend den Netzwerkeinstellungen in eurem Netzwerk)
ESXGW=xxx.xxx.xxx.xxx (Das Default Gateway in eurem Netzwerk)
ESXHOST=myserver.fqdn.tld (der vollqualifizierte Rechnername des ESX Servers)
ESXVLAN=xxxx (die VLAN ID, über die die Serviceconsole ereichbar ist – 0 steht für “kein VLAN”)
Einige Sektionen innerhalb der kickstart-Datei erkläre ich Euch genauer:
rootpw --iscrypted $jhjhghjVFHFGCgffGvjHFGJghfHjhGHJ
Das root Passwort als MD5 Hash. Ihr könnt das Passwort selbst erstellen, indem ihr auf einem Linuxserver (oder einem ESX) folgendes Kommando absetzt: openssl passswd -1. Nun müsst ihr das zu generierende Passwort zweimal eingeben. Nun erhaltet ihr den MD5 Hash eures Passwort, welchen ihr in die kickstart-Datei kopiert.
%include /tmp/networkconfig %include /tmp/diskmap
Die networkconfig wird anhand der beim Start eingegebenen Kommandozeilenparameter erstellt und während der Installation in die kickstart-Datei integriert. Die diskmap wird anhand der gefundenen Hardware generiert. Dies ist nötig, da zum Beispiel Hewlett-Packard Proliant G5 Server als SCSI Geräte /dev/cciss/cxdx verwenden, während die Generation 6 von HP /dev/sdx als SCSI Gerät für die lokalen Festplatten verwendet.
serialnum --esx=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
Hier müsst ihr die Lizenznummer von VMware eingeben. Lasst ihr die Zeile komplett weg, wird der ESX Server später im 60 Tage Evaluierungsmodus betrieben.
MODEL=`dmidecode -s system-product-name`
if [ `echo $MODEL | grep -o G5` ]
then
SCSITYPE=cciss/c0d0
elif [ `echo $MODEL | grep -o G6` ]
then
SCSITYPE=sda
elif [ `echo $MODEL | grep -o Sun` ]
then
SCSITYPE=sda
elif [ `echo $MODEL | grep -o VMware` ]
then
SCSITYPE=sda
elif [ `echo $MODEL | grep -o N20-B6` ]
then
SCSITYPE=sdc
elif [ `echo $MODEL | grep -o PowerEdge` ]
then
SCSITYPE=sdc
else
echo "$MODEL is unsupported..."
fi
echo "found hardware: $MODEL..."
echo "installing ESX on $SCSITYPE..."
rm /tmp/diskmap > /dev/null 2>&1
echo "clearpart --drives=$SCSITYPE --initlabel --overwritevmfs" > /tmp/diskmap
echo "part /boot --fstype=ext3 --size=512 --ondisk=$SCSITYPE" >> /tmp/diskmap
echo "part none --fstype=vmkcore --size=100 --ondisk=$SCSITYPE" >> /tmp/diskmap
echo "part SYSTEM --fstype=vmfs3 --size=32768 --grow --ondisk=$SCSITYPE" >> /tmp/diskmap
echo "virtualdisk COS --size=30720 --onvmfs=SYSTEM" >> /tmp/diskmap
echo "part / --fstype=ext3 --size=9216 --onvirtualdisk=COS" >> /tmp/diskmap
echo "part /var --fstype=ext3 --size=9216 --onvirtualdisk=COS" >> /tmp/diskmap
echo "part /tmp --fstype=ext3 --size=9216 --onvirtualdisk=COS" >> /tmp/diskmap
echo "part swap --fstype=swap --size=2048 --onvirtualdisk=COS" >> /tmp/diskmap
Mittels “dmidecode” lese ich die Hardware aus und generiere dabei die diskmap zur Partitionierung.
echo "creating variables for network config..."
cat < < EOF >> /tmp/networkconfig
network --device=vmnic0 --bootproto=static --ip=${ESXIP} --netmask=${ESXMASK} --gateway=${ESXGW} --nameserver=192.168.0.1,192.168.0.2 --hostname=${ESXHOST} --addvmportgroup=0 --vlanid=${ESXVLAN}
EOF
Hiermit erstelle ich die networkconfig mit den auf der Kommandozeile übergebenen Parametern.
%post --interpreter=bash
Nach der Installation werden diverse Scripte erstellt. Dabei verwende ich “bash” als Interpreter, um die Kommandos für die “rc.local” zu generieren.
Innerhalb der Datei “rc.local” werden diverse Konfigurationsschritte ausgeführt, einige davon möchte ich euch näher erläutern.
esxcfg-firewall --enableService ntpClient > /dev/null 2>&1 esxcfg-firewall --enableService sshClient > /dev/null 2>&1 esxcfg-firewall -o 80,tcp,in,http > /dev/null 2>&1 esxcfg-firewall -o 80,tcp,out,http > /dev/null 2>&1 esxcfg-firewall -o 2301,tcp,in,hpsim > /dev/null 2>&1 esxcfg-firewall -o 2301,tcp,out,hpsim > /dev/null 2>&1 esxcfg-firewall -o 88,tcp,out,KerberosClient > /dev/null 2>&1 esxcfg-firewall -o 88,udp,out,KerberosClient > /dev/null 2>&1 esxcfg-firewall -o 636,tcp,out,OpenSSL > /dev/null 2>&1 esxcfg-firewall -o 464,tcp,out,KerberosPasswordChange > /dev/null 2>&1 esxcfg-firewall -o 389,tcp,out,ldap > /dev/null 2>&1 chkconfig --level 345 ntpd on > /dev/null 2>&1 chkconfig --level 345 sshd on > /dev/null 2>&1
Hiermit öffne ich diverse Firewallports, die für den späteren Betrieb nötig sind.
SEARCH1=`hostname -d`
SEARCH2="my.fqdn.tld"
if [ $SEARCH1 = $SEARCH2 ]; then
echo "nameserver 192.168.0.1" > /etc/resolv.conf
echo "nameserver 192.168.0.2" >> /etc/resolv.conf
echo "search my.fqdn.tld" >> /etc/resolv.conf
else
echo "nameserver 192.168.0.1" > /etc/resolv.conf
echo "nameserver 192.168.0.2" >> /etc/resolv.conf
echo "search $SEARCH1 $SEARCH2" >> /etc/resolv.conf
fi
Dieses Konstrukt wertet den Vollqualifizierten Rechnernamen aus und erstellt daraufhin die Datei /etc/resolv.conf.
sed -e 's/PermitRootLogin no/PermitRootLogin yes/' -i /etc/ssh/sshd_config
Der root Login über ssh sollte möglich sein…
sed -i 's/\/boot\/memSize\ =\ "[0-9][0-9][0-9]"/\/boot\/memSize\ =\ "512"/1' /etc/vmware/esx.conf sed -i 's/mem=300M/mem=512M/g' /boot/grub/grub.conf sed -i 's/uppermem 307200/uppermem 524288/g' /boot/grub/grub.conf
Die Serviceconsole bekommt 512MB RAM, da wir u.U. zusätzliche Hardwareagenten laufen lassen müssen.
cat > /etc/ntp.conf < < "EOF" restrict 127.0.0.1 restrict default kod nomodify notrap driftfile /var/lib/ntp/drift keys /etc/ntp/keys server 192.168.0.1 server 192.168.0.2 EOF cat > /etc/ntp/step-tickers < < "EOF" 192.168.0.1 192.168.0.2 EOF ntpdate 192.168.0.2 192.168.0.1 hwclock --systohc
Hiermit wird die Konfiguration für den Zeitdaemon generiert. Zusätzlich führe ich gleich einen Abgleich der Zeit mit den ntp-Servern aus. Dadurch ist gewährleistet, dass der ESX Server beim ersten Start die richtige Zeit hat.
esxcfg-advcfg -s 1 /Disk/UseLunReset > /dev/null 2>&1 esxcfg-advcfg -s 0 /Disk/UseDeviceReset > /dev/null 2>&1 esxcfg-advcfg -s 50 /Disk/MaxLUN > /dev/null 2>&1 esxcfg-advcfg -s 128 /Disk/SchedNumReqOutstanding > /dev/null 2>&1 cp -a /etc/bashrc /etc/bashrc.old > /dev/null 2>&1 sed -i "s/\\h \\\W/\\h \\\w/g" /etc/bashrc > /dev/null 2>&1
Einige erweiterte Einstellungen, die sich in der Praxis bewährt haben. Gleichzeitig möchte ich immer das aktuelle Arbeitsverzeichnis am prompt angezeigt bekommen. Das wird durch den “sed” in der letzten Zeile bewerkstelligt.
DS=`cat /proc/vmware/rootFsVMDKPath | cut -d '/' -f 4` rm -f /vmfs/volumes/SYSTEM ln -s $DS /vmfs/volumes/`hostname -s | tr [:lower:] [:upper:]`-System vmware-vim-cmd "/internalsvc/refresh_datastores" > /dev/null 2>&1
Der Datastore für die Serviceconsole heisst bei mir immer wie der Hostname gefolgt von einem “-System”. Beispiel: ESX1-System.
for switch in $( esxcfg-vswitch -l | awk '/vSwitch/ {print $1}'); do
/usr/sbin/esxcfg-vswitch -B both $switch
done
Hiermit aktivieren wir das Cisco Discovery Protocol für alle vorhandenen vSwitche (zu diesem Zeitpunkt ist aber nur ein vSwitch vorhanden).
mkdir -p /root/.ssh cd /root/.ssh lwp-download http://192.168.0.3/install/keys.tgz > /dev/null 2>&1 tar xzf keys.tgz > /dev/null 2>&1 rm keys.tgz
Die ssh-Keys (bzw. die authorized_keys-Datei) zum passwortlosen Login liegen auf einem Installationsserver. Diese wird nun “abgeholt” und an die richtige Stelle entpackt.
useradd -s /bin/false -c "Service Desk" -p mysecret itstaff > /dev/null 2>&1 groupadd -g 1500 ESXAdmins > /dev/null 2>&1
Wir legen einen lokalen Arbeitsuser an, der später über eine AD Gruppe root Rechte erlangen kann.
esxcfg-auth --enablead --addomain my.fqdn.tld --addc dc1.my.fqdn.tld --addc dc2.my.fqdn.tld --addc dc3.my.fqdn.tld --krb5realm=my.fqdn.tld --krb5kdc dc1.my.fqdn.tld --krb5adminserver dc1.my.fqdn.tld --enablekrb5 > /dev/null 2>&1 cat > /etc/openldap/ldap.conf < < "EOF" base dc=my,dc=fqdn,dc=tld host dc1.my.fqdn.tld dc2.my.fqdn.tld dc3.my.fqdn.tld pam_password md5 ssl no EOF
Die Konfiguration für die AD Authentifizierung wird angepasst.
lwp-download -a http://192.168.0.3/install/ldap_search.sh /root/scripts/ldap_search.sh > /dev/null 2>&1 lwp-download -a http://192.168.0.3/install/makeconfig.sh /root/scripts/makeconfig.sh > /dev/null 2>&1 ln -s /root/scripts/makeconfig.sh /root/makeconfig.sh > /dev/null 2>&1 ln -s /root/scripts/ldap_search.sh /root/ldap_search.sh > /dev/null 2>&1 echo "chmod scripts..." chmod +x /root/scripts/ldap_search.sh > /dev/null 2>&1 chmod +x /root/scripts/makeconfig.sh > /dev/null 2>&1 /root/scripts/ldap_search.sh > /dev/null 2>&1 echo "creating cronjobs..." echo "@hourly /usr/bin/lwp-download -a http://192.168.0.3/install/ldap_search.sh /root/scripts/ldap_search.sh > /dev/null 2>&1" > /tmp/root-cron echo "@hourly /usr/bin/lwp-download -a http://192.168.0.3/install/makeconfig.sh /root/scripts/makeconfig.sh > /dev/null 2>&1" >> /tmp/root-cron echo "@hourly /root/scripts/ldap_search.sh > /dev/null 2>&1" >> /tmp/root-cron crontab -u root /tmp/root-cron rm /tmp/root-cron > /dev/null 2>&1 echo "setting up sodoers..." cat > /etc/sudoers < < "EOF" Defaults env_reset root ALL=(ALL) ALL %hpsmh ALL=NOPASSWD:/etc/init.d/snmpd %hpsmh ALL=NOPASSWD:/usr/bin/snmptrap %ESXAdmins ALL=(ALL) NOPASSWD: ALL, !/usr/bin/passwd root EOF visudo -q -c -s -f /etc/suoders
Hiermit werden diverse Script vom Installationsserver abgeholt und einige Cronjobs aktiviert. Später sind Mitglieder einer bestimmten AD Gruppe in der Lage, sich am ESX Server anzumelden und mittels “sudo” root-Rechte zu erlangen.
if [ `dmidecode | grep -i vendor | cut -d ':' -f 2 | cut -d ' ' -f 2` = HP ] || [ `dmidecode | grep -i vendor | cut -d ':' -f 2 | cut -d ' ' -f 2` = Hewlett-Packard ]; then echo "installaing HP Hardware agents..." /etc/init.d/pegasus stop > /dev/null 2>&1 cd /tmp lwp-download http://192.168.0.3/install/hp/hpmgmt-8.2.5-vmware4x.tgz > /dev/null 2>&1 tar xzf hpmgmt-8.2.5-vmware4x.tgz > /dev/null 2>&1 cat > /tmp/hpmgmt.conf < < "EOF" export CMASILENT="YES" export CMALOCALHOSTRWCOMMSTR=127.0.0.1 export CMALOCALHOSTROCOMMSTR=127.0.0.1 export CMAMGMTSTATIONRWIPORDNS=mysim.server export CMAMGMTSTATIONRWCOMMSTR=mysim.server export CMASYSCONTACT="Hotline - +49 0815 0815" export CMASYSLOCATION="My Company - IT Staff" export ENABLEHPIMPORT=Y export ENABLEHP_SIMPORT=Y export ENABLESNMPSERVICE=Y export ENABLESIMCERTPORT=Y EOF cd /tmp/hpmgmt/825 sh ./install825vibs.sh --silent --inputfile /tmp/hpmgmt.conf echo "creating snmp config..." cat > /etc/snmp/snmpd.conf < < "EOF" dlmod cmaX /usr/lib64/libcmaX64.so rwcommunity 127.0.0.1 rocommunity 127.0.0.1 rwcommunity mysim.server rocommunity str mysim.server rocommunity str myscom1.server rocommunity str myscom2.server rocommunity str myscom3.server rocommunity str myscom4.server trapcommunity str trapsink localhost trapsink mysim.server trapsink myscom1.server trapsink myscom2.server trapsink myscom3.server trapsink myscom4.server syscontact Hotline - +49 0815 0815 syslocation My Company - IT Staff EOF echo "creating System Management Homepage config..." cat > /opt/hp/hpsmh/conf/smhpd.xml < < "EOF" <?xml version="1.0"?> <system -management-homepage> <admin -group>ESXAdmins</admin> <operator -group>itstaff</operator> <user -group/> <allow -default-os-admin>true</allow> <anonymous -access>false</anonymous> <localaccess -enabled>false</localaccess> <localaccess -type>Anonymous</localaccess> <trustmode>TrustByName</trustmode> <xenamelist>mysim.server</xenamelist> <ip -binding>false</ip> <ip -binding-list/> <ip -restricted-logins>false</ip> <ip -restricted-include></ip> <ip -restricted-exclude/> <session -timeout>30</session><admin -kerberos/><ui -timeout>30</ui><operator -kerberos/><box -order>name</box><user -kerberos/><box -item-order>name</box><custom -ui>false</custom><iconview>false</iconview></system> EOF echo "creating SIM server certificate..." cat > /opt/hp/hpsmh/certs/mysim.server.pem < < "EOF" -----BEGIN CERTIFICATE----- MIIDHjCCAoegAwIBAgIJUtPscfb6bV6QMA0GCSqGSIb3DQEBBAUAMIG4MQswCQYDVQQGEwJVUzET KJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGh LVBhY2thcmQgQ29tcGFueTE0MDIGA1UECxMrSGV3bGV0dC1QYWNrYXJkIE5ldHdvcmsgTWFuYWdl bWVudCBTb2Z0d2FyZTEoMCYGA1UEAxMfc3N0cm0wMzIuZW1lYS5pc24uY29ycGludHJhLm5ldDAe KJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGh KJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGh KJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGhjGJHGHJGjhgKJKJHkjgZUFGFhJHGh d2FyZTEoMCYGA1UEAxMfc3N0cm0wMzIuZW1lYS5pc24uY29ycGludHJhLm5ldDCBnzANBgkqhkiG 9w0BAQEFAAOBjQAwgYkCgYEAg/Xsw3515vsjxCP5+X3pwxNMEyM+kSzRBdPqvOVc5SscyeLFMfMC LobDXH+7Xt3iatZfjPAI04J6Qfi9PVbb6ww7KL3PXvYM9HAbz+Ae/eWOHcSICrFhmGPKdjpts1CQ SN9cbYOcBGoEUQq8N+ol20YmSKUPhRcmDPAVA/aLTgUCAwEAAaMuMCwwKgYDVR0RBCMwIYIfc3N0 cm0wMzIuZW1lYS5pc24uY29ycGludHJhLm5ldDANBgkqhkiG9w0BAQQFAAOBgQA33whUdYR5GTZE fviL5bPLpsyRtT5YDDd8vwGU9dttkfAXxbaQBBlyJzzfr0v4Dcq5O0GBNj++MyXv/dIYANT2Y/o1 3UjY/86TgUVGiYOtUtIFqQSbKkufzam1gTsWj1chNHLznuL0odU6gz2xXsVgoc0YcA+glG34Jlz0 JKHBJkgb== -----END CERTIFICATE----- EOF cat > /opt/hp/hp-snmp-agents/cma.conf < < "EOF" exclude cmafcad trapemail /bin/mail -s 'HP Insight Management Agents Trap Alarm' root EOF echo "closing firewall..." esxcfg-firewall --blockIncoming > /dev/null 2>&1 echo "disabling ASR..." hpasmcli -s "disable asr" > /dev/null 2>&1 else echo "detected other hardware. HP Agents will NOT be installed..." fi
Anhand der Hardware wird nun ermittelt, ob es sich um einen HP Server handelt. Ist dies der Fall, werden die HP Hardwareagents installiert und konfiguriert. Dabei übermitteln die HP Agents ihre Meldungen an einen SIM-Server und gleichzeitg an mehrere SCOM-Server. Die Option “disable asr” hat sich in der Vergangeheit bewährt, da die Agents einen Reset des Servers ausführen, sollte die Serviceconsole kurzzeitig nicht reagieren (zum Beispiel bei mehreren gleichzeitigen VMotion Vorgängen).
cat > /etc/syslog.conf < < "EOF" # # syslog-ng.conf # *.info;mail.none;authpriv.none;cron.none;local6.none;local5.none /var/log/messages authpriv.* /var/log/secure mail.* /var/log/maillog cron.* /var/log/cron *.emerg * uucp,news.crit /var/log/spooler local7.* /var/log/boot.log local6.info;local6.!notice /var/log/vmksummary local6.warning /var/log/vmkwarning local6.notice /var/log/vmkernel local5.* /var/log/vmkproxy local4.* /var/log/storageMonitor *.warning;*.emerg;*.err;*.crit;*.alert @myscom1.server *.warning;*.emerg;*.err;*.crit;*.alert @myscom2.server EOF
Syslog Events werden ebenfalls an die SCOM-Server übermittelt und ermöglichen somit das Monitoring der ESX Server mittels SCOM.
vmware-vim-cmd /hostsvc/maintenance_mode_enter > /dev/null 2>&1 esxupdate --bundle=http://192.168.0.3/updates/4.0/ESX-4.0.0-update01.zip update
Der ESX Host wird in den Wartungsmodus versetzt und aktuelle Updates werden installiert.
echo "FAEI installed on `date +"%d.%m.%Y"` - `hostname -f`" >> /root/installed rm -rf /tmp/* > /dev/null 2>&1 mkdir -p /tmp/vmware-root shutdown -r 1 "ESX Installation done. Doing final reboot..."
Das /tmp Verzeichnis wird geleert und der ESX Server einmal rebootet. Somit ist der Server fertig installiert und kann direkt ins vCenter integriert werden.
Die vollständige kickstart-Datei könnt ihr hier herunterladen.



(12)
(12)
(0)
Februar 28th, 2010 am 22:39
Hi Sven,
Sehr schöner, hilfreicher und ausführlicher Blog-Eintrag!
Eine Sache habe ich allerdings nicht verstanden. Zu welchen Zeitpunkt setzt du die ESXIP, ESXMASK etc. Variablen?
Würde mich über eine Antwort sehr freuen: mauricem@gmx.de
Gruß
März 26th, 2010 am 15:16
Hoi, super Posting, ich hab nur mal ne Verständnis Frage, wenn ich die Kickstart Dateien mit in die von VMWare runtergeladene ISO integriere, kann ich je nach Kickstart Datei, die ISO einlegen und muss nicht mehr machen, also alles ist automatisiert?
Zweite Frage: Die Kickstart Datei bezieht sich hier auf einen HP Server, gibt es irgendwo die Möglichkeit dies auch für unsere Server herzukriegen? Fujitsu Siemens, IBM usw?
Gibt es irgendwo eine Seite wo mehrere Abschnitte der .txt noch mehr erklärt werden?
Würde mich auf eine E-Mail freuen
MfG
März 27th, 2010 am 08:10
Hallo Chris,
Das ganze ist “halb automatisiert”. Du musst beim Boot-Prompt der CD einige Parameter angeben (IP Adresse, Subnetzmaske, etc.) (Steht aber ganz oben bei “Kommandozeilenparameter”).
das Script funktioniert mit HP (G5 und G6 sind getestet), Dell, Sun Fire X4xxx, Cisco Blades (UCS) und VMware Workstation. Letzten endes muss nur die Sektion mit dem dmidecode angepasst werden, da sich die Partitionierung aufgrund verschiedener SCSI Controller unterscheidet.
Gruß
Sven
März 29th, 2010 am 12:51
Hi Sven,
Danke schon mal für die schnelle Antwort, gibt es vielleicht eine Möglichkeit mit dir über E-Mail in Kontakt zu treten? Da ich dort doch noch ein paar kleinere Fragen hätte?
März 29th, 2010 am 16:32
Hi,
schau ins Impressum
Gruß
Sven
Juli 15th, 2011 am 08:22
Hi.
Danke für die tolle Anleitung. Wir gehen den Weg auch in dieser Reihenfolge. Allerdings haben wir das Problem, dass der Installierte Client nachdem er neu gestartet ist, wieder in das über ILO gemountete Image bootet und wieder neu installiert wird. Hat hier ein Leser eventuell eine Idee, wie und wann ich dem Ilo beibringe dass er das BootImage unmounten soll?
Juli 15th, 2011 am 09:32
Hi,
Pack mal diese Einträge in die isolinux.cfg:
default local
LABEL local
menu label ^Boot from local disk
localboot 0×80