As we are all aware by now, Raspbian released their latest version named Stretch a few days ago on August 16th, 2017. So this weekend, when I was about to start a new project, I went to the Raspbian download page and downloaded a new image of Raspbian Stretch Lite. While I waited on the download I skimmed the release notes, which unfortunately fail to mention an important change to the new operating system version: Predictable Network Interface Names.
Once I finished downloading and the image was written to the SD card, I proceeded to do the initial set-up of the Pi for this particular project, which in this case included setting a static IP address. As usual, I opened /etc/dhcpcd.conf and edited the file with the IP information for eth0. After rebooting, I was surprised to find that I was still issued the same dhcp address instead of the static ip address I specified. After over an hour of troubleshooting and searching through forums, I finally found my problem: my network interface is no longer named eth0. This should have been evident after my first ifconfig, but since I wasn't expecting a change to the interface name, my eyes just skimmed over that information and went straight to the ip address. I'm hoping that by publishing this I can save someone else the same frustration and waste of time.
Predictable Network Interface Names are not new, but prior to Stretch they were not used by default in Raspbian. The new naming scheme no longer uses the traditional interface names such as eth0, eth1, wlan0, etc, and instead uses hardware address based names to avoid ambiguity and prevent the accidental changing of interface names. On the Raspberry Pi, since the Ethernet interface is connected through the usb bus, the mac address is used to identify the interface. Specifically, the interface names will start with "en" for Ethernet or "wl" for wireless, followed by an "x" to indicate that it will be followed by the mac address, and then predictably the mac address. For example, if an Ethernet port has a mac address of b827eb123456, then the interface name will be enxb827eb123456. It is straight forward enough, but if you weren't aware of the change, it could certainly catch you off guard, and leave you wondering why configuring eth0 has no effect on the configuration of your Ethernet port.
In order to find the new name of your interface, simply use ifconfig and check the available interfaces. If you would rather not use the new naming scheme, you can revert to the old naming scheme by adding net.ifnames=0 to /boot/cmdline.txt. However, this is quickly becoming the new normal, as more and more Linux distributions switch to using predictable network interface names, so I highly recommend sticking with and getting used to using the new naming scheme, as it will soon be ubiquitous.
Here is a link to the forum post where I found the initial information regarding Raspbian Stretch and the change to predictable network interface names.
EDIT: Apparently the interface names are only affected on new installations of Stretch, and not on systems that are upgraded from Jessie to Stretch. I assume the reason for this is so that every system with a static IP that gets upgraded to Stretch won't immediately lose their static IP.
EDIT: As of the latest version of Raspbian Stretch, released on Nov 29th, 2017, Raspbian no longer defaults to using Predictable Network Interface Names. Instead it uses the old naming scheme of eth0, wlan0, etc. They have also added a new option to raspi-config to allow you turn on Predictable Network Interface Names if you would prefer to use the new naming scheme.