Packet.net has premium baremetal servers that start at $36.50 per month for a quad-core Atom C2550 with 8GB RAM and 80GB SSD, on a 1Gbps Internet connection. On the other end of the scale, there is an option for a 24-core (two Intel CPUs) system with 256GB RAM and a total of 2.8TB SSD disk space at around $1000 per month.
In this post we are trying out the most affordable baremetal server (type 0 from the list) with Ubuntu and LXD.
Starting the server is quite uneventful. Being baremetal, it takes more time than a VPS. It started, and we are SSHing into it.
$ ssh root@ip.ip.ip.ip Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.10.0-24-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@lxd:~#
Here there is some information about the booted system,
root@lxd:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.2 LTS Release: 16.04 Codename: xenial root@lxd:~#
And the CPU details,
root@lxd:~# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 77 model name : Intel(R) Atom(TM) CPU C2550 @ 2.40GHz stepping : 8 microcode : 0x122 cpu MHz : 1200.000 cache size : 1024 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes rdrand lahf_lm 3dnowprefetch epb tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms dtherm ida arat bugs : bogomips : 4800.19 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: ... omitting the other three cores ...
Let’s update the package list,
root@lxd:~# apt update Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB] Get:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease [102 kB] ...
They are using the official Ubuntu repositories instead of caching the packages with local mirrors. In retrospect, not an issue because the Internet connectivity is 1Gbps, bonded from two identical interfaces.
Let’s upgrade the packages and deal with issues. You tend to have issues with upgraded packages that complain that local configuration files are different from what they are expecting.
root@lxd:~# apt upgrade Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following packages will be upgraded: apt apt-utils base-files cloud-init gcc-5-base grub-common grub-pc grub-pc-bin grub2-common initramfs-tools initramfs-tools-bin initramfs-tools-core kmod libapparmor1 libapt-inst2.0 libapt-pkg5.0 libasn1-8-heimdal libcryptsetup4 libcups2 libdns-export162 libexpat1 libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-common libgnutls-openssl27 libgnutls30 libgraphite2-3 libgssapi3-heimdal libgtk2.0-0 libgtk2.0-bin libgtk2.0-common libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libisc-export160 libkmod2 libkrb5-26-heimdal libpython3.5 libpython3.5-minimal libpython3.5-stdlib libroken18-heimdal libstdc++6 libsystemd0 libudev1 libwind0-heimdal libxml2 logrotate mdadm ntp ntpdate open-iscsi python3-jwt python3.5 python3.5-minimal systemd systemd-sysv tcpdump udev unattended-upgrades 59 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 24.3 MB of archives. After this operation, 77.8 kB of additional disk space will be used. Do you want to continue? [Y/n] ...
First is grub, and the diff shows (now shown here) that it is a minor issue. The new version of grub.cfg changes the system to appear as Debian instead of Ubuntu. Did not investigate into this.
We are then asked where to install grub. We set to /dev/sda and hope that the server can successfully reboot. We note that instead of a 80GB SSD disk as written in the description, we got a 160GB SSD. Not bad.
Setting up cloud-init (0.7.9-233-ge586fe35-0ubuntu1~16.04.2) ... Configuration file '/etc/cloud/cloud.cfg' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** cloud.cfg (Y/I/N/O/D/Z) [default=N] ? N Progress: [ 98%] [##################################################################################.]
Still through apt upgrade, it complains for /etc/cloud/cloud.cfg. Here is the diff between the installed and packaged versions. We keep the existing file and we do not installed the new packaged generic version (will not boot).
At the end, it complains about
W: Possible missing firmware /lib/firmware/ast_dp501_fw.bin for module ast
Time to reboot the server and check if we messed it up.
root@lxd:~# shutdown -r now $ ssh root@ip.ip.ip.ip Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.10.0-24-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Last login: Tue Sep 26 15:29:58 2017 from 1.2.3.4 root@lxd:~#
We are good! Note that now it says Ubuntu 16.04.3 while before it was Ubuntu 16.04.2.
LXD is not installed by default,
root@lxd:~# apt policy lxd lxd: Installed: (none) Candidate: 2.0.10-0ubuntu1~16.04.1 Version table: 2.0.10-0ubuntu1~16.04.1 500 500 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages 2.0.0-0ubuntu4 500 500 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages
There are two versions, 2.0.0 which is the stock version released initially with Ubuntu 16.04. And 2.0.10, which is currently the latest stable version for Ubuntu 16.04. Let’s install.
root@lxd:~# apt install lxd ...
We are now ready to add the non-root user account.
root@lxd:~# adduser myusername Adding user `myusername' ... Adding new group `myusername' (1000) ... Adding new user `myusername' (1000) with group `myusername' ... Creating home directory `/home/myusername' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for myusername Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y root@lxd:~# ssh myusername@localhost Permission denied (publickey). root@lxd:~# cp -R ~/.ssh/ ~myusername/ root@lxd:~# chown -R myusername:myusername ~myusername/
We added the new username, then tested that password authentication is indeed disabled. Finally, we copied the authorized_keys file from ~root/ to the new non-root account, and adjusted the ownership of those files.
Let’s log out from the server and log in again as the new non-root account.
$ ssh myusername@ip.ip.ip.ip Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.10.0-24-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. ************************************************************************** # This system is using the EC2 Metadata Service, but does not appear to # # be running on Amazon EC2 or one of cloud-init's known platforms that # # provide a EC2 Metadata service. In the future, cloud-init may stop # # reading metadata from the EC2 Metadata Service unless the platform can # # be identified. # # # # If you are seeing this message, please file a bug against # # cloud-init at # # https://bugs.launchpad.net/cloud-init/+filebug?field.tags=dsid # # Make sure to include the cloud provider your instance is # # running on. # # # # For more information see # # https://bugs.launchpad.net/bugs/1660385 # # # # After you have filed a bug, you can disable this warning by # # launching your instance with the cloud-config below, or # # putting that content into # # /etc/cloud/cloud.cfg.d/99-ec2-datasource.cfg # # # # #cloud-config # # datasource: # # Ec2: # # strict_id: false # ************************************************************************** Disable the warnings above by: touch /home/myusername/.cloud-warnings.skip or touch /var/lib/cloud/instance/warnings/.skip myusername@lxd:~$
This issue is related to our action to keep the existing cloud.cfg after we upgraded the cloud-init package. It is something that packet.net (the provider) should deal with.
We are ready to try out LXD on packet.net.
Configuring LXD
Let’s configure LXD. First, how much free space do we have?
myusername@lxd:~$ df -h / Filesystem Size Used Avail Use% Mounted on /dev/sda3 136G 1.1G 128G 1% / myusername@lxd:~$
There is plenty of space, we are using 100GB for LXD.
We are using ZFS as the LXD storage backend, therefore,
myusername@lxd:~$ sudo apt install zfsutils-linux
Now, we set up LXD.
myusername@lxd:~$ sudo lxd init Name of the storage backend to use (dir or zfs) [default=zfs]: zfs Create a new ZFS pool (yes/no) [default=yes]? yes Name of the new ZFS pool [default=lxd]: lxd Would you like to use an existing block device (yes/no) [default=no]? no Size in GB of the new loop device (1GB minimum) [default=27]: 100 Would you like LXD to be available over the network (yes/no) [default=no]? no Do you want to configure the LXD bridge (yes/no) [default=yes]? yes LXD has been successfully configured. myusername@lxd:~$ lxc list +------+-------+------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+-------+------+------+------+-----------+ myusername@lxd:~$
Trying out LXD
Let’s create a container, install nginx and then make the web server accessible through the Internet.
myusername@lxd:~$ lxc launch ubuntu:16.04 web Creating web Retrieving image: rootfs: 100% (47.99MB/s) Starting web myusername@lxd:~$
Let’s see the details of the container, called web.
myusername@lxd:~$ lxc list --columns ns4tS +------+---------+---------------------+------------+-----------+ | NAME | STATE | IPV4 | TYPE | SNAPSHOTS | +------+---------+---------------------+------------+-----------+ | web | RUNNING | 10.253.67.97 (eth0) | PERSISTENT | 0 | +------+---------+---------------------+------------+-----------+ myusername@lxd:~$
We can see the container IP address. The parameter ns4tS simply omits the IPv6 address (‘6’) so that the table will look nice on the blog post.
Let’s enter the container and install nginx.
myusername@lxd:~$ lxc exec web -- sudo --login --user ubuntu To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. ubuntu@web:~$
We execute in the web container the whole command sudo –login –user ubuntu that gives us a login shell in the container. All Ubuntu containers have a default non-root account called ubuntu.
ubuntu@web:~$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease
…
3 packages can be upgraded. Run ‘apt list –upgradable’ to see them.
ubuntu@web:~$ sudo apt install nginx
Reading package lists… Done
…
Processing triggers for ufw (0.35-0ubuntu2) …
ubuntu@web:~$ sudo vi /var/www/html/index.nginx-debian.html
ubuntu@web:~$ logout
Before installing a package, we must update. We updated and then installed nginx. Subsequently, we touched up a bit the default HTML file to mention packet.net and LXD. Finally, we logged out from the container.
Let’s test that the web server in the container is working.
myusername@lxd:~$ curl 10.253.67.97 <!DOCTYPE html> <html> <head> <title>Welcome to nginx on Packet.net in an LXD container!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx on Packet.net in an LXD container!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> myusername@lxd:~$
The last step is to get Ubuntu to forward any Internet connections from port 80 to the container at port 80. For this, we need the public IP of the server and the private IP of the container (it’s 10.253.67.97).
myusername@lxd:~$ ifconfig bond0 Link encap:Ethernet HWaddr 0c:c4:7a:de:51:a8 inet addr:147.75.82.251 Bcast:255.255.255.255 Mask:255.255.255.254 inet6 addr: 2604:1380:2000:600::1/127 Scope:Global inet6 addr: fe80::ec4:7aff:fee5:4462/64 Scope:Link UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:144216 errors:0 dropped:0 overruns:0 frame:0 TX packets:14181 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:211518302 (211.5 MB) TX bytes:1443508 (1.4 MB)
The interface is a bond, bond0. Two 1Gbps connections are bonded together.
myusername@lxd:~$ PORT=80 PUBLIC_IP=147.75.82.251 CONTAINER_IP=10.253.67.97 sudo -E bash -c 'iptables -t nat -I PREROUTING -i bond0 -p TCP -d $PUBLIC_IP --dport $PORT -j DNAT --to-destination $CONTAINER_IP:$PORT -m comment --comment "forward to the Nginx container"' myusername@lxd:~$
Let’s test it out!
That’s it!
2 comments
1 ping
Awesome walkthrough Simos !
I’d not heard of packet.net brfore this.
Using LXD, ZFS w atom cpu & SSD drives would seem to be a great combination in regards to cost/performance..!
Brian
Author
Thanks Brian! On my TODO list is to write up something about lxd-benchmark on a packet.net server.
[…] I have already written about the baremetal servers at packet.net in September 2017, testing them with LXD. […]