Created
June 23, 2022 22:28
-
-
Save AndreiCherniaev/18cd6fa4c769c527bb5e177467226091 to your computer and use it in GitHub Desktop.
customize-image.sh with auto mount flash driver to /media/usb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# this is part for armbian | |
# путь к этому файлу XunlongA/userpatches/customize-image.sh | |
# arguments: $RELEASE $LINUXFAMILY $BOARD $BUILD_DESKTOP | |
# This is the image customization script | |
# NOTE: It is copied to /tmp directory inside the image | |
# and executed there inside chroot environment | |
# so don't reference any files that are not already installed | |
# NOTE: If you want to transfer files between chroot and host | |
# userpatches/overlay directory on host is bind-mounted to /tmp/overlay in chroot | |
RELEASE=$1 | |
LINUXFAMILY=$2 | |
BOARD=$3 | |
BUILD_DESKTOP=$4 | |
InstallAutoMount() { | |
cat <<EOF > /etc/udev/rules.d/99-local.rules | |
KERNEL=="sd*[!0-9]|sr*", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" | |
KERNEL=="sd*[!0-9]|sr*", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service" | |
EOF | |
cat <<EOF > /etc/systemd/system/usb-mount@.service | |
[Unit] | |
Description=Mount USB Drive on %i | |
[Service] | |
Type=oneshot | |
RemainAfterExit=true | |
ExecStart=/usr/local/bin/usb-mount.sh add %i | |
ExecStop=/usr/local/bin/usb-mount.sh remove %i | |
EOF | |
cat <<EOF > /usr/local/bin/usb-mount.sh | |
#!/bin/bash | |
# This script is called from our systemd unit file to mount or unmount | |
# a USB drive. | |
usage() | |
{ | |
echo "Usage: \$0 {add|remove} device_name (e.g. sdb1)" | |
exit 1 | |
} | |
if [[ \$# -ne 2 ]]; then | |
usage | |
fi | |
ACTION=\$1 | |
DEVBASE=\$2 | |
DEVICE="/dev/\${DEVBASE}" | |
# See if this drive is already mounted, and if so where | |
MOUNT_POINT=\$(/bin/mount | /bin/grep \${DEVICE} | /usr/bin/awk '{ print \$3 }') | |
do_mount() | |
{ | |
if [[ -n \${MOUNT_POINT} ]]; then | |
echo "Warning: \${DEVICE} is already mounted at \${MOUNT_POINT}" | |
exit 1 | |
fi | |
# Get info for this drive: \$ID_FS_LABEL, \$ID_FS_UUID, and \$ID_FS_TYPE | |
eval \$(/sbin/blkid -o udev \${DEVICE}) | |
# Figure out a mount point to use | |
LABEL="usb" | |
if [[ -z "\${LABEL}" ]]; then | |
LABEL=\${DEVBASE} | |
elif /bin/grep -q " /media/\${LABEL} " /etc/mtab; then | |
# Already in use, make a unique one | |
LABEL+="-\${DEVBASE}" | |
fi | |
MOUNT_POINT="/media/\${LABEL}" | |
echo "Mount point: \${MOUNT_POINT}" | |
/bin/mkdir -p \${MOUNT_POINT} | |
# Global mount options | |
OPTS="rw,relatime" | |
# File system type specific mount options | |
if [[ \${ID_FS_TYPE} == "vfat" ]]; then | |
OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush" | |
fi | |
if ! /bin/mount -o \${OPTS} \${DEVICE} \${MOUNT_POINT}; then | |
echo "Error mounting \${DEVICE} (status = \$?)" | |
/bin/rmdir \${MOUNT_POINT} | |
exit 1 | |
fi | |
echo "**** Mounted \${DEVICE} at \${MOUNT_POINT} ****" | |
} | |
do_unmount() | |
{ | |
if [[ -z \${MOUNT_POINT} ]]; then | |
echo "Warning: \${DEVICE} is not mounted" | |
else | |
/bin/umount -l \${DEVICE} | |
echo "**** Unmounted \${DEVICE}" | |
fi | |
# Delete all empty dirs in /media that aren't being used as mount | |
# points. This is kind of overkill, but if the drive was unmounted | |
# prior to removal we no longer know its mount point, and we don't | |
# want to leave it orphaned... | |
for f in /media/* ; do | |
if [[ -n \$(/usr/bin/find "\$f" -maxdepth 0 -type d -empty) ]]; then | |
if ! /bin/grep -q " \$f " /etc/mtab; then | |
echo "**** Removing mount point \$f" | |
/bin/rmdir "\$f" | |
fi | |
fi | |
done | |
} | |
case "\${ACTION}" in | |
add) | |
do_mount | |
;; | |
remove) | |
do_unmount | |
;; | |
*) | |
usage | |
;; | |
esac | |
EOF | |
chmod 777 /usr/local/bin/usb-mount.sh | |
} #InstallAutoMount | |
Main() { | |
#systemctl disable rsyslog | |
#systemctl mask systemd-journald.service | |
systemctl mask systemd-logind.service | |
InstallAutoMount | |
case $RELEASE in | |
xenial) | |
# your code here | |
;; | |
stretch) | |
# your code here | |
# InstallOpenMediaVault # uncomment to get an OMV 4 image | |
;; | |
buster) | |
# your code here | |
;; | |
bionic) | |
# your code here | |
;; | |
esac | |
} # Main | |
InstallOpenMediaVault() { | |
# use this routine to create a Debian based fully functional OpenMediaVault | |
# image (OMV 3 on Jessie, OMV 4 with Stretch). Use of mainline kernel highly | |
# recommended! | |
# | |
# Please note that this variant changes Orange Pi default security | |
# policies since you end up with root password 'openmediavault' which | |
# you have to change yourself later. SSH login as root has to be enabled | |
# through OMV web UI first | |
echo root:openmediavault | chpasswd | |
rm /root/.not_logged_in_yet | |
. /etc/default/cpufrequtils | |
export LANG=C LC_ALL="en_US.UTF-8" | |
export DEBIAN_FRONTEND=noninteractive | |
export APT_LISTCHANGES_FRONTEND=none | |
case ${RELEASE} in | |
jessie) | |
OMV_Name="erasmus" | |
OMV_EXTRAS_URL="https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/openmediavault-omvextrasorg_latest_all3.deb" | |
;; | |
stretch) | |
OMV_Name="arrakis" | |
OMV_EXTRAS_URL="https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/openmediavault-omvextrasorg_latest_all4.deb" | |
;; | |
esac | |
# Add OMV source.list and Update System | |
cat > /etc/apt/sources.list.d/openmediavault.list <<- EOF | |
deb https://openmediavault.github.io/packages/ ${OMV_Name} main | |
## Uncomment the following line to add software from the proposed repository. | |
deb https://openmediavault.github.io/packages/ ${OMV_Name}-proposed main | |
## This software is not part of OpenMediaVault, but is offered by third-party | |
## developers as a service to OpenMediaVault users. | |
# deb https://openmediavault.github.io/packages/ ${OMV_Name} partner | |
EOF | |
# Add OMV and OMV Plugin developer keys, add Cloudshell 2 repo for XU4 | |
if [ "${BOARD}" = "odroidxu4" ]; then | |
add-apt-repository -y ppa:kyle1117/ppa | |
sed -i 's/jessie/xenial/' /etc/apt/sources.list.d/kyle1117-ppa-jessie.list | |
fi | |
mount --bind /dev/null /proc/mdstat | |
apt-get update | |
apt-get --yes --force-yes --allow-unauthenticated install openmediavault-keyring | |
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7AA630A1EDEE7D73 | |
apt-get update | |
# install debconf-utils, postfix and OMV | |
HOSTNAME="${BOARD}" | |
debconf-set-selections <<< "postfix postfix/mailname string ${HOSTNAME}" | |
debconf-set-selections <<< "postfix postfix/main_mailer_type string 'No configuration'" | |
apt-get --yes --force-yes --allow-unauthenticated --fix-missing --no-install-recommends \ | |
-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install \ | |
debconf-utils postfix | |
# move newaliases temporarely out of the way (see Ubuntu bug 1531299) | |
cp -p /usr/bin/newaliases /usr/bin/newaliases.bak && ln -sf /bin/true /usr/bin/newaliases | |
sed -i -e "s/^::1 localhost.*/::1 ${HOSTNAME} localhost ip6-localhost ip6-loopback/" \ | |
-e "s/^127.0.0.1 localhost.*/127.0.0.1 ${HOSTNAME} localhost/" /etc/hosts | |
sed -i -e "s/^mydestination =.*/mydestination = ${HOSTNAME}, localhost.localdomain, localhost/" \ | |
-e "s/^myhostname =.*/myhostname = ${HOSTNAME}/" /etc/postfix/main.cf | |
apt-get --yes --force-yes --allow-unauthenticated --fix-missing --no-install-recommends \ | |
-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install \ | |
openmediavault | |
# install OMV extras, enable folder2ram and tweak some settings | |
FILE=$(mktemp) | |
wget "$OMV_EXTRAS_URL" -qO $FILE && dpkg -i $FILE | |
/usr/sbin/omv-update | |
# Install flashmemory plugin and netatalk by default, use nice logo for the latter, | |
# tweak some OMV settings | |
. /usr/share/openmediavault/scripts/helper-functions | |
apt-get -y -q install openmediavault-netatalk openmediavault-flashmemory | |
AFP_Options="mimic model = Macmini" | |
SMB_Options="min receivefile size = 16384\nwrite cache size = 524288\ngetwd cache = yes\nsocket options = TCP_NODELAY IPTOS_LOWDELAY" | |
xmlstarlet ed -L -u "/config/services/afp/extraoptions" -v "$(echo -e "${AFP_Options}")" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/services/smb/extraoptions" -v "$(echo -e "${SMB_Options}")" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/services/flashmemory/enable" -v "1" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/services/ssh/enable" -v "1" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/services/ssh/permitrootlogin" -v "0" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/system/time/ntp/enable" -v "1" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/system/time/timezone" -v "UTC" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/system/network/dns/hostname" -v "${HOSTNAME}" /etc/openmediavault/config.xml | |
xmlstarlet ed -L -u "/config/system/monitoring/perfstats/enable" -v "0" /etc/openmediavault/config.xml | |
echo -e "OMV_CPUFREQUTILS_GOVERNOR=${GOVERNOR}" >>/etc/default/openmediavault | |
echo -e "OMV_CPUFREQUTILS_MINSPEED=${MIN_SPEED}" >>/etc/default/openmediavault | |
echo -e "OMV_CPUFREQUTILS_MAXSPEED=${MAX_SPEED}" >>/etc/default/openmediavault | |
for i in netatalk samba flashmemory ssh ntp timezone interfaces cpufrequtils monit collectd rrdcached ; do | |
/usr/sbin/omv-mkconf $i | |
done | |
/sbin/folder2ram -enablesystemd || true | |
sed -i 's|-j /var/lib/rrdcached/journal/ ||' /etc/init.d/rrdcached | |
# Fix multiple sources entry on ARM with OMV4 | |
sed -i '/stretch-backports/d' /etc/apt/sources.list | |
# rootfs resize to 7.3G max and adding omv-initsystem to firstrun -- q&d but shouldn't matter | |
echo 15500000s >/root/.rootfs_resize | |
sed -i '/systemctl\ disable\ orangepi-firstrun/i \ | |
mv /usr/bin/newaliases.bak /usr/bin/newaliases \ | |
export DEBIAN_FRONTEND=noninteractive \ | |
sleep 3 \ | |
apt-get install -f -qq python-pip python-setuptools || exit 0 \ | |
pip install -U tzupdate \ | |
tzupdate \ | |
read TZ </etc/timezone \ | |
/usr/sbin/omv-initsystem \ | |
xmlstarlet ed -L -u "/config/system/time/timezone" -v "${TZ}" /etc/openmediavault/config.xml \ | |
/usr/sbin/omv-mkconf timezone \ | |
lsusb | egrep -q "0b95:1790|0b95:178a|0df6:0072" || sed -i "/ax88179_178a/d" /etc/modules' /usr/lib/orangepi/orangepi-firstrun | |
sed -i '/systemctl\ disable\ orangepi-firstrun/a \ | |
sleep 30 && sync && reboot' /usr/lib/orangepi/orangepi-firstrun | |
# add USB3 Gigabit Ethernet support | |
echo -e "r8152\nax88179_178a" >>/etc/modules | |
case ${BOARD} in | |
odroidxu4) | |
HMP_Fix='; taskset -c -p 4-7 $i ' | |
# Cloudshell stuff (fan, lcd, missing serials on 1st CS2 batch) | |
echo "H4sIAKdXHVkCA7WQXWuDMBiFr+eveOe6FcbSrEIH3WihWx0rtVbUFQqCqAkYGhJn | |
tF1x/vep+7oebDfh5DmHwJOzUxwzgeNIpRp9zWRegDPznya4VDlWTXXbpS58XJtD | |
i7ICmFBFxDmgI6AXSLgsiUop54gnBC40rkoVA9rDG0SHHaBHPQx16GN3Zs/XqxBD | |
leVMFNAz6n6zSWlEAIlhEw8p4xTyFtwBkdoJTVIJ+sz3Xa9iZEMFkXk9mQT6cGSQ | |
QL+Cr8rJJSmTouuuRzfDtluarm1aLVHksgWmvanm5sbfOmY3JEztWu5tV9bCXn4S | |
HB8RIzjoUbGvFvPw/tmr0UMr6bWSBupVrulY2xp9T1bruWnVga7DdAqYFgkuCd3j | |
vORUDQgej9HPJxmDDv+3WxblBSuYFH8oiNpHz8XvPIkU9B3JVCJ/awIAAA==" \ | |
| tr -d '[:blank:]' | base64 --decode | gunzip -c >/usr/local/sbin/cloudshell2-support.sh | |
chmod 755 /usr/local/sbin/cloudshell2-support.sh | |
apt install -y i2c-tools odroid-cloudshell cloudshell2-fan | |
sed -i '/systemctl\ disable\ orangepi-firstrun/i \ | |
lsusb | grep -q -i "05e3:0735" && sed -i "/exit\ 0/i echo 20 > /sys/class/block/sda/queue/max_sectors_kb" /etc/rc.local \ | |
/usr/sbin/i2cdetect -y 1 | grep -q "60: 60" && /usr/local/sbin/cloudshell2-support.sh' /usr/lib/orangepi/orangepi-firstrun | |
;; | |
bananapim3|nanopifire3|nanopct3plus|nanopim3) | |
HMP_Fix='; taskset -c -p 4-7 $i ' | |
;; | |
edge*|ficus|firefly-rk3399|nanopct4|nanopim4|nanopineo4|renegade-elite|roc-rk3399-pc|rockpro64) | |
HMP_Fix='; taskset -c -p 4-5 $i ' | |
;; | |
esac | |
echo "* * * * * root for i in \`pgrep \"ftpd|nfsiod|smbd|afpd|cnid\"\` ; do ionice -c1 -p \$i ${HMP_Fix}; done >/dev/null 2>&1" \ | |
>/etc/cron.d/make_nas_processes_faster | |
chmod 600 /etc/cron.d/make_nas_processes_faster | |
# add SATA port multiplier hint if appropriate | |
[ "${LINUXFAMILY}" = "sunxi" ] && \ | |
echo -e "#\n# If you want to use a SATA PM add \"ahci_sunxi.enable_pmp=1\" to bootargs above" \ | |
>>/boot/boot.cmd | |
# Filter out some log messages | |
echo ':msg, contains, "do ionice -c1" ~' >/etc/rsyslog.d/omv-orangepi.conf | |
echo ':msg, contains, "action " ~' >>/etc/rsyslog.d/omv-orangepi.conf | |
echo ':msg, contains, "netsnmp_assert" ~' >>/etc/rsyslog.d/omv-orangepi.conf | |
echo ':msg, contains, "Failed to initiate sched scan" ~' >>/etc/rsyslog.d/omv-orangepi.conf | |
# Fix little python bug upstream Debian 9 obviously ignores | |
if [ -f /usr/lib/python3.5/weakref.py ]; then | |
wget -O /usr/lib/python3.5/weakref.py \ | |
https://raw.githubusercontent.com/python/cpython/9cd7e17640a49635d1c1f8c2989578a8fc2c1de6/Lib/weakref.py | |
fi | |
# clean up and force password change on first boot | |
umount /proc/mdstat | |
chage -d 0 root | |
} # InstallOpenMediaVault | |
UnattendedStorageBenchmark() { | |
# Function to create Orange Pi images ready for unattended storage performance testing. | |
# Useful to use the same OS image with a bunch of different SD cards or eMMC modules | |
# to test for performance differences without wasting too much time. | |
rm /root/.not_logged_in_yet | |
apt-get -qq install time | |
wget -qO /usr/local/bin/sd-card-bench.sh https://raw.githubusercontent.com/ThomasKaiser/sbc-bench/master/sd-card-bench.sh | |
chmod 755 /usr/local/bin/sd-card-bench.sh | |
sed -i '/^exit\ 0$/i \ | |
/usr/local/bin/sd-card-bench.sh &' /etc/rc.local | |
} # UnattendedStorageBenchmark | |
InstallAdvancedDesktop() | |
{ | |
apt install -yy transmission libreoffice libreoffice-style-tango meld remmina thunderbird kazam avahi-daemon | |
[[ -f /usr/share/doc/avahi-daemon/examples/sftp-ssh.service ]] && cp /usr/share/doc/avahi-daemon/examples/sftp-ssh.service /etc/avahi/services/ | |
[[ -f /usr/share/doc/avahi-daemon/examples/ssh.service ]] && cp /usr/share/doc/avahi-daemon/examples/ssh.service /etc/avahi/services/ | |
apt clean | |
} # InstallAdvancedDesktop | |
Main "$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment