Last active
June 4, 2019 17:40
-
-
Save estshorter/302449b697c1468bcfdb0bf31ed3b35e to your computer and use it in GitHub Desktop.
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 -eu | |
# Specify software version | |
MPD_MAJOR_VER=0.20 | |
MPD_MINOR_VER=.15 | |
MPD_VER="${MPD_MAJOR_VER}${MPD_MINOR_VER}" | |
ALSA_VER=1.1.5 | |
FLAC_VER=1.3.2 | |
MPG123_VER=1.25.8 | |
FFMPEG_VER=3.4.1 | |
LIBMPDCLIENT_VER=2.13 | |
CURL_VER=7.57.0 | |
MPDAS_VER=0.4.4 | |
# Optimization option for Raspberry Pi 3 | |
OPT="-O2 -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ffast-math -ftree-vectorize -funsafe-math-optimizations" | |
CURRENT_DIR=$(pwd) | |
SETUP1_DONE=".setup1_done" | |
SETUP2_DONE=".setup2_done" | |
SETUP3_DONE=".setup3_done" | |
setup1() | |
{ | |
sudo apt -y update | |
sudo apt -y dist-upgrade | |
} | |
setup2() | |
{ | |
# Suppress rsyslog output | |
# Ref: https://azriton.github.io/2017/03/16/Raspbian-Jessie-Lite%E3%81%AESD%E3%82%AB%E3%83%BC%E3%83%89%E5%BB%B6%E5%91%BD%E5%8C%96/ | |
# Ref: https://qiita.com/mashumashu/items/bbc3a79bc779fe8c4f99 | |
COMMENT_BGN=$(grep -n "^daemon\.\*" /etc/rsyslog.conf | sed -e 's/:.*//g') | |
COMMENT_END=$(grep -n "mail,news.none" /etc/rsyslog.conf | sed -e 's/:.*//g') | |
sudo sed -ie "${COMMENT_BGN},${COMMENT_END}s:^:#:" /etc/rsyslog.conf | |
sudo systemctl restart rsyslog | |
# Disable swap | |
sudo swapoff --all | |
sudo apt purge -y --auto-remove dphys-swapfile | |
sudo rm -fr /var/swap | |
# Put temp files to RAM disk | |
sudo sed -ie '$ a tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0' /etc/fstab | |
sudo sed -ie '$ a tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0' /etc/fstab | |
sudo rm -fr /tmp | |
sudo rm -fr /var/tmp | |
# Put log files to RAM disk | |
# Ref: https://qiita.com/ura14h/items/da058903149c1a4f71af | |
sudo sed -ie '$ a tmpfs /var/log tmpfs defaults,size=32m,noatime,mode=0755 0 0' /etc/fstab | |
# Ref: http://takuya-1st.hatenablog.jp/entry/2017/03/22/144700 | |
sudo sed -i 's/^exit 0$//g' /etc/rc.local | |
INIT_SCRIPT="mkdir -p -m 750 /var/log/samba | |
mkdir -p /var/log/apt | |
mkdir -p /var/log/mpd | |
mkdir -p /var/log/nginx | |
chown root:adm /var/log/samba | |
chown root:adm /var/log/nginx | |
touch /var/log/lastlog | |
touch /var/log/wtmp | |
touch /var/log/btmp | |
chmod 664 /var/log/lastlog | |
chmod 664 /var/log/wtmp | |
chmod 600 /var/log/btmp | |
chown root:utmp /var/log/lastlog | |
chown root:utmp /var/log/wtmp | |
chown root:utmp /var/log/btmp | |
exit 0" | |
echo "$INIT_SCRIPT" | sudo tee /etc/rc.local -a > /dev/null | |
sudo rm -rf /var/log | |
} | |
setup3() | |
{ | |
# Check NAS user/pass/addr | |
echo "NAS_USER=${NAS_USER}" | |
echo "NAS_PASS=${NAS_PASS}" | |
echo "NAS_ADDR=${NAS_ADDR}" | |
# Check last.fm user/pass | |
echo "LAST_FM_USER=${LAST_FM_USER}" | |
echo "LAST_FM_PASS=${LAST_FM_PASS}" | |
# Delete message of the day | |
sudo rm /etc/motd | |
sudo touch /etc/motd | |
sudo sed -i 's/#NTP=/NTP=ntp.nict.jp/g' /etc/systemd/timesyncd.conf #NTP setting | |
sudo sed -ie "/^exit 0$/i tvservice -o" /etc/rc.local # Disable HDMI | |
sudo sed -ie '$ a dtoverlay=pi3-disable-wifi' /boot/config.txt # Disable Wi-Fi | |
sudo sed -ie '$ a dtoverlay=pi3-disable-bt' /boot/config.txt # Disable Bluetooth | |
sudo sed -ie '$ a disable_splash=1' /boot/config.txt # Disable splash screen | |
# Disable red led | |
sudo sed -i 's/^exit 0$//g' /etc/rc.local | |
LED_CMD='echo none | sudo tee /sys/class/leds/led1/trigger > /dev/null | |
echo 0 | sudo tee /sys/class/leds/led1/brightness > /dev/null | |
exit 0' | |
echo "$LED_CMD" | sudo tee /etc/rc.local -a > /dev/null | |
# Disable UART | |
# Ref: https://qiita.com/mt08/items/d27085ac469a34526f72 | |
# Ref: https://github.com/raspberrypi-ui/rc_gui/blob/master/src/rc_gui.c#L23-L70 | |
sudo raspi-config nonint do_serial 1 | |
sudo sed -i 's/^dtparam=audio=on//g' /boot/config.txt # Disable onboard audio | |
sudo sed -ie '$ a dtoverlay=hifiberry-dacplus' /boot/config.txt # I2s dac on | |
# Specify japanese-lang | |
sudo sed -i 's/^# ja_JP.EUC-JP EUC-JP/ja_JP.EUC-JP EUC-JP/g' /etc/locale.gen | |
sudo sed -i 's/^# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/g' /etc/locale.gen | |
sudo locale-gen | |
sudo update-locale LANG=ja_JP.UTF-8 | |
sudo timedatectl set-timezone Asia/Tokyo # Specify timezone | |
# Decrease GPU assigned memory | |
# Ref: https://jyn.jp/raspbian-setup/#SSH-2 | |
sudo raspi-config nonint do_memory_split 16 | |
sudo raspi-config nonint do_wifi_country JP | |
# Enable hardware random-number-generator | |
sudo apt -y install rng-tools | |
# Install vim (not vim-tiny) | |
sudo apt -y install vim | |
# Specify the path folder | |
sudo sed -i '1i/usr/local/lib' /etc/ld.so.conf | |
# Build alsa-lib | |
# Ref: http://mimizukobo.sakura.ne.jp/articles/articles022.html#001 | |
ALSA_FILE_NAME="alsa-lib-${ALSA_VER}" | |
mkdir alsa-lib | |
cd alsa-lib | |
wget ftp://ftp.alsa-project.org/pub/lib/${ALSA_FILE_NAME}.tar.bz2 | |
tar -jxf ${ALSA_FILE_NAME}.tar.bz2 | |
cd ${ALSA_FILE_NAME} | |
./configure CFLAGS="${OPT}" CXXFLAGS="${OPT}" | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
cd ../../ | |
# Build libflac | |
FLAC_FILE_NAME="flac-${FLAC_VER}" | |
mkdir libflac | |
cd libflac | |
wget https://ftp.osuosl.org/pub/xiph/releases/flac/${FLAC_FILE_NAME}.tar.xz | |
tar -Jxf ${FLAC_FILE_NAME}.tar.xz | |
cd ${FLAC_FILE_NAME} | |
./configure CFLAGS="${OPT}" CXXFLAGS="${OPT}" | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
cd ../../ | |
# Build mpg123 | |
MPG123_FILE_NAME="mpg123-${MPG123_VER}" | |
mkdir mpg123 | |
cd mpg123 | |
wget https://www.mpg123.de/download/${MPG123_FILE_NAME}.tar.bz2 | |
tar -jxf ${MPG123_FILE_NAME}.tar.bz2 | |
cd ${MPG123_FILE_NAME} | |
./configure CFLAGS="${OPT}" --with-cpu=neon --with-optimization=2 | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
cd ../../ | |
# Build FFmpeg | |
FFMPEG_FILE_NAME="ffmpeg-${FFMPEG_VER}" | |
# Ref: https://github.com/MusicPlayerDaemon/MPD/blob/master/python/build/libs.py | |
FFMPEG_OPTIONS="--enable-nonfree --disable-programs --disable-doc --disable-avdevice --disable-swresample --disable-swscale --disable-postproc --disable-avfilter --disable-lzo --disable-faan --disable-pixelutils --disable-network --disable-encoders --disable-muxers --disable-protocols --disable-devices --disable-filters --disable-filters --disable-v4l2_m2m --disable-parser=bmp --disable-parser=cavsvideo --disable-parser=dvbsub --disable-parser=dvdsub --disable-parser=dvd_nav --disable-parser=flac --disable-parser=g729 --disable-parser=gsm --disable-parser=h261 --disable-parser=h263 --disable-parser=h264 --disable-parser=hevc --disable-parser=mjpeg --disable-parser=mlp --disable-parser=mpeg4video --disable-parser=mpegaudio --disable-parser=mpegvideo --disable-parser=opus --disable-parser=vc1 --disable-parser=vp3 --disable-parser=vp8 --disable-parser=vp9 --disable-parser=png --disable-parser=pnm --disable-parser=xma --disable-demuxer=aqtitle --disable-demuxer=ass --disable-demuxer=bethsoftvid --disable-demuxer=bink --disable-demuxer=cavsvideo --disable-demuxer=cdxl --disable-demuxer=dvbsub --disable-demuxer=dvbtxt --disable-demuxer=h261 --disable-demuxer=h263 --disable-demuxer=h264 --disable-demuxer=ico --disable-demuxer=image2 --disable-demuxer=jacosub --disable-demuxer=lrc --disable-demuxer=microdvd --disable-demuxer=mjpeg --disable-demuxer=mjpeg_2000 --disable-demuxer=mpegps --disable-demuxer=mpegvideo --disable-demuxer=mpl2 --disable-demuxer=mpsub --disable-demuxer=pjs --disable-demuxer=rawvideo --disable-demuxer=realtext --disable-demuxer=sami --disable-demuxer=scc --disable-demuxer=srt --disable-demuxer=stl --disable-demuxer=subviewer --disable-demuxer=subviewer1 --disable-demuxer=swf --disable-demuxer=tedcaptions --disable-demuxer=vobsub --disable-demuxer=vplayer --disable-demuxer=webvtt --disable-demuxer=yuv4mpegpipe --disable-decoder=flac --disable-decoder=mp1 --disable-decoder=mp1float --disable-decoder=mp2 --disable-decoder=mp2float --disable-decoder=mp3 --disable-decoder=mp3adu --disable-decoder=mp3adufloat --disable-decoder=mp3float --disable-decoder=mp3on4 --disable-decoder=mp3on4float --disable-decoder=opus --disable-decoder=vorbis --disable-decoder=atrac1 --disable-decoder=atrac3 --disable-decoder=atrac3al --disable-decoder=atrac3p --disable-decoder=atrac3pal --disable-decoder=binkaudio_dct --disable-decoder=binkaudio_rdft --disable-decoder=bmv_audio --disable-decoder=dsicinaudio --disable-decoder=dvaudio --disable-decoder=metasound --disable-decoder=paf_audio --disable-decoder=ra_144 --disable-decoder=ra_288 --disable-decoder=ralf --disable-decoder=qdm2 --disable-decoder=qdmc --disable-decoder=ass --disable-decoder=asv1 --disable-decoder=asv2 --disable-decoder=apng --disable-decoder=avrn --disable-decoder=avrp --disable-decoder=bethsoftvid --disable-decoder=bink --disable-decoder=bmp --disable-decoder=bmv_video --disable-decoder=cavs --disable-decoder=ccaption --disable-decoder=cdgraphics --disable-decoder=clearvideo --disable-decoder=dirac --disable-decoder=dsicinvideo --disable-decoder=dvbsub --disable-decoder=dvdsub --disable-decoder=dvvideo --disable-decoder=exr --disable-decoder=ffv1 --disable-decoder=ffvhuff --disable-decoder=ffwavesynth --disable-decoder=flic --disable-decoder=flv --disable-decoder=fraps --disable-decoder=gif --disable-decoder=h261 --disable-decoder=h263 --disable-decoder=h263i --disable-decoder=h263p --disable-decoder=h264 --disable-decoder=hevc --disable-decoder=hnm4_video --disable-decoder=hq_hqa --disable-decoder=hqx --disable-decoder=idcin --disable-decoder=iff_ilbm --disable-decoder=indeo2 --disable-decoder=indeo3 --disable-decoder=indeo4 --disable-decoder=indeo5 --disable-decoder=interplay_video --disable-decoder=jacosub --disable-decoder=jpeg2000 --disable-decoder=jpegls --disable-decoder=microdvd --disable-decoder=mimic --disable-decoder=mjpeg --disable-decoder=mmvideo --disable-decoder=mpl2 --disable-decoder=motionpixels --disable-decoder=mpeg1video --disable-decoder=mpeg2video --disable-decoder=mpeg4 --disable-decoder=mpegvideo --disable-decoder=mscc --disable-decoder=msmpeg4_crystalhd --disable-decoder=msmpeg4v1 --disable-decoder=msmpeg4v2 --disable-decoder=msmpeg4v3 --disable-decoder=msvideo1 --disable-decoder=mszh --disable-decoder=mvc1 --disable-decoder=mvc2 --disable-decoder=on2avc --disable-decoder=paf_video --disable-decoder=png --disable-decoder=qdraw --disable-decoder=qpeg --disable-decoder=rawvideo --disable-decoder=realtext --disable-decoder=roq --disable-decoder=roq_dpcm --disable-decoder=rscc --disable-decoder=rv10 --disable-decoder=rv20 --disable-decoder=rv30 --disable-decoder=rv40 --disable-decoder=sami --disable-decoder=sheervideo --disable-decoder=snow --disable-decoder=srt --disable-decoder=stl --disable-decoder=subrip --disable-decoder=subviewer --disable-decoder=subviewer1 --disable-decoder=svq1 --disable-decoder=svq3 --disable-decoder=tiff --disable-decoder=truemotion1 --disable-decoder=truemotion2 --disable-decoder=truemotion2rt --disable-decoder=twinvq --disable-decoder=utvideo --disable-decoder=vc1 --disable-decoder=vmdvideo --disable-decoder=vp3 --disable-decoder=vp5 --disable-decoder=vp6 --disable-decoder=vp7 --disable-decoder=vp8 --disable-decoder=vp9 --disable-decoder=vqa --disable-decoder=webvtt --disable-decoder=wmv1 --disable-decoder=wmv2 --disable-decoder=wmv3 --disable-decoder=yuv4" | |
mkdir ffmpeg | |
cd ffmpeg | |
wget http://ffmpeg.org/releases/${FFMPEG_FILE_NAME}.tar.xz | |
tar -Jxf ${FFMPEG_FILE_NAME}.tar.xz | |
cd ${FFMPEG_FILE_NAME} | |
./configure --enable-shared --optflags="${OPT}" --arch=armv8-a ${FFMPEG_OPTIONS} | |
# --cpu is not specified as it generates warnings | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
cd ../../ | |
# MPD pre-process | |
sudo mkdir -p /var/lib/mpd | |
sudo mkdir -p /var/lib/mpd/music | |
sudo mkdir -p /var/lib/mpd/playlists | |
sudo mkdir -p /var/log/mpd | |
sudo mkdir -p /var/run/mpd | |
sudo useradd -r -g audio -s /sbin/nologin mpd | |
sudo chown -R mpd:audio /var/lib/mpd | |
sudo chown -R mpd:audio /var/log/mpd | |
# NAS setting | |
# Ref: http://osa030.hatenablog.com/entry/2016/08/16/221838 | |
echo username=${NAS_USER} | sudo tee /etc/naspasswd > /dev/null | |
echo password=${NAS_PASS} | sudo tee /etc/naspasswd -a > /dev/null | |
sudo chmod 0600 /etc/naspasswd | |
sudo mkdir -p /mnt/nas | |
sudo ln -s /mnt/nas /var/lib/mpd/music/. | |
sudo sed -ie "$ a //${NAS_ADDR} /mnt/nas cifs vers=3.0,credentials=/etc/naspasswd,noserverino,iocharset=utf8,ro,defaults 0 0" /etc/fstab | |
sudo raspi-config nonint do_boot_wait 0 #enable wait boot | |
# Build MPD | |
# Ref: http://nw-electric.way-nifty.com/blog/2016/08/mpdpi-2-pi-3-5a.html | |
# Ref: https://github.com/MusicPlayerDaemon/MPD/blob/master/doc/user.xml | |
sudo wget https://gist.githubusercontent.com/estshorter/9251f4bb033cab4793c2d1ae07727e78/raw/ -O /etc/mpd.conf # Get mpd.conf | |
sudo apt -y install \ | |
libid3tag0-dev \ | |
libboost-dev \ | |
libicu-dev \ | |
libsystemd-dev | |
mkdir mpd | |
cd mpd | |
wget "https://www.musicpd.org/download/mpd/${MPD_MAJOR_VER}/mpd-${MPD_VER}.tar.xz" | |
tar -Jxf "mpd-${MPD_VER}.tar.xz" | |
cd "./mpd-${MPD_VER}" | |
./configure CFLAGS="${OPT}" CXXFLAGS="${OPT}" \ | |
--disable-dsd \ | |
--disable-libmpdclient --disable-curl \ | |
--with-systemdsystemunitdir=/lib/systemd/system | |
make -j4 | |
strip src/mpd | |
sudo make install | |
sudo sed -i 's:--no-daemon:--no-daemon /etc/mpd.conf:' /lib/systemd/system/mpd.service | |
# Change owner of /var/run/mpd when starting mpd | |
# Specify high priority to MPD tasks | |
# Ref: https://qiita.com/s-yama/items/2d6d7964ac39b08d925e | |
# Ref: http://community.phileweb.com/mypage/entry/4787/201704/55263/ | |
MPD_INIT_CMD='PermissionsStartOnly=true | |
ExecStartPre=/bin/chown -R mpd:audio /var/run/mpd | |
ExecStartPost=/usr/bin/chrt -a --fifo -p 99 $MAINPID' | |
echo "$MPD_INIT_CMD" | sudo sed -ie '/\[Service\]/r /dev/stdin' /lib/systemd/system/mpd.service | |
# Enable MPD service | |
sudo systemctl enable mpd | |
cd ../../ | |
# Build libmpdclient | |
mkdir libmpdclient | |
cd libmpdclient | |
wget https://www.musicpd.org/download/libmpdclient/2/libmpdclient-${LIBMPDCLIENT_VER}.tar.xz | |
tar Jxf libmpdclient-${LIBMPDCLIENT_VER}.tar.xz | |
cd libmpdclient-${LIBMPDCLIENT_VER} | |
sudo apt -y install python3-pip cmake | |
sudo pip3 install meson scikit-build | |
sudo pip3 install ninja | |
CFLAGS="${OPT}" meson . output --prefix="/usr" | |
ninja -C output | |
sudo ninja -C output install | |
sudo ldconfig | |
cd ../../ | |
## Build curl | |
# Ref: https://qiita.com/kb10uy/items/976a52f687bcb7745fc7 | |
mkdir curl | |
cd curl | |
sudo apt -y install libssl-dev | |
wget https://curl.haxx.se/download/curl-${CURL_VER}.tar.bz2 | |
tar xf curl-${CURL_VER}.tar.bz2 | |
cd curl-${CURL_VER} | |
./configure --with-ssl --with-zlib CFLAGS="${OPT}" | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
cd ../../ | |
# Build mpdas for scrobbling to last.fm | |
#sudo apt -y install libcurl4-gnutls-dev libmpdclient-dev | |
mkdir mpdas | |
cd mpdas | |
#wget https://github.com/hrkfdn/mpdas/archive/${MPDAS_VER}.tar.gz | |
#tar -zxf ${MPDAS_VER}.tar.gz | |
#cd mpdas-${MPDAS_VER} | |
wget https://github.com/hrkfdn/mpdas/archive/master.zip | |
unzip master.zip | |
cd mpdas-master | |
CXXFLAGS="${OPT}" make -j4 | |
strip mpdas | |
sudo make install | |
MPDAS_CONFIG="username = ${LAST_FM_USER} | |
password = ${LAST_FM_PASS} | |
runas = pi" | |
echo "$MPDAS_CONFIG" | sudo tee /usr/local/etc/mpdasrc > /dev/null | |
sudo chmod 0600 /usr/local/etc/mpdasrc | |
MPDAS_SYSTEMD='[Unit] | |
Description=AudioScrobbler Client for MPD | |
After=mpd.service | |
[Service] | |
ExecStart=/usr/local/bin/mpdas | |
Type=simple | |
[Install] | |
WantedBy=multi-user.target' | |
echo "$MPDAS_SYSTEMD" | sudo tee /lib/systemd/system/mpdas.service > /dev/null | |
sudo systemctl enable mpdas | |
cd ../../ | |
# Provide cover art via http | |
sudo apt -y install nginx-light | |
# Supress nginx log | |
# Ref: https://worklog.be/archives/2890 | |
sudo sed -i 's:^\s.*access_log.*$: access_log off;:' /etc/nginx/nginx.conf | |
sudo sed -i 's:^\s.*error_log.*$: error_log /dev/null crit;:' /etc/nginx/nginx.conf | |
sudo ln -s /var/lib/mpd/music /var/www/html/covers | |
# Disable unnecessary service | |
# Ref: http://omorodive.blogspot.jp/2017/10/raspberry-pilean-mpd.html | |
# Ref: http://nw-electric.way-nifty.com/blog/2017/04/raspberry-pi-ze.html | |
sudo systemctl disable triggerhappy | |
sudo systemctl disable keyboard-setup | |
sudo systemctl disable avahi-daemon | |
sudo systemctl disable hciuart | |
sudo systemctl disable bluetooth | |
sudo systemctl disable getty@tty1 | |
sudo systemctl disable rpi-display-backlight | |
# Disable usb-hub power | |
# Ref: http://community.phileweb.com/mypage/entry/4787/20170401/55263/ | |
sudo apt -y install libusb-dev | |
mkdir hub-ctrl | |
cd hub-ctrl | |
wget https://raw.githubusercontent.com/codazoda/hub-ctrl.c/master/hub-ctrl.c | |
gcc -o hub-ctrl hub-ctrl.c -lusb ${OPT} | |
strip hub-ctrl | |
sudo cp ./hub-ctrl /usr/local/bin | |
sudo sed -ie "/^exit 0$/i /usr/local/bin/hub-ctrl -h 0 -P 2 -p 0" /etc/rc.local | |
cd ../ | |
# Enable ls aliases | |
sed -i 's/^#alias ll='\''ls -l'\''/alias ll='\''ls -l'\''/g' ~/.bashrc | |
sed -i 's/^#alias la='\''ls -A'\''/alias la='\''ls -A'\''/g' ~/.bashrc | |
echo Reboot your system | |
} | |
main() | |
{ | |
if test -e $SETUP3_DONE | |
then | |
echo Setup done! | |
elif test -e $SETUP2_DONE | |
then | |
echo Starting setup3 | |
setup3 | |
cd $CURRENT_DIR | |
touch $SETUP3_DONE | |
echo Finishing setup3 | |
echo Reboot your system | |
elif test -e $SETUP1_DONE | |
then | |
echo Starting setup2 | |
setup2 | |
cd $CURRENT_DIR | |
touch $SETUP2_DONE | |
echo Finishing setup2 | |
echo Reboot your system | |
else | |
echo Starting setup1 | |
setup1 | |
cd $CURRENT_DIR | |
touch $SETUP1_DONE | |
echo Finishing setup1 | |
echo Reboot your system | |
fi | |
} | |
main |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment