Remove message “Waiting for network configuration…” on ubuntu

On ubuntu, if your system boots without network in failsafe mode, it will wait a long time for network to be available. In many case, this won’t help much…

Moreover, if you’re trying to do things like kernel compiling and for some reason you can’t see the boot log (including this “Waiting for network configuration” message), you’ll have the impression of being stuck with a bad kernel, but in fact it is just waiting 120 seconds…

Just edit the file sudo vi /etc/init/failsafe.conf and remove all “sleep” instructions. The message will be displayed but it won’t wait any time.

To repair you network problems, you might want to check this post and this post.


HDParm is a tool to manage your drives. The first section show you how to get informations about your drives, the second tells you how to make them sleep when they aren’t used (and so make power economy). If you’ve got a home server like me with the system on a SSD, with only your big files on the hard drives(s), you’ll want to do this.


Get disk informations

You’ve got to use “sudo” to gain super user privilege. Your disk are in the /dev/ folder, named sd* where “*” is a letter. To see the list of disk, one can type use “ls /dev/sd[a-z]“:
debserver % ls /dev/sd[a-z]
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde


To display informations about one disk, you can use “sudo hdparm -i”


debserver % sudo hdparm -i /dev/sda

Model=WDC WD20EFRX-68EUZN0, FwRev=80.00A80, SerialNo=WD-WCC4M1067803
Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=3907029168
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=no WriteCache=enabled
Drive conforms to: Unspecified: ATA/ATAPI-1,2,3,4,5,6,7

* signifies the current active mode


Make a drive sleep after some time

From the manual (man hdparm on the command line):

-S Set the standby (spindown) timeout for the drive. This value is used by the drive to determine how long to wait (with no disk activity) before turning off the spindle motor to save power. Under such circumstances, the drive may take as long as 30 seconds to respond to a subsequent disk access, though most drives are much quicker. The encoding of the timeout value is somewhat peculiar. A value of zero means "timeouts are disabled": the device will not automatically enter standby mode. Values from 1 to 240 specify multiples of 5 seconds, yielding timeouts from 5 seconds to 20 minutes. Values from 241 to 251 specify from 1 to 11 units of 30 minutes, yielding timeouts from 30 minutes to 5.5 hours. A value of 252 signifies a timeout of 21 minutes. A value of 253 sets a vendor-defined timeout period between 8 and 12 hours, and the value 254 is reserved. 255 is interpreted as 21 minutes plus 15 seconds. Note that some older drives may have very different interpretations of these values.


So “sudo hdparm -I /dev/sdb | grep level” will show the current spindown value, for Example:

debserver % sudo hdparm -I /dev/sdb | grep level
Advanced power management level: 254


sudo hdparm -S 25 /dev/sdb = spindown after 25*5 seconds.

sudo hdparm -S 245 /dev/sdb = spindown after (245-240)*30 minutes.


If you want to check the state to see if it works :

sudo watch -n 1 "hdparm -C /dev/sdb && hdparm -C /dev/sdc && hdparm -C /dev/sdd && hdparm -C /dev/sde"


You can use /etc/hdparm.conf to make it permanent:
/dev/sdb {
spindown_time = 60



Ugly things : Autologin of console at startup

→ Ugly but okay in a development virtual machine…

Add “– – autologin root” at the end of /etc/init/tty1.conf

It will auto-log you as root for the first console. For the others, do the same with /etc/init/tty[1-5].conf

You can autolog as “student” by replacing root by student. It’s a little safer … but still ugly.

How to debug at boot time

If all you get is a black screen when booting, boot in recovery mode to see a little more information :


When you are in the grub menu, choose the “recovery” version

If there is none or if it’s still black type “e” in the grub menu over the kernel entry you want. Find the line starting by linux, and add “ro single recovery” at the end.
Type F10 to boot.


Grub normally have a “Previous versions” menu to allow you to boot with the ubuntu default kernel…


In fact if you get a black screen when booting, chances is that you’re missing some modules. But you can get more:

  • Add a serial device to your virtualbox, select “file” mode, with e.g. /tmp/vbox-jerry
  • run tail -f /tmp/vbox-jerry on your machine to watch that log file,
  • before booting, press e to edit the config and add at the tail of the command line ” console=ttyS0,57600″
  • this will work only for boot time, when syslogd will start, the log will go to /var/log/syslog
  • You can use the /etc/default/grub file like for the screen size (see slides of info0940) to make it permanent

A network problem during boot may stall you for 120 seconds, with or without a black screen ! So wait a little !

Detecting if another user is connected on UNIX systems

How to detect if another user is connected to your machine or your server? You can use the command “users” to check yourself is someone is connected. But to do it automatically, you’ll have to use some pipe :

expr length "`users | sed -e "s/\($USER\|\[ \]*\)//ig"`"

The first thing executed by the shell will be the thing under french apostrophe ( ` ). Theses are for evaluation a command, and replace it by what it outputs (normally print on the screen). The command users print the list of connected users into a pipe, to sed which evaluate its command as a regular expression (-e parameter). The command is “s” for substitute, and the rest tells him to find “$USER” (replaced by the currently connected user, you) and spaces and replace them by … nothing. So this part will be an empty string if there is no other users connected than “$USER” and something not empty if there is.

The “expr length” return the length of a string. So this commands print 0 if there is no other user connected, and >0 if there is some !

In a shell script to do something if yes or no…

usersstripped=`users | sed -e "s/\(tom\|\[ \]*\)//ig"`
connected=`expr length "$usersstripped"`
if [ "$connected" -eq "0" ] ; then
echo "No other user is connected"
echo "Other user connected !"

It is essentially the same command but done in two times, as in a shell script this command would not be evaluated correctly.

And if you want to put that in a cron to eg. send you a mail, you just have to type “crontab -e” and put a line like :

* * * * * /home/tom/connected

To launch it every minutes. But if you do that you’d better do something like detecting a connection…


To gain a lot of time, you can replace the old “bash” by “zsh”, which is a very more powerful shell with autocompletion, but not only… It has a configuration file called “.zshrc” that you have to put in your home. You can try zsh by installing it and typing “zsh”, and if you’re convinced, keeping it by typing chsh and choosing /bin/zsh.

You have my entire .zshrc but I choose 3 snippets that I prefer to show you the usefullness :

As I use Fedora, Debian, and Ubuntu, I made this to type “i program” to install profram on any system, and “u” to update the system. 

#i for install, u for update

if [ -e /bin/yum ]; then
alias i="sudo yum install"
alias u="sudo yum update"
alias i="sudo apt-get install"
alias u="sudo apt-get update && sudo apt-get dist-upgrade"

Force sudo for commands that anyway need it

alias yum="sudo yum"
alias apt-get="sudo apt-get"
alias service="sudo service"


Setting vi as default editor :

export EDITOR="vi"


The multiples ssh shorcuts

alias sshd="ssh -X"
alias sshc="ssh -X -L 3129:localhost:3129"

I use my zshrc on multiple system and multiple environment, hence you have some tricks and multiplications like different variables for the same program in the path variable.

#Using color schemes
autoload -U colors && colors

#Adding ADB to path variable
export PATH=${PATH}:/usr/src/android-sdk-linux/platform-tools/:/usr/src/android-sdk-linux/tools/:/opt/android/platform-tols/

# Aliases
#SSH shorcuts
alias sshd="ssh -X"
alias sshc="ssh -X -L 3129:localhost:3129"
alias ssha="ssh -X"
alias sshu="ssh -X"
alias sshq="ssh -X"
alias scpi="scp -i /home/tom/.ssh/id_rsa"
alias scp3="scp -P 3690 -i /home/tom/.ssh/id_rsa"
alias sam="ssh-add /home/tom/.ssh/id_rsa.montefiore"

#I have all my usefull scripts on my server itstudents, this alias update all scripts on a client, including this .zshrc
alias us="mkdir -p /home/tom/.scripts && scpi /home/tom/.ssh/authorized_keys && scpi /home/tom/.zshrc && scpi -r /home/tom/ && source /home/tom/.zshrc"

#Alias for these scripts...
#Archiver pack a folder in tar.gz
alias archiver="/home/tom/.scripts/archiver"
#Archiver7 pack a folder in a tar.7z
alias archiver7="/home/tom/.scripts/archiver7"
#Update and reset permissions of an svn
alias svnup="/home/tom/.scripts/svnup"
#Push an rsa key to the list of authorized keys
alias pushrsa="ssh \"cat - >> /home/tom/.ssh/authorized_keys\" < "

#Mount some local shares
alias mh="sudo mount -t nfs debserver:/home/tom /mnt/debserver-home"
alias mp="sudo mount -t nfs debserver:/pub /mnt/debserver-pub"

#Force sudo for some sudo-only commands like installers
alias yum="sudo yum"
alias apt-get="sudo apt-get"
alias service="sudo service"

#Some copy-pasted shorcut from elsewhere
alias k='tree'
alias ltr='ls -ltr'
alias r='screen -D -R'
alias ls='ls --color'
alias l='ls -lh'
alias ll='ls -la'
#i for install, u for update
if [ -e /bin/yum ]; then
alias i="sudo yum install"
alias u="sudo yum update"
alias i="sudo apt-get install"
alias u="sudo apt-get update && sudo apt-get dist-upgrade"

#Some links to launch programs on my android devices
alias adbf="ard && adb forward tcp:8999 tcp:8999 && google-chrome http://localhost:8999 &"
alias agmail="adb shell am start -a android.intent.action.MAIN -n"
alias amail="adb shell am start -a android.intent.action.MAIN -n"
alias ard="adb shell am start -a android.intent.action.MAIN -n net.xdevelop.rm/.RemoteMobile"
alias rr="sudo route del default && sudo route add default gw"

#Wake on lan shorcuts
alias wdebian="sudo etherwake 8C:89:A5:C1:D2:8A"



# Meta-u to chdir to the parent directory
bindkey -s '\eu' '^Ucd ..; ls^M'

bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
bindkey '\e[7~' beginning-of-line
bindkey '\e[8~' end-of-line
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
bindkey '\e[H' beginning-of-line
bindkey '\e[F' end-of-line
bindkey '\e[5~' beginning-of-history
bindkey '\e[6~' end-of-history
bindkey '\e[3~' delete-char

#Enable auto correct for commands
setopt correct

# Pipe the current command through less
bindkey -s "\el" " 2>&1|less^M"
zstyle ':completion:*:(all-|)files' ignored-patterns '(|*/)CVS'
zstyle ':completion:*:cd:*' ignored-patterns '(*/)#CVS'

#Mode verbose pour cp, rm, chmod, chown et rename
for c in cp rm chmod chown rename; do
alias $c="$c -v"

#Pendunt une complétion affiche les points
expand-or-complete-with-dots() {
echo -n "\e[31m......\e[0m"
zle expand-or-complete
zle redisplay
zle -N expand-or-complete-with-dots
bindkey "^I" expand-or-complete-with-dots

setopt NO_BEEP
export EDITOR="vi"
setopt ZLE
setopt AUTO_CD

# Completion Stuff
bindkey -M viins '\C-i' complete-word

# Faster! (?)
zstyle ':completion::complete:*' use-cache 1
# generate descriptions with magic.
zstyle ':completion:*' auto-description 'specify: %d'

# Don't prompt for a huge list, page it!
zstyle ':completion:*:default' list-prompt '%S%M matches%s'

# Don't prompt for a huge list, menu it!
zstyle ':completion:*:default' menu 'select=0'

# Have the newer files last so I see them first
zstyle ':completion:*' file-sort modification reverse

# color code completion!!!! Wohoo!
zstyle ':completion:*' list-colors "=(#b) #([0-9]#)*=36=31"


# Separate man page sections. Neat.
zstyle ':completion:*:manuals' separate-sections true

# Egomaniac!
zstyle ':completion:*' list-separator 'fREW'

# complete with a menu for xwindow ids
zstyle ':completion:*:windows' menu on=0
zstyle ':completion:*:expand:*' tag-order all-expansions

# more errors allowed for large words and fewer for small words
zstyle ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) )'

# Errors format
zstyle ':completion:*:corrections' format '%B%d (errors %e)%b'

# Don't complete stuff already on the line
zstyle ':completion::*:(rm|vi):*' ignore-line true

# Don't complete directory we are already in (../here)
zstyle ':completion:*' ignore-parents parent pwd

zstyle ':completion::approximate*:*' prefix-needed false


export GREP_COLOR=31
alias grep='grep --color=auto'

#{{{ Prompt!

jobs_total="%(1j.${jobs_prompt1}${jobs_prompt2}${jobs_prompt3} .)"
error_total="%(?..${error_prompt1}${error_prompt2}${error_prompt3} )"

case "$TERM" in
function precmd() { print -Pn "\033]0;S $TTY:t{%100<...<%~%<<}\007" }
directory_prompt="%{$fg[$directory_color]%}%~%{$reset_color%} "
directory_prompt="%{$fg[$directory_color]%}%~%{$reset_color%} "

if [[ $USER == root ]]; then
PS1="${host_prompt} ${jobs_total}${history_total} ${error_total}${post_prompt} "
RPROMPT="%{$fg_bold[$user_color]%}<%{$reset_color%} ${directory_prompt}${fg_light_gray}[%*]%{$reset_color%}"
#Type f to flush the console to history file
alias f="fc -W"



#Append to history file instead of re-writing

#To share history between terminal, not what I want as I always have multiple terminals like one for generating packet, the other to receive them

#Remove blanks
setopt hist_reduce_blanks
#Remove duplicates
setopt hist_ignore_all_dups
#Do not store commands in history starting with white space
setopt hist_ignore_space

autoload -U compinit promptinit zcalc zsh-mime-setup