Set up development environment
Index
- Hosts file on OS X
- Customize CLI commands (OS X, Raspbian)
- VirtualBox (OS X)
- soapUI
- Installing CentOS 6 in VirtualBox (OS X)
- Installing CentOS 7 in VirtualBox (OS X)
- FTP client (CentOS 6, Fedora 17)
- vsftpd FTP server (CentOS 6, Fedora 17)
- Enable FTP server on OS X 10.7
- Enable SSH (Fedora 17)
- MySQL (Fedora 17)
- Net-SNMP (CentOS)
- tcpdump (CentOS)
- Grunt (CentOS 6)
- Golang (OS X 10.7)
- LiClipse IDE for Python (OS X)
- Making bootable SD card for Raspberry (OS X)
- Configure static IP address (Raspbian Jessie)
- Raspberry remote desktop via X11 (OS X)
This article describes my working environment for development and
troubleshooting that I encountered while configuring applications.
Edit hosts file on OS X (10.5 and 10.7)
You can find hosts file on older OS X in /private/etc/hosts file (use sudo to edit).
Customize CLI commands (OS X 10.7, Raspbian)
To create a customized CLI command, eg. ll = ls -la, add the following line in .profile file in user's home directory:
alias ll="ls -la"
VirtualBox (OS X)
Free tool for virtualization. It provides some CLI options with VBoxManage app.
Check status of Virtual Machnes:
$ VBoxManage list vms
Check status of Virtual Machnes (only running):
$ VBoxManage list runningvms
Installing CentOS 6 in VirtualBox
Download the minimalistic image of CentOS 6 (CentOS-6.4-i386-minimal.iso).
Install it in VirtualBox according to the user manual (set the root password and other stuff).
The installed OS is more or less empty. There is no GUI, no network...
Enable eth0 network interface:
$ ifup eth0
Now you should have access to network (via VirtualBox NAT). To set its own IP to VM, change network adapter to 'Bridged' in VirtualBox. Try $ ping google.com
Troubleshooting: No Suitable Device Found: No Device Found for Connection 'System eth0'
This erros occurs after cloning a virtual machine or if the host hardware was
changed. Kernel cannot find find device eth0, therefore it creates new one, namely eth1.
To change eth1 back to eth0, follow the next steps:
1. First check MAC address of network adapter ($ ifconfig).
2. Open /etc/sysconfig/network-scripts/ifcfg-eth0 file and enter correct MAC address in
HWADDR parameter. Make sure you are using unique IP address. Here is my example:
DEVICE=eth0
TYPE=Ethernet
UUID=a33a1224-d0e7-4a1e-9be3-09838d7c2409
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
HWADDR=08:00:27:22:28:4C
IPADDR=192.168.1.110
PREFIX=24
GATEWAY=192.168.1.254
3. Restart network service (or reboot):
$ service network restart
4. Open the /etc/udev/rules.d/70-persistent-net.rules file and delete unused devices. You should only leave devices that you use (eth0 in this case):
# PCI device 0x8086:0x100e (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:22:28:4c",
ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
Instal Desktop Tools for CentOS (CentOS 6 in VirtualBox)
To install GUI (windows), first install X system and then Gnome desktop
$ yum groupinstall -y 'X Window System'
$ yum groupinstall -y 'Desktop'
Optionally install additional desktop tools:
$ yum groupinstall -y 'Desktop Platform'
$ yum groupinstall -y 'Graphical Administration Tools'
$ yum groupinstall -y 'Internet Browser'
$ yum groupinstall -y 'General Purpose Desktop'
$ yum groupinstall -y 'Office Suite and Productivity'
$ yum groupinstall -y 'Graphics Creation Tools'
To install KDE desktop:
$ yum groupinstall -y kde-desktop
Optionally install additional desktop tools:
By default the OS is running in CLI mode. To automatically start Gnome desktop at startup, open the file /etc/inittab with vi and change:
id:3:initdefault:
to:
id:5:initdefault:
Manually start Gnome desktop with:
$ init 5
Alternative way to start Gnome desktop:
$ startx
Follow the initial setup wizzard.
Because Terminal has terrible fonts, install additional fonts:
$ yum groupinstall -y fonts
Set Liberation mono, size 10 as default font in Terminal (or whatever you prefer).
Installing CentOS 7 in VirtualBox
Download the minimalistic image of CentOS 7 according to your system requirements. In my case: CentOS-7-x86_64-Minimal-1511.iso or CentOS-7-i386-Minimal-1511.iso (for non 64 bit).
Install it in VirtualBox (set the root password and other stuff).
The installed OS is empty. There is no GUI, no network... To install GUI, see Installing GUI in CentOS 6 and do all the yum groupinstall. I just noticed that the yum groupinstall 'Desktop' was replaced by 'GNOME Desktop'.
In CentOS 7 the well known ifconfig was replaced with ip command. Try these commands and figure out what it means:
$ ip addr
$ ip link
$ ip -s link // show statistics
Ifconfig command is still available as part of net-tools package:
$ yum install net-tools
First you need to get CentOS online. I tried traditional $ ifup eth0 and failed since the file ifcfg-eth0 does not exist. Instead eth0 you probably have enps0s3 which might be used as well with ifup, but I want ETH0! No problem. Let's create it:
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
The contents should look like this (note that static IP is set):
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
NAME="System eth0"
HWADDR=08:00:27:C1:B9:A6
IPADDR=192.168.1.114
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
DNS1=8.8.8.8
IPV6INIT=no
Reboot and try again:
$ reboot
$ ifup eth0
$ ping google.com
FTP client (Fedora 17, CentOS 6)
Install FTP client:
$ yum install ftp
FTP command line manual: here
vsftpd FTP server (Fedora 17, CentOS 6)
Install vsftpd:
$ yum install vsftpd
Start FTP server:
$ service vsftpd start
To automatically start vsftpd at boot on Fedora 17:
$ systemctl enable vsftpd
To automatically start vsftpd at boot on CentOS 6 (also works on Fedora 17; the request is forwarded to systemctl anyway):
$ chkconfig --level 235 vsftpd on
Allow user access to ftp (create also empty file /etc/vsftpd/chroot_list)
$ vi /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/chroot_list
Due to security reasons, create new user without any login permissions, just own a directory for sharing files:
$ mkdir /home/ftpuser
$ groupadd ftp-users
$ useradd --home /home/ftpuser --group ftp-users --shell /sbin/nologin ftpuser
$ passwd ftpuser
$ chown -R ftpuser /home/ftpuser/
$ chmod 755 /home/ftpuser/
If created user cannot login to ftp, you might need to disable SELinux (/etc/sysconfig/selinux).
Enable FTP server on OS X 10.7
Apple removed FTP configuration from GUI (System Preferences - > Sharing) in OS X 10.7. You can enable FTP server through CLI.
Enable FTP server:
$ sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist
Disable FTP server:
$ sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist
Enable SSH (Fedora 17)
Enable SSH access in firewall configuration:
$ system-config-firewall &
Start SSH server:
$ service sshd start
To automatically start sshd at boot on Fedora 17:
$ systemctl enable sshd
To automatically start sshd at boot on CentOS 6.5 (also works on Fedora 17; the request is forwarded to systemctl anyway):
$ chkconfig --level 235 sshd on
Install Java (Centos 6, Fedora 17)
Download binary distribution of java (eg. jdk-5u43-linux-i586-rpm.bin)
Change permissions to executable:
$ chmod a+x jdk-5u43-linux-i586-rpm.bin
Run as root:
$ ./jdk-5u43-linux-i586-rpm.bin
Add JAVA_HOME to PATH:
$ JAVA_HOME=/path/to/jdk1-5_43
$ PATH=$PATH:$JAVA_HOME/bin
$ export PATH
To remember PATH permanently, you need to specify PATH every time when system starts. Place custom shell script into /etc/profile.d directory. PATH will be visible to all users.
$ vi /etc/profile.d/myStartupScript.sh
#!/bin/bash
JAVA_HOME=/opt/jdk
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH
$ chmod +x /etc/profile.d/myStartupScript.sh
Install Apache Tomcat (Fedora 17)
Download Apache Tomcat and unzip to /opt directory
Create symbolic link:
$ ln -s tomcat apache-tomcat-x.x.x
To run Tomcat as normal user, change ownership to normal user:
$ chown -R matjaz:matjaz apache-tomcat-x.x.x
MySQL (Fedora 17)
I installed MySQL with GUI tool Add and Remove applications
I encountered some errors when trying to run MySql, so I changed ownership and group:
$ chown -R mysql /var/lib/mysql
$ chgrp -R mysql /var/lib/mysql
Then run mysql daemon as root:
$ mysqld_safe &
Now continue reading MySql tutorial: here
net-snmp (CentOS 6)
Install net-snmp and net-snmp-utils with Add and Remove applications
Start snmpd (as root because it opens port 161):
$ service snmpd start
Allow connections to 161 through the firewall:
$ iptables -I INPUT 5 -p udp --dport 161 -j ACCEPT
$ service iptables save
net-snmp-utils provide commands for snmpget, snmpset, snmpwalk...
tcpdump (CentOS 6)
tcpdump is packet analyzer tool (aka Wireshark in CLI)
$ yum install tcpdump
Click here to see instructions
Grunt (CentOS 6)
First you need to install Node.js from http://nodejs.org. Node is a platform where Grunt can run. Node installs npm tool, which is mandatory to run Grunt. During installation of node.js npm should automatically be added to the PATH, so it can be used in CLI from terminal window.
I got the source files from NodeJS download page. You will have to compile them first. To compile the sources, you need a C compiler, which I downladed via 'Add/Remove software' tool. This was not enough to compile the node.js, so I downloaded also gcc-c++ with yum:
$ yum install gcc-c++
Then compile the node.js sources (from nodejs directory):
$ ./configure
$ make
$ make install
Create new file inside your project directory: package.json. This file describes components (Grunt plugins) that will be used by Grunt. The file must contain at least the following contents:
{
"name": "test-project",
"version": "1.0.0",
"devDependencies": {
"grunt": "~0.4.1"
}
}
Place the file inside your project root directory and run the command:
$ npm install
New directory node_modules should be created in project root directory.
Then install Grunt CLI tool:
$ npm install -g grunt-cli
Go (golang) (OS X 10.7)
Go is programming language by Google. The easiest way to install it on OS X is by downloading .pkg and let the installer to do its job (go1.6.darwin-amd64.pkg).
The installer installs all necessary files in /usr/local/go directory and adds go to the PATH.
Go requires to add your workspace location to the PATH as $GOPATH:
$ export GOPATH=/path/to/your/workspace
To permanently add GOPATH to PATH then add it into $HOME/.profile file.
Inside workspace create directory structure: src/test.com/hello and create new .go file inside hello directory:
$ vi src/test.com/hello/hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello world!\n")
}
Compile (from $GOPATH directory).
$ go install matjaz.com/hello
Compiled binary file is stored in $GOPATH/bin directory. Run it with (it must be executable):
$ ./hello
LiClipse - Python IDE (OS X 10.7)
There are a few things to verify and configure before LiClipse can be used.
These instructions are written from back to start, since there is always something else to to first.
Download LiClipse. It comes as .dmg image. Just copy the LiClipse to Applications directory.
Start LiClipse. Open Preferences -> Interpretes -> Python interpreter. Here you must set path to python. Because the default installation of Python is missing source files and /Lib directory, you must first install the individual installation of Python from python.org. I choose sources tarball, so the sources must be compiled first.
Download Python sources (in my case 2.7.11). To compile the sources you need gcc compiler which also doesn't come with OS X.
Via Apple Developer download Command Line Tools for XCode (luckily I have XCode 4.6.3 already installed) and install it.
Now back to compiling Python sources. Run './configure --enable-framework=/Users/matjaz/Library/Frameworks'. This will install Python into Frameworks directory under selected user. Then execute 'make && make install' from the Python top level directory.
Now you can configure Python interpreter in LiClipse. Select /Users/matjaz/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
Making bootable SD card for Raspberry Pi (OS X 10.7)
If you don't have a SD card reader I am pretty sure you have smart phone with Android. Insert SD card into smart phone and connect the phone to computer using USB cable. Select to mount SD card as disk (drive). SD card can be formatted using DiskUtility (use FAT32). Then you can burn the Raspbian image to the disk using the following commands:
$ diskutil list
# search for correct disk identifier (in my case disk2)
$ diskutil unmountDisk /dev/disk2
$ sudo dd bs=1m if=/path/to/raspbian.img of=/dev/rdisk2
Eject the SD card and use it with Raspberry Pi
Well, it would be too good if things go so smoothly. Later I discovered that the whole root partition on SD card was filled with Raspbian OS, leaving me only about 100 MB of free space (on 8 and 16 GB card). Digging deeper into google I found the solution. Don't ask me what and why and how because I didn't understand well. It has to do something with Linux partition that was left unused. Read more on this link: http://raspberrypi.stackexchange.com/questions/499/how-can-i-resize-my-root-partition. Here are the steps how to expand the root partition.
sudo fdisk /dev/mmcblk0
Type p to list the partition table. You should see twoo (or three) partitions. In my case: W95 FAT32 and Linux.
Command (m for help): p
Disk /dev/mmcblk0: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3e7fd08e
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 131071 122880 60M c W95 FAT32 (LBA)
/dev/mmcblk0p2 131072 8060927 7929856 3.8G 83 Linux
Remember the start number for partiton 2 (131072).
Type d to delete a partition. Enter the number of partition to be deleted - in this case the second partition (2). Repeat for partition 3 if exists.
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Now you can resize the main partition. Type n to create a new partition, then type p to create primary partition and enter 2 for partition number. When prompted enter the start number of first sector 131072. At the end you'll be prompted to enter the number of last sector - just hit enter to accept default value (all remaining space).
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-31116287, default 2048): 131072
Last sector, +sectors or +size{K,M,G,T,P} (131072-31116287, default 31116287):
Created a new partition 2 of type 'Linux' and of size 14.8 GiB.
Type w to save the changes:
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
Reboot the system
sudo reboot
Execute the next command:
sudo resize2fs /dev/mmcblk0p2
Reboot the system again
sudo reboot
Check the size of partitions:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 15G 3.4G 11G 25% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 6.4M 457M 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
/dev/mmcblk0p1 60M 20M 41M 34% /boot
tmpfs 93M 0 93M 0% /run/user/1000
Configuring static IP on Raspberry (Raspbian Jessie)
Configure network interfaces:
$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet manual
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface mySSID inet static
address 192.168.1.105
netmask 255.255.255.0
gateway 192.168.1.254
iface default inet dhcp
Configure wpa_supplicant.conf file:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="my_ssid"
scan_ssid=1
psk="my_secure_key"
key_mgmt=WPA-PSK
id_str="mySSID"
priority=15
}
Notice that id_str in wpa_supplicant.conf must match iface name in interfaces file!!
Raspberry Pi - Remote Desktop Connection via X11 (OS X 10.7)
On OS X it is very easy to setup remote desktop to Raspberry.
First start X11 on OS X (additionally set 'Allow connections from network clients' in preferences and execute 'xhost +' command)
Connect to Raspberry with ssh using -X option:
$ ssh -X pi@192.168.1.204
On Raspberry then execute:
$ /etc/X11/Xsession
The Raspberry Desktop should open on your Mac.