Originariamente inviato da UnixMan
Ho testato e rimesso mano allo script. Stavolta nessuna modifica particolarmente sostanziale, solo qualche "limatina" qui e la. Purtroppo al momento non riesco (al momento si direbbe che il provider stia subendo un attacco...) a metterlo al solito posto: lo farò non appena possibile.

Nel frattempo ve lo posto qui:

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!"

Be Paolo, che dire....grazie!!! anche le spiegazione!!!