Some weeks ago I’ve ordered a so called “Plug Computer”.Image may be NSFW.
Clik here to view.
These Computers are very small devices with an ARM SoC.
They are pretty cheap! I’ve got my PogoplugV2 for 10€ Image may be NSFW.
Clik here to view.
I was lucky and got the gray version Image may be NSFW.
Clik here to view.
Some device info:
- ARMv5te CPU (Marvell Kirkwood 1.2GHz)
- 256MB RAM
- 128MB NAND
- 4 USB 2.0 Ports
Pretty great to use this device as a small homeserver/fileserver. Remember 10€!
I want to use my Pogoplug as a fileserver (for Windows PCs) and DLNA server to stream to my TV.
On top of that maybe some additional stuff in the feature Image may be NSFW.
Clik here to view.
But the default software sucks. No Samba support, no DLNA, no FTP, …
But this doesn’t matter because there is an Arch Linux for ARM Port.
This is an instruction how to install Arch Linux on a PogoplugV2.
Everything after the Arch Linux installation (Install Webmin, Samba, DLNA, …) can be used for all devices which run Arch Linux for ARM.
Prepare device and install Arch Linux
Image may be NSFW.
Clik here to view.
Everything we have to do to install Arch Linux are 4 steps.
- Enabe SSH Access
- Format an USB Stick (min. 2GB size)
- Flash a custom Bootloader to boot from your USB Stick
- Install Arch Linux
An instruction how to do that is available here: http://archlinuxarm.org/platforms/armv5/pogoplug-v2-pinkgray
There are instuctions for other devices as well.
If you use Windows use PuTTY as a SSH client.
Setup everything
1. Login via SSH
Use PuTTY or another SSH client to access your Pogoplug.
username: root
password: root
2. Change your root password
First you should change your root password.
Use the following command to do so:
passwd root
3. Update Arch Linux
Arch Linux has an own package manager called pacman.
With pacman you can install/remove packages and update Arch Linux.
To update Arch Linux use the following command:
pacman -Syu
4. Change hostname and timezone
Note: For GUI lovers: skip this step and set hostname and timezone in the webmin interface (next step)
The default hostname is “alarm”. Let’s change it!
hostnamectl set-hostname myhostname
To get all available timezones use:
timedatectl list-timezones
And to set your timezone:
timedatectl set-timezone <Zone>/<SubZone>
For example:
timedatectl set-timezone Europe/Berlin
Now reboot:
reboot
Wait a few seconds and reconnect to SSH.
5. Install Webmin
Webmin is a pretty cool web-based interface for system administration.
It’s easy to use and will help you to configure stuff faster.
To install it use:
pacman -Sy webmin perl-net-ssleay
Now we have to allow access from more IP addresses.
You have to edit the configuration file.
nano /etc/webmin/miniserv.conf
Find the following line: allow=127.0.0.1
Now add a new allow line with your local network broadcast ip or a specific ip and save the file.
For example:
allow=127.0.0.1 ## Allow local access allow=192.168.0.0 ## Allows all users from 192.168.0.1 - 192.168.0.255
Now we’ll enable & start the webmin service so it autostarts.
systemctl enable webmin systemctl start webmin
To access the Webmin interface open a browser and go to:
https://deviceip:10000
To lower memory usage go to:
Webmin>Webmin Configuration>Advanced Configuration and disable “Pre-load Webmin functions library?”
6. USB Auto Mount
If you want to remove your USB HDD and use it anywhere else it would be cool to have automounting like Windows.
There are a lot of auto mounting mechanisms for Arch Linux but a lot of them are outdated.
This one is using udevil to auto mount all USB HDDs on attach.
pacman -Sy udevil
I want to access my HDDs via Samba to use them in Windows so I have to use either FAT32 or NTFS.
This sucks because FAT32 isn’t able to handle files >4GB so it’s useless.
And NTFS is fucking slow on Linux.
But with some special mount options we are able to increase the speed dramatically!
I’ve did some benchmarks with hdparm and dd before and after the optimization.
The read speed was pretty good already (about 29MB/s –> USB 2.0 limit).
But the write speed was really bad!
Before: ~6,5 MB/s write speed
After: ~28,5 MB/s write speed
As you can see the write speed on NTFS was really slow before. But there is a way to fix it Image may be NSFW.
Clik here to view.
We have to edit the mount options and add a special ntfs-3g option to our udevil automount settings.
Open the udevil config file and edit it:
nano /etc/udevil/udevil.conf
Search for default_options_ntfs= and allowed_options=
Now we add the option “big_writes” to both lines so it looks like:
..., noatime, big_writes, uid=...
Save the file.
Create the /media directory
mkdir /media
Add the udevil service to autostart.
systemctl enable devmon@root
Let’s reboot to see whether it works
reboot
Wait a few seconds and reconnect to SSH.
Now you’ll have a new folder: /media/yourHDDname where your HDD is mounted.
And you should see something like /dev/sdX1 on /media/… if you type:
mount
Note: All USB HDDs should go to standby automatically.
You can check with:
hdparm -C /dev/sda
7. Blink LED to HDD activity
The PogoplugV2 has a green and orange LED.
So I thought it would be a cool idea change the color to HDD activity.
I’ve created an systemd service.
———————————
Only If you have a PogoplugV2!
You have to correct your arcNumber and matchid because there is a bug in the current uboot and your Pogoplug isn’t detected as a PogoplugV2.
pacman -Sy uboot-env fw_setenv arcNumber 3542 fw_setenv machid dd6 reboot
———————————
We need the iostat binary to create our own deamon.
Iostat will check hdd activity.
pacman -Sy sysstat
Create a new file called /usr/lib/systemd/system/blinkled.service with the following content:
[Unit] Description=Blink LED if hard drive is active daemon [Service] Type=oneshot ExecStart=/usr/local/bin/blinkled ExecStop=/usr/bin/killall iostat RemainAfterExit=true [Install] WantedBy=multi-user.target
Create another file called /usr/local/bin/blinkled
This command is pretty long Image may be NSFW.
Clik here to view. It will execute iostat every 3 seconds. If there is HDD activity the Pogoplug will start to blink orange.
You can change heartbeat to default-on or timer as well.
#!/bin/bash /usr/bin/iostat -z -d 3 | /usr/bin/sed -u -e '1d' -e 's/Device.*/none/' -e 's/sd.*/heartbeat/' -e '/^$/d' > /sys/class/leds/status\:orange\:fault/trigger &
And make it executable
chmod u+x /usr/local/bin/blinkled
To start our service use:
systemctl start blinkled
To autostart use:
systemctl enable blinkled
8. Update Kernel to >3.2
Warning: This specific instruction works for PogoplugV2 only!
You can brick your device!
The current kernel for PogoplugV2 is 3.1.x but 3.8.x or newer is available.
You have to update manually because newer kernels need a new uboot.
You need the newest uboot to boot Kernels >3.2 so you have to install it before:
If this is a fresh installation you probably have the newest uboot already and you don’t have to do that!
cd /tmp wget http://jeff.doozan.com/debian/uboot/install_uboot_mtd0.sh chmod +x install_uboot_mtd0.sh ./install_uboot_mtd0.sh
Then you have to correct your arcNumber and matchid if you didn’t follow “Blink LED to HDD activity”.
pacman -Sy uboot-env fw_setenv arcNumber 3542 fw_setenv machid dd6 reboot
Now you can install the new Kernel files with:
pacman -Sy linux-kirkwood linux-headers-kirkwood reboot
9. Install Samba
10. Install MiniDLNA
Install MiniDLNA and enable the service.
pacman -Sy minidlna systemctl enable minidlna
Now edit the config file
nano /etc/minidlna.conf
It’s pretty easy to understand the config file and the documentation is well.
You have to set at least one media_dir
All USB devices are mounted at /media/DEVICE_LABEL
For example:
media_dir=V,/media/zincobi/Videos
Here are some additional options you could set:
friendly_name=POGOPLUG DLNA Server db_dir=/var/cache/minidlna log_dir=/var/log presentation_url=http://YOUR_DEVICE_IP_HERE:8200/
MiniDLNA will update the DB automatically.
If you have a lot of files (>8192) you should increase your max inotify value for a single user so MiniDLNA can watch all files.
sysctl fs.inotify.max_user_watches=100000
MiniDLNA is able to use thumbnails or cover images.
I’ve created a small bash script which will generate thumbnails for videos recursively.
You need ffmpegthumbnailer to create these thumbnails.
pacman -Sy ffmpegthumbnailer
Let’s create the script:
nano /usr/local/bin/generateThumbs.sh
This script will generate a thumb.jpg for every video file recursively.
You can add even more extensions to the TYPES array.
DIR=$1 TYPES=( mov mp4 avi mkv m4v xvid divx wmv mpg mpeg ) # Create a regex of the extensions for the find command TYPES_RE="\\("${TYPES[1]} for t in "${TYPES[@]:1:${#TYPES[*]}}"; do TYPES_RE="${TYPES_RE}\\|${t}" done TYPES_RE="${TYPES_RE}\\)" find $DIR -regex ".*\.${TYPES_RE}" -type f | while read FILEPATH do echo "--- Start Thumbnailcreation ---" echo "$FILEPATH" THUMBFILE=$(dirname "$FILEPATH")/thumb.jpg if [ -e "$THUMBFILE" ] then echo ""$THUMBFILE" exists" else ffmpegthumbnailer -i "$FILEPATH" -o "$THUMBFILE" -s 160 -q 10 echo "$THUMBFILE" fi echo "--- End Thumbnailcreation ---" done
Make it executable:
chmod u+x /usr/local/bin/generateThumbs.sh
Execute it with something like:
generateThumbs.sh /media/YOURDEVICELABEL/Videos
Now start MiniDLNA
systemctl start minidlna
11. Install FTP (vsftpd)
… comming soon …
12. Configure static IP
Be careful you can mess up your whole network connection!
I don’t like dynamic IP addresses in my LAN. Especially for servers.
They should have a static IP like every server. Of course there are hostnames but not all devices are able to resolve them.
Arch uses netcfg to configure your network adapters. You can create multiple profile.
To create a new static ip profile create a new profile in /etc/network.d/ named wired-static-eth0
nano /etc/network.d/wired-static-eth0
And add the following content, replace everything with your values and save the file.
Note: I use custom DNS settings because my router doesn’t allow me to edit DNS settings.
CONNECTION='ethernet' DESCRIPTION='A basic static ethernet connection using iproute' INTERFACE='eth0' IP='static' #IP of your pogoplug ADDR='192.168.0.2' #ROUTES=('192.168.0.0/24 via 192.168.1.2') #Gateway (For example your router) GATEWAY='192.168.0.1' #DNS set to ('Gateway IP') if you want to use the DNS your router provides DNS=('8.8.8.8' '8.8.4.4') ## For IPv6 autoconfiguration #IP6=stateless ## For IPv6 static address configuration #IP6='static' #ADDR6=('1234:5678:9abc:def::1/64' '1234:3456::123/96') #ROUTES6=('abcd::1234') #GATEWAY6='1234:0:123::abcd'
Now you need to change the default network profile to the new one.
nano /etc/conf.d/netcfg
Find NETWORKS= and edit it:
NETWORKS=(wired-static-eth0)
You have to be sure that everything is correct otherwise you are going to loose network connection and have to edit all files from your USB stick with another PC.
Just restart the netcfg service or restart to apply the new settings
systemctl restart netcfg
13. Enable color in Bash prompt
The current terminal doesn’t look that nice. Everything is white and boring…
But we can change this so your terminal will look like this:
Image may be NSFW.
Clik here to view.
Just replace /etc/bash.bashrc with the following content:
# /etc/bash.bashrc
#
# https://wiki.archlinux.org/index.php/Color_Bash_Prompt
#
# This file is sourced by all *interactive* bash shells on startup,
# including some apparently interactive shells such as scp and rcp
# that can't tolerate any output. So make sure this doesn't display
# anything or bad things will happen !
# Test for an interactive shell. There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.
# If not running interactively, don't do anything!
[[ $- != *i* ]] && return
# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control.
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize
# Enable history appending instead of overwriting.
shopt -s histappend
case ${TERM} in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
;;
screen)
PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
;;
esac
# fortune is a simple program that displays a pseudorandom message
# from a database of quotations at logon and/or logout.
# Type: "pacman -S fortune-mod" to install it, then uncomment the
# following line:
# [[ "$PS1" ]] && /usr/bin/fortune
# Welcome Message
# Arch Linux Logo Welcome Message
c1="$(tput sgr0)$(tput setaf 4)"
c2="$(tput bold)$(tput setaf 4)"
c3="$(tput bold)$(tput setaf 7)"
echo
echo " $c2,$c1 _ _ _"
echo " $c2/$c1#$c2\\$c1 __ _ _ __ ___| |__ | (_)_ __ _ ___ __"
echo " $c2/$c1###$c2\\$c1 / _\` | '__/ __| '_ \\| | | '_ \\| | | \\ \\/ /"
echo " $c2/$c1#####$c2\\$c1 | (_| | | | (__| | | | | | | | | |_| |> <"
echo " $c2/$c1##,-,##$c2\\$c1 \\__,_|_| \\___|_| |_|_|_|_| |_|\\__,_/_/\\_\\"
echo " $c2/$c1##( )##$c2\\$c1"
echo " $c2/$c1#.-- --.#$c2\\ $c3 A simple, elegant GNU/Linux distribution."
echo " $c2/$c1\` \`$c2\\$(tput sgr0)"$'\n'
# Show date
DATE="$(tput setaf 1)[$(tput setaf 6)$(date)"
DATE="${DATE}$(tput setaf 1)]"
echo $DATE
# Show kernel info
KERNEL="$(tput setaf 1)[$(tput setaf 6)$(uname -srmn)"
KERNEL="${KERNEL}$(tput setaf 1)]"
echo "$KERNEL"$'\n'
# Reset colors
tput sgr0
# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS. Try to use the external file
# first to take advantage of user additions. Use internal bash
# globbing instead of external grep binary.
# sanitize TERM:
safe_term=${TERM//[^[:alnum:]]/?}
match_lhs=""
[[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs} ]] \
&& type -P dircolors >/dev/null \
&& match_lhs=$(dircolors --print-database)
if [[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] ; then
# we have colors Image may be NSFW.
Clik here to view.
# Enable colors for ls, etc. Prefer ~/.dir_colors
if type -P dircolors >/dev/null ; then
if [[ -f ~/.dir_colors ]] ; then
eval $(dircolors -b ~/.dir_colors)
elif [[ -f /etc/DIR_COLORS ]] ; then
eval $(dircolors -b /etc/DIR_COLORS)
fi
fi
# -- CUSTOM PS1 String START --
PS1="\[\033[0;37m\]\342\224\214\342\224\200\$([[ \$? != 0 ]] && echo \"[\[\033[0;31m\]\342\234\227\[\033[0;37m\]]\342\224\200\")[$(if [[ ${EUID} == 0 ]]; then echo '\[\033[0;31m\]\u\[\033[0;37m\]@\[\033[0;96m\]\h'; else echo '\[\033[0;33m\]\u\[\033[0;37m\]@\[\033[0;96m\]\h'; fi)\[\033[0;37m\]]\342\224\200[\[\033[0;32m\]\w\[\033[0;37m\]]\n\[\033[0;37m\]\342\224\224\342\224\200\342\224\200\076 \[\033[0m\]"
# --- Custom PS1 String END ---
# Use this other PS1 string if you want \W for root and \w for all other users:
# PS1="$(if [[ ${EUID} == 0 ]]; then echo '\[\033[01;31m\]\h\[\033[01;34m\] \W'; else echo '\[\033[01;32m\]\u@\h\[\033[01;34m\] \w'; fi) \$([[ \$? != 0 ]] && echo \"\[\033[01;31m\]:(\[\033[01;34m\] \")\$\[\033[00m\] "
alias ls="ls --color=auto"
alias dir="dir --color=auto"
alias grep="grep --colour=auto"
else
# show root@ when we do not have colors
PS1="\u@\h \w \$([[ \$? != 0 ]] && echo \":( \")\$ "
# Use this other PS1 string if you want \W for root and \w for all other users:
# PS1="\u@\h $(if [[ ${EUID} == 0 ]]; then echo '\W'; else echo '\w'; fi) \$([[ \$? != 0 ]] && echo \":( \")\$ "
fi
PS2="> "
PS3="> "
PS4="+ "
# Try to keep environment pollution down, EPA loves us.
unset safe_term match_lhs
# Try to enable the auto-completion (type: "pacman -S bash-completion" to install it).
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
# Try to enable the "Command not found" hook ("pacman -S pkgfile" to install it).
# See also: https://wiki.archlinux.org/index.php/Bash#The_.22command_not_found.22_hook
[ -r /usr/share/doc/pkgfile/command-not-found.bash ] && . /usr/share/doc/pkgfile/command-not-found.bash
And create a new file called /etc/DIR_COLORS with the following content:
# Configuration file for the color ls utility # This file goes in the /etc directory, and must be world readable. # You can copy this file to .dir_colors in your $HOME directory to override # the system defaults. # COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not # pipes. 'all' adds color characters to all output. 'none' shuts colorization # off. COLOR all # Extra command line options for ls go here. # Basically these ones are: # -F = show '/' for dirs, '*' for executables, etc. # -T 0 = don't trust tab spacing when formatting ls output. OPTIONS -F -T 0 # Below, there should be one TERM entry for each termtype that is colorizable TERM linux TERM console TERM con132x25 TERM con132x30 TERM con132x43 TERM con132x60 TERM con80x25 TERM con80x28 TERM con80x30 TERM con80x43 TERM con80x50 TERM con80x60 TERM xterm TERM vt100 TERM rxvt TERM rxvt-256color TERM rxvt-cygwin TERM rxvt-cygwin-native TERM rxvt-unicode TERM rxvt-unicode-256color TERM rxvt-unicode256 # EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) EIGHTBIT 1 # Below are the color init strings for the basic file types. A color init # string consists of one or more of the following numeric codes: # Attribute codes: # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed # Text color codes: # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white # Background color codes: # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white NORMAL 00 # global default, although everything should be something. FILE 00 # normal file DIR 01;34 # directory LINK 01;36 # symbolic link FIFO 40;33 # pipe SOCK 01;35 # socket BLK 40;33;01 # block device driver CHR 40;33;01 # character device driver # This is for files with execute permission: EXEC 01;32 # List any file extensions like '.gz' or '.tar' that you would like ls # to colorize below. Put the extension, a space, and the color init string. # (and any comments you want to add after a '#') .cmd 01;32 # executables (bright green) .exe 01;32 .com 01;32 .btm 01;32 .bat 01;32 .tar 01;31 # archives or compressed (bright red) .tgz 01;31 .arj 01;31 .taz 01;31 .lzh 01;31 .zip 01;31 .z 01;31 .Z 01;31 .gz 01;31 .jpg 01;35 # image formats .gif 01;35 .bmp 01;35 .xbm 01;35 .xpm 01;35 .tif 01;35
More information and other examples: https://wiki.archlinux.org/index.php/Color_Bash_Prompt
To search for available packages in repos if your command doesn’t exist on your current system configuration install pkgfile
pacman -Sy pkgfile pkgfile --update
14. Disable some logging to extend USB stick lifetime
Flash drives have limited number of write cycles and default linux logging will write pretty much so your USB will be destroyed pretty fast.
That’s why a swap file on your USB stick is a really bad idea!
But you can disable some logging to extend the liefetime of your USB stick.
Just edit syslog-ng.conf and disable some of the “log { source(src); filter…” lines at the end of the file.
You can comment out (add a “#” in front of the line) all lines if you want to disable everything.
nano /etc/syslog-ng/syslog-ng.conf
I’ve disabled some of them. That’s my example:
# Disable some logging #log { source(src); filter(f_acpid); destination(d_acpid); }; log { source(src); filter(f_authpriv); destination(d_authlog); }; #log { source(src); filter(f_syslog); destination(d_syslog); }; #log { source(src); filter(f_cron); destination(d_cron); }; #log { source(src); filter(f_daemon); destination(d_daemon); }; #log { source(src); filter(f_kernel); destination(d_kernel); }; #log { source(src); filter(f_lpr); destination(d_lpr); }; #log { source(src); filter(f_mail); destination(d_mail); }; #log { source(src); filter(f_news); destination(d_news); }; #log { source(src); filter(f_ppp); destination(d_ppp); }; log { source(src); filter(f_user); destination(d_user); }; #log { source(src); filter(f_uucp); destination(d_uucp); }; #log { source(src); filter(f_debug); destination(d_debug); }; #log { source(src); filter(f_messages); destination(d_messages); }; log { source(src); filter(f_err); destination(d_errors); }; log { source(src); filter(f_emergency); destination(d_console); }; #log { source(src); filter(f_everything); destination(d_everything); }; #log { source(src); filter(f_iptables); destination(d_iptables); };
On top of that you could disable logging of some servers like samba, minidlna and so on.
I don’t do that because I want to have these logs but to do so set the log path in the config files to /dev/null
TODO:
- Secure SSH (RSA Keyfile, settings)
- Swap @ HDD
- DnyDNS, OpenVPN, Owncloud, Standard pogoplug software
- FAQ