Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndreiCherniaev/18cd6fa4c769c527bb5e177467226091 to your computer and use it in GitHub Desktop.
Save AndreiCherniaev/18cd6fa4c769c527bb5e177467226091 to your computer and use it in GitHub Desktop.
customize-image.sh with auto mount flash driver to /media/usb
#!/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