Index: defaults.mk ================================================================== --- defaults.mk +++ defaults.mk @@ -21,10 +21,14 @@ FSCK_Y_ENABLE?=no # hostname HOSTNAME?=Amnesiac +# HAS_INET6 +HAS_INET6?=${:!sysctl -q net.inet6 >/dev/null && echo yes || echo no!} +PREFER?=IPV6 # or IPV4 + # kld KLD_LIST?= # ldconfig LDCONFIG_PATHS?=/lib /usr/lib /usr/local/lib /usr/pkg/lib Index: init.mk ================================================================== --- init.mk +++ init.mk @@ -1,11 +1,11 @@ # Meta targets TARGETS:=adjkerntz bootfs cleanvar cleartmp cloned devfs dmesg dumpon fsck \ - hostname kld ldconfig microcode mixer mount mountlate msgs netif \ - newsyslog nextboot nfsclient pf pwcheck random root runshm savecore swap \ - sysctl sysdb wlans zfs mounttmpfs utmpx + hostname ip6addrctl kld ldconfig microcode mixer mount mountlate \ + mounttmpfs msgs netif newsyslog nextboot nfsclient pf pwcheck random root \ + runshm savecore swap sysctl sysdb udevd_check utmpx wlans zfs OTHER_TARGETS+=mixer_exit nfsclient_exit random_exit DAEMON: pwcheck sysctl sysdb NETWORK SERVERS ldconfig nfsclient cleartmp pflogd @@ -29,11 +29,11 @@ cleanvar: mount echo "MRC:$@> Cleaning '/var's." .for dir in ${CLEANVAR_DIRS} if [ -d ${dir} ]; then \ - /rescue/find ${dir} -mindepth 1 -delete ;\ + /rescue/find ${dir} -mindepth 1 -delete; \ fi .endfor cleartmp: mountlate echo "MRC:$@> Clearing tmp." @@ -66,51 +66,87 @@ .endif dumpon: random .if !empty(DUMPDEV) if [ -e ${DUMPDEV} ]; then \ - echo "MRC:$@> Setting dumpon device to ${DUMPDEV}" ;\ - dumpon -v ${DUMPDEV} ;\ + echo "MRC:$@> Setting dumpon device to ${DUMPDEV}"; \ + dumpon -v ${DUMPDEV}; \ fi .endif fsck: - echo "MRC:$@> Checking disks." ;\ - fsck -p ;\ + echo "MRC:$@> Checking disks." + fsck -p; \ case $$? in \ 0) ;; \ 2) exit 1 \ ;; \ - 4) echo "Rebooting..." ;\ + 4) echo "Rebooting..."; \ reboot ;\ - echo "Reboot failed; help!" ;\ + echo "Reboot failed; help!"; \ exit 1 \ ;; \ 8) if [ -n "$${FSCK_Y_ENABLE}" ]; then \ - echo "File system preen failed, trying fsck -y." ;\ + echo "File system preen failed, trying fsck -y."; \ fsck -y || { \ - echo "Automatic file system check failed; help!" ;\ - exit 1 ;\ - } ;\ + echo "Automatic file system check failed; help!"; \ + exit 1; \ + }; \ else \ - echo "Automatic file system check failed; help!" ;\ - exit 1 ;\ + echo "Automatic file system check failed; help!"; \ + exit 1; \ fi \ ;; \ - 12) echo "Boot interrupted." ;\ + 12) echo "Boot interrupted."; \ exit 1 \ ;; \ 130) exit 1 \ ;; \ - *) echo "Unknown error, help!" ;\ + *) echo "Unknown error, help!"; \ exit 1 \ ;; \ esac hostname: echo "MRC:$@> Setting to ${HOSTNAME}." hostname ${HOSTNAME} + +ip6addrctl: root mount +.if empty(HAS_INET6:tl:Mno) + /usr/sbin/ip6addrctl flush >/dev/null 2>&1 +. if !empty(PREFER:MIPV6) + echo "MRC:$@> Setting v4/v6 address selection defaults (prefer v6)." + printf "\ + ::1/128 50 0\n\ + ::/0 40 1\n\ + ::ffff:0:0/96 35 4\n\ + 2002::/16 30 2\n\ + 2001::/32 5 5\n\ + fc00::/7 3 13\n\ + ::/96 1 3\n\ + fec0::/10 1 11\n\ + 3ffe::/16 1 12\n" |\ + /usr/sbin/ip6addrctl install /dev/stdin +. elif !empty(PREFER:MIPV4) + echo "MRC:$@> Setting v4/v6 address selection defaults (prefer v6)." + printf "\ + ::1/128 50 0\n\ + ::/0 40 1\n\ + ::ffff:0:0/96 100 4\n\ + 2002::/16 30 2\n\ + 2001::/32 5 5\n\ + fc00::/7 3 13\n\ + ::/96 1 3\n\ + fec0::/10 1 11\n\ + 3ffe::/16 1 12\n" |\ + /usr/sbin/ip6addrctl install /dev/stdin +. else + echo "MRC:$@> Setting v4/v6 address selection defaults (none)." +. endif +.else + echo "MRC:$@> No INET6 support in kernel." +.endif kld: bootfs .if defined(KLD_LIST) echo "MRC:$@> Loading kernel modules: ${KLD_LIST}" . for KLD in ${KLD_LIST} @@ -131,65 +167,68 @@ ldc+=${:!find ${dir} -type f!} .endif .endfor ldconfig: mountlate - echo "MRC:$@> Initializing shared libraries: ${ldc}"; \ + echo "MRC:$@> Initializing shared libraries: ${ldc}" ldconfig -elf ${ldc} microcode: mountlate - test -d /usr/local/share/cpucontrol || exit 0 ;\ - echo "MRC:$@> Updating microcode." ;\ - kldload -n cpuctl || exit 1 ;\ - for cpu in $$(jot ${NCPU} 0); do \ - { cpucontrol -u -d /usr/local/share/cpucontrol /dev/cpuctl$${cpu} \ - || exit 1 ;\ - } | grep -v '^TEST' ;\ - cpucontrol -e /dev/cpuctl$${cpu} || exit 1 ;\ - done - -mixers=${:!find /dev -name 'mixer*'!:S/\/dev\///} - -mixer: mount cleanvar + if [ -d /usr/local/share/cpucontrol ]; then \ + echo "MRC:$@> Updating microcode."; \ + if kldload -n cpuctl; then \ + for cpu in $$(jot ${NCPU} 0); do \ + cpucontrol -u /dev/cpuctl$${cpu}; \ + done; \ + for cpu in $$(jot ${NCPU} 1); do \ + cpucontrol -e /dev/cpuctl$${cpu}; \ + done \ + else \ + echo "MRC:$@> Failed to load [cpuctl]."; \ + fi \ + fi + +mixer: mount cleanvar kld echo "MRC:$@> Restoring levels." -.for mixer in ${mixers} - if [ -r /var/db/${mixer}-state ]; then \ - mixer -f /dev/${mixer} `cat /var/db/${mixer}-state` ;\ - fi -.endfor + for mixer in $$(find /dev -name 'mixer*' | sed 's|^/dev/||'); do \ + if [ -r /var/db/$${mixer}-state ]; then \ + mixer -f /dev/$${mixer} `cat /var/db/$${mixer}-state` || \ + echo "MRC:$@> /dev/$${mixer} config load failed."; \ + fi \ + done mixer_exit: echo "MRC:$@> Saving mixer levels." -.for mixer in ${mixers} - if [ -r /dev/${mixer} ]; then \ - mixer -f /dev/${mixer} -s > /var/db/${mixer}-state ;\ - fi -.endfor + for mixer in $$(find /dev -name 'mixer*' | sed 's|^/dev/||'); do \ + if [ -r /dev/$${mixer} ]; then \ + mixer -f /dev/$${mixer} -s > /var/db/$${mixer}-state; \ + fi \ + done DAEMON_EXIT: mixer_exit excludes=${NETFS_TYPES:C/:.*//} mount: root zfs - echo "MRC:$@> Mount local FS." ;\ - mount -uo rw -a ;\ - mount ;\ + echo "MRC:$@> Mount local FS." + mount -p | awk '$$1~/^map$$/{next}$$3!~/^(tmpfs|null|procfs)$$/{print"mount -uo rw "$$1}' | sh + mount mount -a -t no${excludes:ts,} mountlate: NETWORK mount cleanvar runshm devd mounttmpfs - echo "MRC:$@> Mount late FS." ;\ + echo "MRC:$@> Mount late FS." mount -a msgs: mount - echo "MRC:$@> Making bounds." ;\ - test ! -d /var/msgs -o -f /var/msgs/bound -o -L /var/msgs/bounds || \ + echo "MRC:$@> Making bounds." + test ! -d /var/msgs -o -f /var/msgs/bound -o -L /var/msgs/bounds || \ echo 0 > /var/msgs/bounds newsyslog: mountlate sysdb if [ -n "$${NEWSYSLOG_ENABLE}" ]; then \ - echo "MRC:$@> Trimming log files." ;\ - /usr/sbin/newsyslog ${NEWSYSLOG_FLAGS} ;\ + echo "MRC:$@> Trimming log files."; \ + /usr/sbin/newsyslog ${NEWSYSLOG_FLAGS}; \ fi nextboot: mount .if exists(/boot/nextkernel) echo "MRC:$@> Removing nextboot setting." @@ -200,23 +239,22 @@ DAEMON_rpcbind_ENABLE=yes .endif nfsclient: NETWORK rpcbind if [ -n "$${NFSCLIENT_ENABLE}" ]; then \ - kldload -n nfs ;\ + kldload -n nfs; \ fi nfsclient_exit: DAEMON_EXIT .if empty(RPC_UMNTALL_ENABLE:tl:Mno) - echo "MRC:$@> Sending RPC unmount notifications."; \ - test -f /var/db/mounttab || true && \ - rpc.umntall -k + echo "MRC:$@> Sending RPC unmount notifications." + test -f /var/db/mounttab || true && rpc.umntall -k .endif NETWORK_EXIT: nfsclient_exit -netif: adjkerntz wlans cloned kld mounttmpfs utmpx +netif: adjkerntz cloned ip6addrctl kld mounttmpfs utmpx wlans echo "MRC:$@> Starting interfaces: ${IFCONFIG_IFACES}" .for iface in ${IFCONFIG_IFACES} . for item in ${IFCONFIG_${iface}:tW:ts;} ifconfig ${iface} ${item} . endfor @@ -224,18 +262,21 @@ .endfor pf: pflogd .if empty(PF_ENABLE:tl:Mno) echo "MRC:$@> Enabling and loading rules." - kldload -n pf || exit 1 - if [ -r ${PF_RULES} ]; then \ - pfctl -Fa || exit 1 ;\ - pfctl -f ${PF_RULES} ${PF_FLAGS} || exit 1 ;\ - pfctl -Si | grep -q Enabled && pfctl -e ;\ + if kldload -n pf; then \ + if [ -r ${PF_RULES} ]; then \ + pfctl -Fa || exit 1; \ + pfctl -f ${PF_RULES} ${PF_FLAGS} || exit 1; \ + pfctl -Si | grep -q Enabled && pfctl -e; \ + else \ + echo "MRC:$@> Can't find file with rules at ${PF_RULES}."; \ + exit 1; \ + fi \ else \ - echo "MRC:$@> Can't find file with rules at ${PF_RULES}." ;\ - exit 1 ;\ + echo "MRC:$@> Failed to load [pf]."; \ fi .endif pwcheck: mountlate syslogd echo "MRC:$@> Checking password lock file." @@ -245,29 +286,29 @@ .endif random: mount devfs echo "MRC:$@> Seeding." sysctl kern.seedenable=1 > /dev/null - ( ps -fauxww; sysctl -a; date; df -ib; dmesg; ps -fauxww ;) 2>&1 |\ + ( ps -fauxww; sysctl -a; date; df -ib; dmesg; ps -fauxww ;) 2>&1 | \ dd status=none of=/dev/random bs=8k 2>/dev/null dd if=/bin/ps status=none of=/dev/random bs=8k 2>/dev/null if [ -d $${ENTROPY_DIR} ]; then \ - find $${ENTROPY_DIR} -type f |\ - xargs -n1 -Ifoo dd status=none if=foo of=/dev/random bs=8k 2>/dev/null ;\ + find $${ENTROPY_DIR} -type f | \ + xargs -n1 -Ifoo dd status=none if=foo of=/dev/random bs=8k 2>/dev/null; \ else \ if [ -r ${ENTROPY_FILE} ]; then \ - dd status=none if=${ENTROPY_FILE} of=/dev/random bs=8k 2>/dev/null ;\ + dd status=none if=${ENTROPY_FILE} of=/dev/random bs=8k 2>/dev/null; \ fi \ fi sysctl kern.seedenable=0 > /dev/null random_exit: - rm -f ${ENTROPY_FILE} + rm -f ${ENTROPY_FILE}; \ ( \ - umask 077 ;\ + umask 077; \ dd if=/dev/random of=${ENTROPY_FILE} bs=8k count=1 2>/dev/null || \ - echo "MRC:$@> entropy file write failed." ;\ + echo "MRC:$@> entropy file write failed."; \ ) DAEMON_EXIT: random_exit root: fsck bootfs @@ -299,17 +340,22 @@ sysdb: mountlate echo "MRC:$@> Building databases." install -c -m 644 -g wheel /dev/null /var/run/utmpx wlans: kld - echo "MRC:$@> Configuring wlans." + echo "MRC:$@> Configuring wlans." ; for dev in $$(sysctl -n net.wlan.devices); do \ - eval all_wlans=\$${WLANS_$${dev}} ;\ + eval all_wlans=\$${WLANS_$${dev}}; \ for wlan in $${all_wlans}; do \ - eval wlan_args=\$${WLANS_$${wlan}_ARGS} ;\ - ifconfig $${wlan} create wlandev $${dev} $${wlan_args} ;\ - ifconfig $${wlan} up ;\ + { \ + eval wlan_args="\$${WLANS_$${wlan}_ARGS}" && \ + ifconfig $${wlan} create wlandev $${dev} && \ + { \ + ifconfig $${wlan} $${wlan_args}; \ + ifconfig $${wlan} up; \ + }; \ + } || echo "MRC:$@> ERROR: WLAN $${wlan} failed to initialize."; \ done \ done zfs: .if empty(ZFS_ENABLE:tl:Mno) @@ -330,14 +376,26 @@ mtree -deiqU -f /etc/mtree/BSD.var.dist -p /var mounttmpfs: cleanvar echo "MRC:$@> Mount tmpfs and populating /var/run." .if exists(TMPFS_TMP_ENABLE) - mount | awk 'BEGIN{x=1}$$3~/\/tmp/{x=0}END{exit(x)}' || { - /rescue/find /tmp -mindepth 1 -delete - mount_tmpfs -m 01777 dummy /tmp + mount | awk 'BEGIN{x=1}$$3~/\/tmp/{x=0}END{exit(x)}' || { \ + /rescue/find /tmp -mindepth 1 -delete; \ + mount_tmpfs -m 01777 dummy /tmp; \ } .endif + +udevd_check: DAEMON + echo "MRC:$@> Check udevd PID/socket are accessible." + if [ ! -e /var/run/udevd.pid ]; then \ + pkill -HUP -x udevd; \ + ( \ + sleep 1; \ + if [ ! -e /var/run/udevd.pid ]; then \ + svc restart udevd; \ + fi \ + ) & \ + fi utmpx: runshm echo "MRC:$@> Install utmpx." install -m 644 -g wheel /dev/null /var/run/utmpx Index: rc.shutdown ================================================================== --- rc.shutdown +++ rc.shutdown @@ -11,9 +11,10 @@ MAKEINIT="make -D AUTOBOOT -C /etc/mrc -k" NCPU=$((`/sbin/sysctl -n hw.ncpu` + 1 )) #MAKEDEBUG="-d -nelLx" -mount -t tmpfs tmpfs /etc/mrc/tmp && ${MAKEINIT} -j ${NCPU} ${MAKEDEBUG} -X TMPDIR=/etc/mrc/tmp EXIT && umount /etc/mrc/tmp || ${MAKEINIT} EXIT +mount -t tmpfs tmpfs /etc/mrc/tmp && ${MAKEINIT} -j ${NCPU} ${MAKEDEBUG} -X TMPDIR=/etc/mrc/tmp EXIT && umount /etc/mrc/tmp ||\ + { echo EXIT failed repeating nonparallel in 10 seconds ; sleep 10 ; ${MAKEINIT} EXIT ; } echo '.' exit 0 Index: svc.starter.mk ================================================================== --- svc.starter.mk +++ svc.starter.mk @@ -5,7 +5,8 @@ _service_svc_status: .USE svc status ${@:S/_status//} _service_svc_exit: .USEBEFORE - svc list ${@:S/_exit//} | grep -q ${@:S/_exit//} || true && \ + #svc list ${@:S/_exit//} | grep -q ${@:S/_exit//} || true && + lockf -kst 0 /var/run/service.${@:S/_exit//}.pid svc -t 0 kill ${@:S/_exit//} || \ svc -s exit ${@:S/_exit//}