It’s pretty important for me to be able to do Linux things in a Windows environment, but I shouldn’t have to install Apple software (notably Bonjour Print Services) to access a Debian-based Linux server by its host name. This write-up will discuss exactly which packages I install — and in what order — to prepare a Linux virtual machine for getting serious work done on a Windows PC.
As a preface, we will be using a minimal Debian installation via the Debian Netinst disc image found here. We will be installing Debian to an Oracle VirtualBox Virtual Machine, their software can be downloaded from their official site located here. Upon booting from the optical media, I prefer selecting the graphical expert install option from the list of menu options. Please note that we will be opting out of installing a desktop environment and that we will be doing everything from the root user in a command-line interface, so no “sudo” commands will be issued.
The first order of business is to prepare SSH connectivity. If you forget to install the SSH server via the expert install, you can issue these commands to set up what you need:
# apt-get install openssh-server
# apt-get install openssh-client
Because I know that this VM will only ever be used in a development environment locally, I like to enable signing in as root
with a password. For that, you have to enable the option and alter the default configuration:
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# nano /etc/ssh/sshd_config
It’s always in good measure to make back-up copies. Proceed to edit the sshd_config
file and find the line beginning with #PermitRootLogin
and ensure its value is “yes”. This will require removing the hash symbol at the beginning of the line if there is one.
# The file at /etc/ssh/sshd_config
...
PermitRootLogin yes
...
Save your changes by issuing the keyboard shortcut ^O
(a combination of the Control key and O), pressing Enter
to confirm its file destination, and then finally, issuing ^X
to exit the Nano editor. From this point on, assume that all instructions regarding keyboard shortcuts expect you to know ^
refers to a keyboard shortcut of Control
(or Ctrl
) and the following letter.
I prefer to get all of my serious work done via PuTTY, so it’s important we are able to quickly access our virtual machine by its host name in Windows. To do that, we are going to need to turn off our virtual machine (the correct way) by issuing shutdown now
from the command line and changing how our virtual machine’s network adapter works:
By default, our network adapter is set to NAT
, or Network Address Translation. We want to set this to Bridged Adapter
. This effectively attaches our VM to the local area network our host Windows PC is connected to, as if it were another device connected to our wireless router.
Go ahead and confirm your changes, boot the Debian virtual machine, and sign in as root
. From here, we are going to be installing a key package that makes this host name magic work and we will ensure it is working correctly. From the command line (and assuming your VM and host PC is connected to the Internet), issue:
# apt-get update
# apt-get install llmnrd
This will install the Link-Local Multicast Name Resolution daemon. This is essentially a background service that periodically notifies other Windows machines on the network of its “Windows” host name and local IP address. Follow that by issuing:
# hostname debian-vm
Where debian-vm
is your desired virtual machine’s host name. You will also need to issue nano /etc/hostname
and change the text in that file to match your specified host name. The contents of the file in this case should only read debian-vm
. Save the file with ^O
, confirm the file name with Enter
, and then leave the editor with ^X
. You will then want to reboot the VM by issuing a reboot
command at the prompt.
You should then be able to ping your Debian virtual machine from your Windows command prompt. Disregard the conner-i8550u-vm-debian-002
name for this example and assume that it’s debian-vm
and that you should be able to ping the machine with success.
I should start off by mentioning that what we will be doing is considered a huge no-no for a server administrator to be doing to a live Linux server attached to the Internet containing access to sensitive data. This write-up is geared only towards development environments where you are absolutely confident that uninvited individuals do not have network access to this VM.
I will continue by recommending a quick installation of Samba, the star of our show, that will enable us to use our favorite Windows software to modify files that exist on our Debian VM. You can install Samba by issuing:
# apt-get install samba
This will install the background service that negotiates file sharing within the Windows Explorer (and other SMB-protocol capable file sharing software) so that our lives can be that much easier.
We are going to need to modify the Samba configuration to meet our needs. To do that, edit the file at /etc/samba/smb.conf
and have it read:
[global]
workgroup = WORKGROUP
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
server role = standalone server
passdb backend = tdbsam
obey pam restrictions = yes
unix password sync = yes
pam password change = yes
map to guest = bad user
usershare allow guests = yes
[System Root]
comment = Root Directory
path = /
valid users = root
force user = root
force group = root
browseable = yes
writeable = yes
public = yes
create mask = 0777
directory mask = 0777
[Web Root]
comment = Web Root Directory
path = /var/www
valid users = root
force user = www-data
force group = www-data
browseable = yes
writeable = yes
public = yes
create mask = 0777
directory mask = 0777
This configuration assumes you already have a web server installed and actively serving content from /var/www
. I will not cover how to install and configure Apache completely, but the least I can do is suggest that you run apt-get install apache2
from the command line.
A quick way to make these changes is to issue cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
and rm /etc/samba/smb.conf
so that we can copy and paste the contents above into a brand-new, empty file made with touch /etc/samba/smb.conf
. Using PuTTY will allow you to paste the contents in by right-clicking on the terminal window, otherwise, you might be stuck typing this in by hand in the Oracle VirtualBox VM window.
There are two .ini-like sections to this file I would like to explain line-by-line that are essential to understanding why Samba is desirable in this scenario, and not SFTP transfers alone. See [Web Root]
:
The problem I have come across with actively writing PHP software in the /var/www
directory is that files created and saved by root
are potentially inaccessible to the www-data
user, which is the default user Apache uses to read, write, and access the scripts. If you save source code as any other user and fail to subsequently update the permissions, users accessing the script via HTTP may be presented with a 403 Forbidden response.
By adding the section [Web Root]
, we are telling Samba to create a share called “Web Root”. Everything we modify via this share will be done so as the www-data
user (and group), denoted by the lines:
force user = www-data
force group = www-data
Meaning that if we were to create a new text document from the Windows Explorer, the file would effectively be owned by www-data
and its group, thus accessible by the Apache web server. It’s actually unnecessary to have the create mask
and directory mask
both set to 0777
, however, this just ensures that every Debian user has full access to these files. Considering we are doing all of our work as root, we should not be concerned. The options browseable
, writeable
, and public
all set to yes
just ensures that the share: is visible to the Windows Explorer via \\debian-vm
in the address bar, able to be written to, and accessed by all of our Windows users.
What’s important is the valid users = root
line. This enforces our share to only be accessible by a Samba user by the name of root
. This can be anything you like, but you are required to add this user via the command line:
# smbpasswd -a root
Issuing this command will ask you for a new password, twice for verification. You will then be told that the user has been added. These are the login credentials you will need to use from within Windows (and other SMB-equipped file sharing software).
When you access this share specifically as root
, you will effectively be working as the Debian user www-data
. Just make sure that www-data
has access to write to the /var/www
folder from within Debian. I like to do this by issuing:
# chown -R www-data:www-data /var/www
The above command recursively assigns /var/www
and all of its contents to the www-data
user (and group).
Ignore the host name of zero
for now and assume it’s debian-vm
. This example was taken from my Raspberry Pi Zero W, and it has already been through this process. For those who are wondering, this entire process works on a Raspberry Pi, as its “Raspbian” distribution is essentially a fork of Debian.
As we can see, opening up a directory from within Sublime Text 3 allows us to work on and develop contents in our Debian machine’s /var/www
folder with ease and style.
Although the setup is long and tedious, this will dramatically save time (and headache) in our existing Windows workflow.