codice:
#!/bin/bash
# WARNING: "bashisms"! Not POSIX compliant, do not use a different shell!
cat<<-EHEAD
Personalizzazione post-installazione del S.O Debian 8.x "Jessie"
EHEAD
# controlli preliminari
if [ ! -f /etc/debian_version ] || egrep -qv '^8\.' /etc/debian_version ; then
cat<<-EWARN1
ATTENZIONE: è stato rilevato un sistema diverso da Debian 8.x "Jessie".
Questo script è pensato esclusivamente per Debian 8.x "Jessie" e sistemi
derivati da (e perfettamente compatibili con) questo, come ad es. LMDE 2.
Il suo utilizzo con versioni o distribuzioni diverse non è supportato e
potrebbe danneggiare il vostro sistema.
EWARN1
read -s -N1 -p 'Procedere comunque? (s/n)'
echo
if [ "$REPLY" != "s" ]; then
echo -e '\nAbort.\n'
exit 1
fi
fi
[ "$(whoami)" == "root" ] || {
echo -e '\a\nATTENZIONE: questo script deve essere eseguito dal "SuperUser" (utente root).'
exec su -c "$0"
}
# definizione delle funzioni
function fail() {
echo -e "\nFatal ERROR: $1\n\nAborted."
exit $(false)
}
function pausa() {
read -s -p 'Premere "Invio" per continuare...'
echo
}
function select_install_type() {
# selezione del tipo di sistema da installare
TipoSistema=""
while [ "$TipoSistema" == "" ] ; do
cat<<-ECHOICE
Cosa si desidera installare?
0) nulla, solo setup di base
1) sistema player (squeezelite)
2) systema server (LMS)
3) sistema completo stand-alone, server+player (LMS+squeezelite)
ECHOICE
read -N1 -p 'Digitare il numero corrispondente (0|1|2|3): ' SceltaSistema
echo
case "$SceltaSistema" in
0)
TipoSistema="custom"
;;
1)
TipoSistema="player"
;;
2)
TipoSistema="server"
;;
3)
TipoSistema="completo"
;;
*)
echo -e "\a\nErrore: selezione non prevista. Si prega di digitare 0, 1, 2 o 3."
esac
if [ "$TipoSistema" != "" ]; then
echo "Scelta effettuata: sistema $TipoSistema"
read -s -N1 -p 'Confermare e procedere con l´installazione? (s/N)'
echo
[ "$REPLY" != "s" ] && TipoSistema=""
fi
done
}
function disable_swap() {
cat <<-EOSW
Per i sistemi solo "player" (squeezelite) lo "swap" (memoria virtuale
su disco, AKA "area di scambio") è superfluo. Dato che potrebbe anche
interferire con la riproduzione, se ne sconsiglia l'uso.
Se il sistema dispone di una quantità sufficiente di RAM fisica, non è
necessario utilizzarlo neanche per sistemi che includono il server LMS.
Qualora inoltre il disco su cui risiede la partizione di swap sia in
effetti una memoria a stato solido ("flash": SSD, CF, SD, USB memory-
sticks, ecc), le frequenti operazioni di scrittura tipiche dello swap
portano ad un precoce deterioramento della stessa.
In tali casi è pertanto sempre decisamente sconsigliato utilizzare lo
swap su disco.
EOSW
read -s -N1 -p 'Disabilitare lo swap su disco? (S/n)'
if [ "$REPLY" != "n" ]; then
echo -e '\nDisabilitazione dello swap.'
swapoff -a
sed -i -r '/swap/{s/^([^#].*)$/#\1/}' /etc/fstab
fi
}
function uninstall_syslogger() {
cat <<-EOSW
Normalmente i sistemi Linux utilizzano un servizio di memorizzazione su
disco dei log (AKA "registri") di sistema (syslog). Laddove non sia
necessario tenere traccia (semi)permanente di tali informazioni, tale
servizio può essere disinstallato.
Nelle applicazioni "real-time" questo può essere vantaggioso in quanto
elimina un processo attivo e riduce gli accessi al disco superflui.
È inoltre raccomandata la sua disinstallazione laddove il disco su cui
risiede il file-system "/var" sia in effetti una memoria a stato solido
("flash": SSD, CF, SD, USB memory-sticks, ecc), in quanto le frequenti
operazioni di scrittura dei log files possono portare ad un precoce
deterioramento della stessa.
EOSW
read -s -N1 -p 'Disinstallare il syslogger? (S/n)'
if [ "$REPLY" != "n" ]; then
echo -e '\nDisinstallazione di syslog...'
apt-get -y purge '^(.|busybox-)?syslog(d)?(-ng.*)?$' 2>&1|tee "purge.syslog.log"
fi
}
function install_LMS() {
echo -e "\nDownload ed installazione di LMS v7.9 (latest nightly build)"
wget -nv -nH -nd -r -np -l1 -c -A '*.deb' http://downloads.slimdevices.com/nightly/?ver=7.9
gdebi --non-interactive logitechmediaserver_7.9*_all.deb
cat <<-EOLMS > "LMS_notice.txt"
ATTENZIONE: potrebbe essere necessario personalizzare le configurazioni
di LMS editando i relativi files di configurazione:
/etc/default/logitechmediaserver
/etc/squeezeboxserver/convert.conf
/etc/squeezeboxserver/modules.conf
/etc/squeezeboxserver/types.conf
Dopo aver editato i files di configurazione, per rendere effettive le
modifiche effettuate riavviare il servizo con il comando:
service logitechmediaserver restart
oppure riavviare il sistema.
EOLMS
}
function install_squeezelite() {
echo -e "\nDownload ed installazione di squeezelite-R2"
if [ "$(arch)" == "x86_64" ]; then
MySL="squeezelite_1.8.1mc2-1_amd64.deb"
else
MySL="squeezelite_1.8.1mc2-1_i386.deb"
fi
wget -nd -nv -c http://www.audiofaidate.org/sw/$MySL
gdebi --non-interactive $MySL
service squeezelite stop
[ -f /etc/default/squeezelite ] && mv -f /etc/default/squeezelite /etc/default/squeezelite.bak
cat <<-EOSLC > /etc/default/squeezelite
# Defaults for squeezelite initscript
# sourced by /etc/init.d/squeezelite
# installed at /etc/default/squeezelite by the maintainer scripts
# The name for the squeezelite player:
SL_NAME="$(hostname -s)"
# ALSA output device:
#SL_SOUNDCARD="default:CARD=X20"
#SL_SOUNDCARD="front:CARD=x20,DEV=0"
#SL_SOUNDCARD="front:CARD=D20,DEV=0"
#SL_SOUNDCARD="default:CARD=Amanero"
# Squeezebox server (Logitech Media Server):
# Uncomment the next line if you want to point squeezelite at the IP address of
# your squeezebox server. This is usually unnecessary as the server is
# automatically discovered.
#SB_SERVER_IP="192.168.x.y"
# Additional options to pass to squeezelite:
# Please do not include -z to make squeezelite daemonise itself.
SB_EXTRA_ARGS="-C"
EOSLC
cat <<-EOSLM > "squeezelite_notice.txt"
ATTENZIONE: potrebbe essere necessario personalizzare le configurazioni
di squeezelite editando il relativo files di configurazione:
/etc/default/squeezelite
Si consiglia di collegare l´interfaccia audio che si intende utilizzare
e dare il seguente comando:
squeezelite -l
che fornisce una lista dei possibili dispositivi di output che possono
essere utilizzati da squeezelite. Quello più appropriato va messo nella
variabile SL_SOUNDCARD (nel file /etc/default/squeezelite).
Dopo aver editato il file di configurazione, per rendere effettive le
modifiche effettuate riavviare il servizio con il comando:
service squeezelite restart
oppure riavviare il sistema.
Si raccomanda di dare il comando "alsamixer" per verificare che le
impostazioni del dispositivo di uscita audio siano corrette; in modo
particolare controllare che la/e uscita/e non siano in "mute" (*non*
deve essere presente una "M" sotto la barra del volume).
EOSLM
}
function udev_setup() {
[ -f /etc/udev/rules.d/40-timer-permissions.rules ] && mv -f /etc/udev/rules.d/40-timer-permissions.rules /etc/udev/rules.d/40-timer-permissions.rules.bak
cat <<-EOHPT > /etc/udev/rules.d/40-timer-permissions.rules
KERNEL=="rtc0", GROUP="audio"
KERNEL=="hpet", GROUP="audio"
EOHPT
# Attivazione immediata delle modifiche precedenti:
service udev force-reload
chgrp audio /dev/hpet /dev/rtc0
chmod 660 /dev/hpet /dev/rtc0
}
function sysctl_setup() {
[ -f /etc/sysctl.d/60-max-user-freq.conf ] && mv -f /etc/sysctl.d/60-max-user-freq.conf /etc/sysctl.d/60-max-user-freq.conf.bak
[ -f /etc/sysctl.d/99-local.conf ] && mv -f /etc/sysctl.d/99-local.conf /etc/sysctl.d/99-local.conf.bak
cat <<-EOSC > /etc/sysctl.d/99-local.conf
# Configuration file for runtime kernel parameters.
# See sysctl.conf(5) for more information.
# vm.swappiness = 60 # default
vm.swappiness = 10
# Contains, as a percentage of total system memory, the number of pages at which
# a process which is generating disk writes will start writing out dirty data.
## Arch default = 10.
vm.dirty_ratio = 3
# Contains, as a percentage of total system memory, the number of pages at which
# the background kernel flusher threads will start writing out dirty data.
## Arch default = 5.
vm.dirty_background_ratio = 2
kernel.perf_cpu_time_max_percent = 50
kernel.perf_event_max_sample_rate = 50000
# Protection from the SYN flood attack.
net.ipv4.tcp_syncookies = 1
# Disable packet forwarding.
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# Set the max OS send buffer size (wmem) and receive buffer size (rmem) to 12MB
# for queues on all protocols. In other words set the amount of memory that is
# allocated for each TCP socket when it is opened or created while transferring
# files:
net.core.wmem_max=12582912
net.core.rmem_max=12582912
# You also need to set minimum size, initial size, and maximum size in bytes:
net.ipv4.tcp_rmem= 10240 87380 12582912
net.ipv4.tcp_wmem= 10240 87380 12582912
# Turn on window scaling which can be an option to enlarge the transfer window:
net.ipv4.tcp_window_scaling = 1
# Enable timestamps as defined in RFC1323:
net.ipv4.tcp_timestamps = 1
# Enable select acknowledgments:
net.ipv4.tcp_sack = 1
# By default, TCP saves various connection metrics in the route cache when the
# connection closes, so that connections established in the near future can use
# these to set initial conditions. Usually, this increases overall performance,
# but may sometimes cause performance degradation. If set, TCP will not cache
# metrics on closing connections.
net.ipv4.tcp_no_metrics_save = 1
# Set maximum number of packets, queued on the INPUT side, when the interface
# receives packets faster than kernel can process them.
net.core.netdev_max_backlog = 5000
fs.inotify.max_user_watches = 524288
# set high precision timer
dev.hpet.max-user-freq=3072
EOSC
# Attivazione immediata delle modifiche precedenti:
sysctl -p /etc/sysctl.d/99-local.conf
}
function limits_setup() {
echo -e '\nSetup dei limiti e permessi di sistema per il gruppo "audio"'
[ -f /etc/security/limits.d/audio.conf ] && mv -f /etc/security/limits.d/audio.conf /etc/security/limits.d/audio.conf.bak
cat <<-EOAL > /etc/security/limits.d/audio.conf
# limits for users/processes in audio grup
#@audio - rtprio 99
@audio - rtprio 95
@audio - nice -15
#@audio - memlock unlimited
#@audio - memlock 250000
@audio - memlock 500000
EOAL
}
function rclocal_setup() {
echo -e '\nSetup esecuzione automatica al boot - file /etc/rc.local'
[ -f /etc/rc.local ] && mv -f /etc/rc.local /etc/rc.local.bak
cat <<-EORL > /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
echo 3072 > /sys/class/rtc/rtc0/max_user_freq
exit 0
EORL
chmod +x /etc/rc.local
# Attivazione immediata della modifica precedente:
echo 3072 > /sys/class/rtc/rtc0/max_user_freq
}
function grub_setup() {
echo -e '\naggiunta di "threadirqs" ai parametri di avvio del Kernel'
sed -r -i.bak '/threadirqs/!{s/^(GRUB_CMDLINE_LINUX.*)\"(.*)\"/\1"\2 threadirqs"/};s/=" /="/' /etc/default/grub
update-grub
}
function fstab_setup() {
echo -e '\nAggiunta di "noatime" alle opzioni di mount dei file system'
sed -r -i.bak '/atime/!{s/(ext.\s+)(\w+)/\1noatime,\2/}' /etc/fstab
}
function base_repos_setup() {
echo -e '\nAggiunta dei repository di base + multimedia, inclusi "non-free" e "contrib"'
[ -f /etc/apt/sources.list ] && mv -f /etc/apt/sources.list /etc/apt/sources.list.bak
[ -f /etc/apt/sources.list.d/debian.list ] && mv -f /etc/apt/sources.list.d/debian.list /etc/apt/sources.list.d/debian.list.bak
cat<<-EOD > /etc/apt/sources.list.d/debian.list
deb http://httpredir.debian.org/debian jessie main contrib non-free
deb http://httpredir.debian.org/debian jessie-updates main contrib non-free
deb http://security.debian.org/ jessie/updates main contrib non-free
deb http://www.deb-multimedia.org jessie main non-free
EOD
}
function liquorix_repos_setup() {
echo -e '\nAggiunta del repository del kernel "Liquorix"'
[ -f /etc/apt/sources.list.d/liquorix.list ] && mv -f /etc/apt/sources.list.d/liquorix.list /etc/apt/sources.list.d/liquorix.list.bak
cat<<-EOLS > /etc/apt/sources.list.d/liquorix.list
# Liquorix is a distro kernel replacement built using the best
# configuration and kernel sources for desktop, multimedia, and
# gaming workloads.
deb http://liquorix.net/debian sid main past
#deb-src http://liquorix.net/debian sid main past
# Mirrors:
#
# Unit193 - France
deb http://mirror.unit193.net/liquorix sid main
# deb-src http://mirror.unit193.net/liquorix sid main
#
# Liquorix - Cloudfront Global CDN
# deb http://cdn.liquorix.net/debian sid main
# deb-src http://cdn.liquorix.net/debian sid main
EOLS
}
function apt_setup() {
base_repos_setup
liquorix_repos_setup
echo -e '\nAggiornamento delle liste dei pacchetti...\n'
apt-get update > "update.log" 2>&1 \
|| fail "aggiornamento del DB di APT fallito."
echo -e '\nInstallazione dei "keyrings" per APT'
apt-get --allow-unauthenticated -y install \
'((^(deb(ian)?|liquorix)-([^-]+-)?)|-archive-)keyring.?' \
2>&1|tee "install.keyrings.log" \
|| fail "installazione dei keyring fallito."
# è necessario aggiornare di nuovo
apt-get update >> "update.log" 2>&1 \
|| fail "aggiornamento del DB di APT fallito."
}
function basic_packages_setup() {
echo -e '\nRimozione dei pacchetti superflui...'
apt-get -y purge pulseaudio 2>&1|tee "purge.log"
apt-get -y autoremove 2>&1|tee "autoremove.log"
echo -e '\nInstallazione degli aggiornamenti di sistema...'
apt-get -y dist-upgrade 2>&1|tee "upgrade.log" || fail "aggiornamento del sistema fallito."
apt-get -y autoremove 2>&1|tee -a "autoremove.log"
echo -e '\nInstallazione accessori vari, ALSA utils, rtirq, ffmpeg, sox, ecc...'
package_list='
firmware-linux
sudo
gdebi-core
htop
fdupes
mc
gpm
openssh-client
openssh-server
ssh
alsa-utils
rtirq-init
flac
ffmpeg
sox
libsox-fmt-all
'
for package in $package_list; do
apt-get --install-recommends -y install "$package" 2>&1|tee -a "install.packages.log"
done
}
function install_liquorix_kernel() {
echo -e '\nInstallazione del Kernel Liquorix...'
if [ "$(arch)" == "x86_64" ]; then
MyKernel="linux-image-liquorix-amd64"
else
MyKernel="linux-image-liquorix-686"
fi
apt-get --no-install-recommends -y install $MyKernel 2>&1|tee "install.kernel.log"
cat <<-EOK # > "kernel_notice.txt"
ATTENZIONE:
per attivare il nuovo Kernel è necessario riavviare il sistema.
EOK
}
# main - start doing real things
myName=$(basename "$0")
myWorkdir="/var/tmp/$myName.$(date '+%F.%H-%M-%S')"
[ ! -e "$myWorkdir" ] && mkdir "$myWorkdir"
cd "$myWorkdir" || fail "impossibile accedere alla directory di lavoro: $myWorkdir"
select_install_type
disable_swap
uninstall_syslogger
fstab_setup
grub_setup
limits_setup
echo -e '\nSetup ottimizzazioni varie...'
# parametri di sysctl, setup di udev, ecc.
udev_setup
sysctl_setup
rclocal_setup
apt_setup
basic_packages_setup
install_liquorix_kernel
echo -e '\nConfigurazioni di base completate.'
# Installazione degli elementi del sistema selezionato
case "$TipoSistema" in
player)
install_squeezelite 2>&1|tee install_squeezelite.log
;;
server)
install_LMS 2>&1|tee install_LMS.log
;;
completo)
install_squeezelite 2>&1|tee install_squeezelite.log
install_LMS 2>&1|tee install_LMS.log
esac
echo -e "\nSetup completato."
if ls -1 *.txt >/dev/null 2>&1 ; then
cat <<-EON
Saranno ora visualizzate le note finali, che si prega di
leggere con la massima attenzione.
I files che state per leggere insieme ai log dettagliati
si trovano nella directory:
$myWorkdir
potete consultarli nuovamente in seguito con il comando:
less nome_file
Utilizzate i tasti freccia e PgUp/PgDn per far scorrere il
testo. Premete il tasto "q" per uscire dal visualizzatore.
EON
pausa
for file in *.txt ; do
less "$file"
done
fi
echo -e "\aThat's all, folks!"