I want to add a permanent iptables rule to my new VPS, and after brief google search i was surprised that there are two places this rule can be added, that seems like identical: /etc/rc.local and /etc/init.d/rc.local. Maybe someone knows why where is two places for simple startup code to place? Is it linux flavor specific (but ubuntu has both!)? Or one of them is deprecated?

And "Run /etc/rc.local" is exactly what it does. The entirety of /etc/rc.local is:

#!/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.
#
# By default this script does nothing.
exit 0

I would guess the purpose in doing this is to provide a dead simple place to put shell commands you want run at boot, without having to deal with the stop|start service stuff, which is in /etc/init.d/rc.local.

So it is in fact a service, and can be run as such. I added a echo line to /etc/rc.local and:

»service rc.local start
hello world

However, I do not believe it is referenced by anything in upstart's /etc/init (not init.d!) directory:

This is more of a distribution specific thing. (like, you will not find different rc.local in CentOS).

Now coming to your actual question, I think adding anything inside /etc/init.d/rc.local makes it to start as a "service" whereas, anything inside /etc/rc.local would simply launch that script at boot time.

I am not really sure on why Ubuntu still maintains both of them? (Perhaps someone else might shed some light over this part !!)

This is incorrect! They are not the same script, but they are one service -- /etc/init.d/rc.local does the stop start stuff on /etc/rc.local (see my answer for more details).
–
goldilocksDec 31 '12 at 14:37

@goldilocks: Thanks for a very descriptive and thorough answer but I am not clear which part of my answer you referred to be incorrect? Saying one as a service means it can do the "start" and "stop" stuff, while the other as simply a process. Please correct me if I am making no sense here.
–
pragmaticDec 31 '12 at 19:58

1

@pragmatic Because the /etc/rc.local script is the executable process governed by the /etc/initd/rc.local script, just like (eg) /bin/syslog would be the executable process governed by /etc/initd/syslog. You say explicitly that /etc/rc.local is just a boot script, vs. /etc/initd/rc.local being a completely separate run level service.
–
goldilocksDec 31 '12 at 23:37