Even if this tutorial includes only Linux, at least part of it may work on other UNIX like operating systems. You are free to test but as a golden rule: test it on TEST environment :).
So, what is hostid? Hostid simply prints the numeric identifier of the current host, in hex.
If you are curious what it does in detail, you can use strace command in front of it (e.g. run strace hostid).
In short, hostid takes the canonical name of the host (uname -n), greps it against /etc/hosts and the resulting ip address will transform it in hex in a bit of mixed up order. You will see below.
In our examples, we will play with docker containers and attempt to put the same host id as of the machine that runs them.
Hostid related details of a machine that runs the docker environment:
root@sonic:~# hostid a8c0160b root@sonic:~# uname -n sonic root@sonic:~# grep sonic /etc/hosts 192.168.11.22 sonic
In the following examples, we will change the host id of the docker container with the host id of the host where this container runs (details above)
Via /etc/hosts:
Will associate the canonical name with ip address in /etc/hosts file. This I do not recommend because you may need your docker container to have a different IP address. This is only for testing purpose.
Commands:
uname -n - shows the canonical name of the host
echo "192.168.11.22 8b7d80edc871" > /etc/hosts - will replace the content of the /etc/hosts file with host's ip address.
hostid - shows the hostid value
Output example:
root@1ebb82b3be22:/# hostid 11ac0300 root@1ebb82b3be22:/# uname -n 1ebb82b3be22 root@1ebb82b3be22:/# echo "192.168.11.22 1ebb82b3be22" > /etc/hosts root@1ebb82b3be22:/# hostid a8c0160b
Now this docker container have the same host id of the host.
Via /etc/hostid:
This time we will not touch the /etc/hosts file but will alter the host id by modifying the /etc/hostid file.
NOTE: when converting hex to octal, you need to put the values in reverse.
In our example, hex value of host id is "a8c0160b". So a8 = 250, c0 = 300, 16 = 26 and 0b = 13. The octal value that we will put in will be "\013\026\0300\0250".
Commands:
hostid - shows the hostid value
echo -e -n "\013\026\0300\0250" >/etc/hostid - will replace the content of /etc/hostid file with the octal output from echo command.
Output example:
root@399a2a5700a1:/# hostid 11ac0300 root@399a2a5700a1:/# uname -n 399a2a5700a1 root@399a2a5700a1:/# echo -e -n "\013\026\0300\0250" >/etc/hostid root@399a2a5700a1:/# hostid a8c0160b
So, as you can see from the examples above, it is not difficult to replicate a hostid from a host to another.
Extra stuff
You can generate the octal value for /etc/hostid also directly from the ip address.
So, as in the example above, If we would like to generate /etc/hostid from hex, the order is: 0b, 16, c0, and a8.
If we want to create a host id from 192.168.11.22, we will have the same octal value: "\013\026\0300\0250" but, as you can see, it is also in a different order: 11, 22, 192 and 168.
Decimal vs. octal for our ip address is: 192 = 300, 168 = 250, 11 = 13 and 22 = 26.
It is a bit twisted but I hope the table below will clears it up:
Decimal | Hex | Octal | Hex position from decimal in hostid output | Octal position in echo command for generation of /etc/hostid |
---|---|---|---|---|
192 | C0 | 300 | 2 | 3 |
168 | A8 | 250 | 1 | 4 |
11 | B | 13 | 4 | 1 |
22 | 16 | 26 | 3 | 2 |