Come installare Entware su un router


In questa sezione descriverò come installare Entware su un router (Asus RT-AC56U).
Innanzitutto quasi tutti i router di Asus integrano il gestore dei pacchetti Optware. Questo gestore di pacchetti è datato, tutti i pacchetti non vengono più aggiornati. Per questa ragione, un nuovo gestore di pacchetti (Entware) è stato creato al fine di rimpiazzare Optware. Sfortunatamente Entware e Optware condividono alcune librerie, pertanto non possiamo installarli contemporaneamente. Alcune funzionalità dei router Asus non sono compatibili con i pacchetti Entware, ad esempio il "Media Server", "Asus AiCloud" e "Download Master". Fintanto questi pacchetti sono incorporati nel router, essi sono ancora disponibili, invece se essi sono installati in una unità disco esterna, essi devono lavorare solo con Optware poiché non sono compatibili con Entware (non possiamo mischiare le librerie di Entware con le librerie di Optware). Sebbene "Media Server" e "Download Master" possono essere rimpiazzate da alcuni pacchetti di Entware (ad esempio rispettivamente da "Minidlna" e "Transmission"), "Asus AiCloud" non può essere direttamente rimpiazzato, pertanto dobbiamo considerare quanto scritto sopra prima di effettuare l'aggiornamento ad Entware.
Il primo passo da effettuare per aggiornare ad Entware è installare un pacchetto incorporato nel router, ad esempio "Download Master". Useremo un'unità disco esterna (ad esempio una pennetta USB), la formattiamo usando il file system ext2/ext3, la inseriamo nella presa USB del router, e installiamo "Download Master". Dopo aver fatto questo, disinstalliamo "Download Master" (non ne abbiamo più bisogno). In questa maniera il router ha creato una cartella nell'unità disco esterna, il nome di questa cartella dipende dal router che stiamo usando (ad esempio per il router RT-AC56U questa cartella è denominata "asusware.arm"). Dopo aver fatto questo, apriamo Telnet, andiamo nella cartella "/opt" ed eliminiamo tutti i file inclusi in quella cartella, tranne il file ".asusrouter" poiché questo file è usato dal router per montare la cartella "/opt". Ora la cartella "/opt" è vuota (tranne che per il file ".asusrouter"), pertanto possiamo installare Entware. Per fare questo, dobbiamo scaricare questo script. Quello che segue è un esempio del suddetto script:

#!/bin/sh

echo "Info: Checking for prerequisites and creating folders..."

if [ -d /opt ]
then
    echo "Warning: Folder /opt exists!"
else
    mkdir /opt
fi
for folder in bin etc/init.d lib/opkg sbin share tmp usr var/log var/lock var/run
do
  if [ -d "/opt/$folder" ]
  then
    echo "Warning: Folder /opt/$folder exists!"
    echo "Warning: If something goes wrong please clean /opt folder and try again."
  else
    mkdir -p /opt/$folder
  fi
done

echo "Info: Opkg package manager deployment..."
CURARCH="armv7"
DLOADER="ld-linux.so.3"
URL=http://pkg.entware.net/binaries/$CURARCH/installer
wget $URL/opkg -O /opt/bin/opkg
chmod +x /opt/bin/opkg
wget $URL/opkg.conf -O /opt/etc/opkg.conf
wget $URL/ld-2.23.so -O /opt/lib/ld-2.23.so
wget $URL/libc-2.23.so -O/opt/lib/libc-2.23.so
wget $URL/libgcc_s.so.1.2.23 -O /opt/lib/libgcc_s.so.1
cd /opt/lib
chmod +x ld-2.23.so
ln -s ld-2.23.so $DLOADER
ln -s libc-2.23.so libc.so.6

echo "Info: Basic packages installation..."
/opt/bin/opkg update
/opt/bin/opkg install entware-opt
if [ ! -f /opt/usr/lib/locale/locale-archive ]
then
        wget http://pkg.entware.net/binaries/other/locale-archive.2.23 -O /opt/usr/lib/locale/locale-archive
fi

echo "Info: Congratulations!"
echo "Info: If there are no errors above then Entware-ng was successfully initialized."
echo "Info: Add /opt/bin & /opt/sbin to your PATH variable"
echo "Info: Add '/opt/etc/init.d/rc.unslung start' to startup script for Entware-ng services to start"
echo "Info: Found a Bug? Please report at https://github.com/Entware-ng/Entware-ng/issues"

Dopo aver scaricato il suddetto script, lo andiamo ad eseguire. Ciò che segue è un esempio di risultato del suddetto script:

root@RT-AC56U:/tmp# ./entware-install.sh

Info: Checking for prerequisites and creating folders...
Warning: Folder /opt exists!
Warning: If something goes wrong please clean /opt folder and try again.
Info: Opkg package manager deployment...
Connecting to pkg.entware.net (81.4.123.217:80)
opkg                 100% |**************************|   124k  0:00:00 ETA
Connecting to pkg.entware.net (81.4.123.217:80)
opkg.conf            100% |**************************|   142   0:00:00 ETA
Connecting to pkg.entware.net (81.4.123.217:80)
ld-2.23.so           100% |**************************|   139k  0:00:00 ETA
Connecting to pkg.entware.net (81.4.123.217:80)
libc-2.23.so         100% |**************************|  1198k  0:00:00 ETA
Connecting to pkg.entware.net (81.4.123.217:80)
libgcc_s.so.1        100% |**************************| 39632   0:00:00 ETA
Info: Basic packages installation...
Downloading http://pkg.entware.net/binaries/armv7/Packages.gz.
Updated list of available packages in /opt/var/opkg-lists/packages.
Installing entware-opt (222108-5) to root...
Downloading http://pkg.entware.net/binaries/armv7/entware-opt_222108-5_armv7soft.ipk.
Installing libc (2.23-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/libc_2.23-6_armv7soft.ipk.
Installing libgcc (6.3.0-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/libgcc_6.3.0-6_armv7soft.ipk.
Installing libssp (6.3.0-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/libssp_6.3.0-6_armv7soft.ipk.
Installing librt (2.23-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/librt_2.23-6_armv7soft.ipk.
Installing libpthread (2.23-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/libpthread_2.23-6_armv7soft.ipk.
Installing libstdcpp (6.3.0-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/libstdcpp_6.3.0-6_armv7soft.ipk.
Installing ldconfig (2.23-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/ldconfig_2.23-6_armv7soft.ipk.
Installing findutils (4.6.0-1) to root...
Downloading http://pkg.entware.net/binaries/armv7/findutils_4.6.0-1_armv7soft.ipk.
Installing terminfo (6.0-1c) to root...
Downloading http://pkg.entware.net/binaries/armv7/terminfo_6.0-1c_armv7soft.ipk.
Installing locales (2.23-6) to root...
Downloading http://pkg.entware.net/binaries/armv7/locales_2.23-6_armv7soft.ipk.
Installing opkg (2011-04-08-9c97d5ec-17) to root...
Downloading http://pkg.entware.net/binaries/armv7/opkg_2011-04-08-9c97d5ec-17_armv7soft.ipk.
Configuring libgcc.
Configuring libc.
Configuring libssp.
Configuring libpthread.
Configuring librt.
Configuring terminfo.
Configuring ldconfig.
Configuring locales.
Entware uses separate locale-archive file independent from main system
Creating locale archive - /opt/usr/lib/locale/locale-archive
Adding en_EN.UTF-8
Adding ru_RU.UTF-8
You can download locale sources from http://pkg.entware.net/sources/i18n_glib223.tar.gz
You can add new locales to Entware using /opt/bin/localedef.new
Configuring opkg.
Configuring libstdcpp.
Configuring findutils.
Configuring entware-opt.
Updating /opt/etc/ld.so.cache... done.
Info: Congratulations!
Info: If there are no errors above then Entware-ng was successfully initialized.
Info: Add /opt/bin & /opt/sbin to your PATH variable
Info: Add '/opt/etc/init.d/rc.unslung start' to startup script for Entware-ng services to start
Info: Found a Bug? Please report at https://github.com/Entware-ng/Entware-ng/issues

Noi possiamo usare il comando "opkg --help" per controllare se abbiamo installato correttamente Entware sul router.
Se diamo uno sguardo al suddetto risultato, possiamo notare la linea "Info: Add /opt/bin & /opt/sbin to your PATH variable". Non abbiamo bisogno di aggiungere queste cartelle alla variabile PATH poiché queste cartelle vengono automaticamente aggiunte alla variabile PATH dal router ogni qualvolta la cartella "/opt" viene montata. Notiamo anche la linea "Info: Add '/opt/etc/init.d/rc.unslung start' to startup script for Entware-ng services to start". Questa linea deve essere considerata solo se vogliamo eseguire uno script ogni qualvolta inseriamo l'unità disco esterna. Normalmente sui router Asus i servizi vengono automaticamente attivati grazie ad alcune funzionalità di Optware, queste funzionalità permettono di eseguire i servizi inclusi nella cartella "/opt/etc/init.d". Sfortunatamente con Entware dobbiamo usare un altro metodo per eseguire uno script automaticamente dopo il montaggio della cartella "/opt". Fortunatamente il router include una chiave "nvram" la quale esegue automaticamente uno script. Questa chiave è denominata "script_usbmount", normalmente questa chiave è vuota. Ad esempio se vogliamo usare lo script "/opt/etc/autorun.sh", dobbiamo eseguire i seguenti comandi:
nvram set script_usbmount=/opt/etc/autorun.sh
nvram commit
Per controllare i suddetti comandi, dobbiamo eseguire il seguente comando:
nvram show | grep -i autorun.sh
Il suddetto comando restituisce:
script_usbmount=/opt/etc/autorun.sh
All'interno del suddetto script "autorun.sh" possiamo attivare servizi (ricordarsi che gli script dei servizi sono inclusi nella cartella "/opt/etc/init.d") oppure eseguire altri script o comandi.
Esiste un'altra chiave "nvram" denominata "script_usbumount", questa chiave è simile alla suddetta chiave "script_usbmount" ma il suo valore è usato prima che l'unità disco esterna venga smontata, in questa maniera possiamo fermare i servizi oppure eseguire altri script o comandi prima che l'unità disco esterna venga rimossa.
Dopo aver installato Entware, possiamo installare tutti i pacchetti necessari, per esempio se vogliamo installare l'editor "Nano", possiamo usare il comando "opkg install nano". Notare che il comando per Entware è "opkg", invece noi usavamo il comando "ipkg" per Optware. La sintassi del comando "opkg" è simile alla sintassi del comando "ipkg", pertanto non c'è bisogno di ripartire da zero.
Per aggiornare tutti i pacchetti useremo i due comandi "opkg update" e "opkg upgrade" (il primo comando aggiorna la sorgente Internet dei pacchetti, il secondo aggiorna solo i pacchetti aggiornati). Dobbiamo fare attenzione ad aggiornare i pacchetti, poiché mi è capitato in passato che alcuni file di configurazione (da me modificati) siano stati sovrascritti dai file di configurazione predefiniti. Il mio suggerimento è di effettuare una copia di riserva di tutta la cartella "/opt" prima di aggiornare i pacchetti (ma anche periodicamente allo scopo di avere una copia di riserva dell'installazione Entware ogni qualvolta abbiamo bisogno di ripristinare alcuni file).
Un altro mio suggerimento è quello di usare il parametro "--noaction" con il comando "opkg upgrade", in questa maniera possiamo vedere una simulazione (verifica) della procedura di aggiornamento, proprio per sapere in anticipo quali pacchetti verrano aggiornati, quali file verranno sovrascritti e se c'è qualcosa che possiamo fare in anticipo allo scopo di avere un ambiente Entware completamente funzionante dopo aver aggiornato i pacchetti.

Ciò che segue è un esempio di risultato del comando "opkg update":

root@RT-AC56U:/tmp# opkg update

Downloading http://pkg.entware.net/binaries/armv7/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/packages

Ciò che segue è un esempio di risultato del comando "opkg --help":

root@RT-AC56U:/tmp# opkg --help

usage: opkg [options...] sub-command [arguments...]
where sub-command is one of:

Package Manipulation:
	update 		 	Update list of available packages
	upgrade 	 	Upgrade installed packages
	install <pkgs> 	 	Install package(s)
	configure <pkgs> 	Configure unpacked package(s)
	remove <pkgs|regexp> 	Remove package(s)
	flag <flag> <pkgs> 	Flag package(s)
	 <flag>=hold|noprune|user|ok|installed|unpacked (one per invocation)

Informational Commands:
	list			List available packages
	list-installed 		List installed packages
	list-upgradable 	List installed and upgradable packages
	list-changed-conffiles 	List user modified configuration files
	files <pkg> 		List files belonging to <pkg>
	search <file|regexp> 	List package providing <file>
	find <regexp> 		List packages whose name or description matches <regexp>
	info [pkg|regexp] 	Display all info for <pkg>
	status [pkg|regexp] 	Display all status for <pkg>
	download <pkg> 		Download <pkg> to current directory
	compare-versions 	<v1> <op> <v2>
				compare versions using <= < > >= = << >>
	print-architecture 	List installable package architectures
	depends [-A] [pkgname|pat]+
	whatdepends [-A] [pkgname|pat]+
	whatdependsrec [-A] [pkgname|pat]+
	whatrecommends[-A] [pkgname|pat]+
	whatsuggests[-A] [pkgname|pat]+
	whatprovides [-A] [pkgname|pat]+
	whatconflicts [-A] [pkgname|pat]+
	whatreplaces [-A] [pkgname|pat]+

Options:
	-A 			Query all packages not just those installed
	-V[<level>] 		Set verbosity level to <level>.
	--verbosity[=<level>] 	Verbosity levels:
					0 errors only
					1 normal messages (default)
					2 informative messages
					3 debug
					4 debug level 2
	-f <conf_file> 		Use <conf_file> as the opkg configuration file
	--conf <conf_file>
	--cache <directory> 	Use a package cache
	-d <dest_name> 		Use <dest_name> as the the root directory for
	--dest <dest_name> 	package installation, removal, upgrading.
				<dest_name> should be a defined dest name from
				the configuration file, (but can also be a
				directory name in a pinch).
	-o <dir> 		 Use <dir> as the root directory for
	--offline-root <dir> 	 offline installation of packages.
	--add-arch <arch>:<prio> Register architecture with given priority
	--add-dest <name>:<path> Register destination with given path
	
Force Options:
	--force-depends		Install/remove despite failed dependencies
	--force-maintainer	Overwrite preexisting config files
	--force-reinstall	Reinstall package(s)
	--force-overwrite	Overwrite files from other package(s)
	--force-downgrade	Allow opkg to downgrade packages
	--force-space		Disable free space checks
	--force-postinstall	Run postinstall scripts even in offline mode
	--force-remove		Remove package even if prerm script fails
	--force-checksum	Don't fail on checksum mismatches
	--noaction		No action -- test only
	--download-only		No action -- download only
	--nodeps		Do not follow dependencies
	--nocase		Perform case insensitive pattern matching
	--size			Print package size when listing available packages
	--force-removal-of-dependent-packages
				Remove package and all dependencies
	--autoremove		Remove packages that were installed
				automatically to satisfy dependencies
	-t			Specify tmp-dir.
	--tmp-dir		Specify tmp-dir.
	-l			Specify lists-dir.
	--lists-dir		Specify lists-dir.

 regexp could be something like 'pkgname*' '*file*' or similar
 e.g. opkg info 'libstd*' or opkg search '*libop*' or opkg remove 'libncur*'