SRCS=/home/nanobsd/setup NANO_NAME=setup NANO_IMGNAME=${NANO_NAME}.img # имя образа NANO_DISKIMGDIR=$SRCS # куда писать образ NANO_LABEL=nano NANO_SLICE_CFG=p3 NANO_ROOT=p4 NANO_ALTROOT=p5 NANO_MODULES=default NANO_SLICE_ESP_SIZE=2880k # 1GB NANO_MEDIASIZE=2097152 NANO_IMAGES=2 NANO_INIT_IMG2=0 # 50MB /cfg media size NANO_CONFSIZE=102400 # 50MB /etc ram size NANO_RAM_ETCSIZE=102400 # 512MB /var+/tmp ram size NANO_RAM_TMPVARSIZE=1048576 NANO_KERNEL=SETUP NANO_PMAKE="make -j4" NANO_BOOTLOADER="boot/boot0" NANO_BOOT0CFG="-s 1 -m 3 -t 72" SRC_ENV_CONF=$SRCS/src-env.conf CPIO_SYMLINK=--insecure CONF_BUILD=' LOADER_BZIP2_SUPPORT= # поддержка загрузки сжатого ядра WITHOUT_ACCT= WITHOUT_AMD= WITHOUT_APM= WITHOUT_ASSERT_DEBUG= WITHOUT_ATM= WITHOUT_AUDIT= WITHOUT_AUTHPH= WITHOUT_AUTOFS= WITHOUT_BHYVE= WITHOUT_BINUTILS= WITHOUT_BLACKLIST= WITHOUT_BLACKLIST_SUPPORT= WITHOUT_BLUETOOTH= WITHOUT_CALENDAR= WITHOUT_CAPSICUM= WITHOUT_CCD= WITHOUT_CLANG= WITHOUT_CPP= WITHOUT_CTM= WITHOUT_CUSE= WITHOUT_CVS= WITHOUT_DEBUG_FILES= WITHOUT_DMAGENT= WITHOUT_DICT= WITHOUT_ED_CRYPTO= WITHOUT_EXAMPLES= WITHOUT_FINGER= WITHOUT_FDT= WITHOUT_FLOPPY= WITHOUT_FREEBSD_UPDATE= WITHOUT_GAMES= WITHOUT_GCC= WITHOUT_GCOV= WITHOUT_GDB= WITHOUT_GPIO= WITHOUT_GROFF= WITHOUT_GSSAPI= WITGOUT_HESIOD= WITHOUT_HTML= WITHOUT_HYPERV= WITHOUT_INFO= WITHOUT_IPFILTER= WITHOUT_KERBEROS= WITHOUT_KERNEL_SYMBOLS= WITHOUT_LIB32= WITHOUT_LLDB= WITHOUT_MAN= WITHOUT_MAN_UTILS= WITHOUT_NDIS= WITHOUT_NETCAT= WITHOUT_NLS= WITHOUT_NLS_CATALOGS= WITHOUT_NS_CACHING= WITHOUT_OBJC= WITHOUT_PC_SYSINSTALL= WITHOUT_PF= WITHOUT_PORTSNAP= WITHOUT_PROFILE= WITHOUT_QUOTAS= WITHOUT_RCS= WITHOUT_RESCUE= WITHOUT_ROUTED= WITHOUT_SHAREDOCS= WITHOUT_SVNLITE= WITHOUT_SYSTEM_COMPILER= WITHOUT_TALK= WITHOUT_TESTS= WITHOUT_TEXTPROC= ' CONF_INSTALL=" $CONF_BUILD WITHOUT_INCLUDES= WITHOUT_TOOLCHAIN= WITHOUT_INSTALLLIB= " install_packages() { echo Cleaning... dirs="usr/share/keys/pkg/revoked usr/local tmp/Pkg var/db/pkg mnt/tmp " cd "$NANO_WORLDDIR" || return 1 rm -rf $dirs || { chflags -R noschg $dirs || true; rm -rf $dirs; } mkdir -p $dirs echo '' echo Installing packages... pkgs="`realpath $SRCS/Pkg`" trap 'umount "$NANO_WORLDDIR/dev"; umount $pkgs' SIGHUP SIGINT SIGTERM EXIT mount -t devfs devfs "$NANO_WORLDDIR/dev" mount_nullfs -o ro "$pkgs" tmp/Pkg chroot "$NANO_WORLDDIR" sh -c "cd /tmp/Pkg && ./pkg-static install -yU *.pkg" umount "$NANO_WORLDDIR/dev" umount "$pkgs" rmdir tmp/Pkg trap - SIGHUP SIGINT SIGTERM EXIT } customize_cmd install_packages add_users() { cd $NANO_WORLDDIR cp -Rp $SRCS/root . chroot $NANO_WORLDDIR sh -e << 'EOT' mkdir -p /home echo "password" | pw useradd sa -d /var/log/sa -g wheel -s tcsh -w none -L russian -h 0 install -d -o sa -g wheel /var/log/sa EOT } customize_cmd add_users prepare_entropy() { cd $NANO_WORLDDIR install -m 0700 -o operator -g operator -d etc/entropy.d } customize_cmd prepare_entropy clean_tree() { cd $NANO_WORLDDIR rm -rf etc/motd etc/*.bak conf/base/etc/motd usr/include/* usr/lib/*.a \ usr/share/examples/* \ usr/share/info/* \ usr/local/etc/joe/doc/* usr/local/etc/joe/*.dist \ usr/local/include/* usr/local/info/* usr/local/lib/*.a \ usr/local/man/* \ usr/share/misc/pci_vendors usr/share/misc/usb* \ usr/share/misc/bsd-family-tree usr/share/misc/*.dot \ usr/local/share/aclocal/* usr/local/share/doc/* \ usr/local/share/examples/* usr/local/share/info/* \ usr/local/share/mc/syntax/* usr/local/share/mc/mc.hlp.* # prevent Midnight Commander (installed via package) from complaining mkdir -p usr/local/share/mc/syntax touch usr/local/share/mc/syntax/Syntax # Remove all locale data except of Russian that I use find usr/local/share/locale -maxdepth 1 | fgrep -v ru | xargs rm -rf find usr/share/locale usr/local/share/locale -mindepth 1 -maxdepth 1 |\ egrep -v 'ru|en_US|uk_UA' | xargs rm -rf # remove largest binaries I never use cd usr/bin rm -f makeinfo info vacation csup truss gperf cd ../sbin rm -f amd nologin sade mfiutil \ mergemaster lmcconfig mptutil mkdir -p usr/local/bin cp -Rp $SRCS/bin $NANO_WORLDDIR/usr/local ln ../local/bin/nologin . } late_customize_cmd clean_tree cust_configs() { cd $NANO_WORLDDIR cp -Rp $SRCS/etc/ etc mkdir -p usr/local/etc/ [ -n "`ls $SRCS/etclocal`" ] && cp -Rp $SRCS/etclocal/* usr/local/etc/ || true } customize_cmd cust_configs late_cust_configs() { cd $NANO_WORLDDIR cp -rp $SRCS/boot . [ -f boot/boot.config ] && mv boot/boot.config . || true } late_customize_cmd late_cust_configs cust_compress() { cd $NANO_WORLDDIR/boot [ -n "`ls modules`" ] && mv modules/* kernel/ chroot $NANO_WORLDDIR kldxref /boot/kernel } customize_cmd cust_compress create_code_slice() { } create_diskimage() ( local fmt pprint 2 "build diskimage gpt ${NANO_NAME}" # p1 is boot for uefi, p2 is boot for bios, p3 is cfg, p4 is root NANO_SLICE_ESP=p1 NANO_SLICE_ROOT=p4 eval $NANO_SLICE_CFG=freebsd-ufs eval $NANO_SLICE_ROOT=freebsd-ufs [ -z ${NANO_DISKIMAGE_FORMAT} ] || fmt=".${NANO_DISKIMAGE_FORMAT}" : ${NANO_IMGNAME:=${NANO_DISKIMGDIR}/_.disk.image.${NANO_NAME}${fmt}} pprint 3 "log: ${NANO_LOG}/_.di" ( local cfg i sz fmt fmtarg root size tmp [ -z ${NANO_DISKIMAGE_FORMAT} ] || fmtarg="-f ${NANO_DISKIMAGE_FORMAT}" for i in s1 s2 s3 s4 p1 p2 p3 p4 p5 empty esp; do rm -fr ${NANO_LOG}/_.${i}* done pprint 3 "EFI System Partition (ESP) in: ${NANO_LOG}/_.${NANO_SLICE_ESP}" tmp="${NANO_LOG}/_.esp/EFI/BOOT" mkdir -p "$tmp"; test -d "$tmp" # source belongs to root, so do not hardlink it cp -p "${NANO_WORLDDIR}/boot/loader.efi" "$tmp/BOOTX64.efi" rm -f "${NANO_LOG}/_.${NANO_SLICE_ESP}" makefs -t msdos -o 'fat_type=16,sectors_per_cluster=1,volume_label=ESP' -B little \ -s ${NANO_SLICE_ESP_SIZE} "${NANO_LOG}/_.${NANO_SLICE_ESP}" "${NANO_LOG}/_.esp" || exit 1 # Populate the / partition, and place it into a slice with a # bsd label pprint 3 "root partition in: "${NANO_DISKIMGDIR}/_.disk.image"" echo "mount -o ro /dev/ufs/${NANO_LABEL}${NANO_SLICE_CFG}" > ${NANO_WORLDDIR}/conf/default/etc/remount sz=${NANO_SLICE_ROOT_SIZE:+-s ${NANO_SLICE_ROOT_SIZE}} makefs -t ffs -B little -o label=${NANO_LABEL}${NANO_ROOT} $sz "${NANO_DISKIMGDIR}/_.disk.image" \ "${NANO_WORLDDIR}" # Populate the /cfg partition, empty if none given if [ -z "${NANO_CFGDIR}" ]; then echo "Faking cfg dir, it's empty" NANO_CFGDIR=${NANO_LOG}/_.empty mkdir -p ${NANO_CFGDIR} fi # Do not bother checking success of mkdir -p as next "cp" will do it. mkdir -p "${NANO_CFGDIR}/boot" for i in device.hints defaults lua do cp -rp "${NANO_WORLDDIR}/boot/$i" "${NANO_CFGDIR}/boot" done { [ -r "${NANO_WORLDDIR}/boot/loader.conf" ] && sed 's/vidconsole/efi/' "${NANO_WORLDDIR}/boot/loader.conf" echo "currdev=\"disk0${NANO_SLICE_ROOT}:\"" } > "${NANO_CFGDIR}/boot/loader.conf" i='' [ -r "${NANO_WORLDDIR}/boot/config" ] && read i < "${NANO_WORLDDIR}/boot/config" i="0:ad(0${NANO_ROOT})/boot/loader $i" i=${i% } echo "$i" > "${NANO_CFGDIR}/boot/config" : ${NANO_SLICE_CFG_SIZE:=$(($NANO_CONFSIZE * 512))} pprint 3 "cfg partition in: ${NANO_LOG}/_.${NANO_SLICE_CFG}" eval makefs -t ffs -B little -o label=${NANO_LABEL}${NANO_SLICE_CFG} -s ${NANO_SLICE_CFG_SIZE} \ "${NANO_LOG}/_.${NANO_SLICE_CFG}" "${NANO_CFGDIR}" size=$((NANO_MEDIASIZE * 512)) eval cfg=\"\$${NANO_SLICE_CFG}/cfg:=${NANO_LOG}/_.${NANO_SLICE_CFG}\" eval root=\"\$${NANO_SLICE_ROOT}/root1:=${NANO_DISKIMGDIR}/_.disk.image\" pprint 3 "image in: ${NANO_IMGNAME}" mkimg ${fmtarg} -v --capacity $size -P 4096 -s gpt -a 2 -b "${NANO_WORLDDIR}/boot/pmbr" \ -p efi:="${NANO_LOG}/_.${NANO_SLICE_ESP}" \ -p freebsd-boot/biosboot:=${NANO_WORLDDIR}/boot/gptboot \ -p "$cfg" -p "$root" \ -o "${NANO_IMGNAME}" ) > ${NANO_LOG}/_.di 2>&1 )