How I Saved My NAS?

This is the story of how I saved my NAS from not getting IP address. I have been using Iomega HMNHD-CE for 4 years. But it has been heavily modified tough. I replaced the 1 TB drive inside the NAS with a 3 TB disk. Moreover, instead of installing the stock firmware to the new disk, I installed OpenMediaVault. After transferring my data from the old drive, my NAS became better than ever.

The problem is, new firmware (by olderzeus) needs additional commands to successfully configure a network interface, which I forgot to add into /etc/network/interfaces:

iface eth0 inet dhcp
    pre-up ifconfig eth0 up; ifconfig eth0 down; ifconfig eth0 hw ether 01:23:45:67:89:AB

Now my device was booting without obtaining an IP address, and there was no way to reach it. At least I thought so. Then, I realized the HMNHD-CE has a serial port. I needed a serial cable or another serial device to connect it. I didn’t have any cable, but I had a Raspberry Pi. Using three female-female jumper wires, I connected ground (GND), receive (Rx) and transmit (Tx) pins. The trick here is to connect Rx pin of the Raspberry Pi to Tx pin of the HMNHD-CE (and Tx of R-Pi to the Rx pin).

RaspberryPi <-> HMNHD-CE
GPIO Pin  6 <-> J4 Pin 3 (GND)
GPIO Pin  8 <-> J4 Pin 4
GPIO Pin 10 <-> J4 Pin 2

Raspberry Pi - HMNHD Serial Connection

Using the Raspberry Pi, I opened a connection to serial console:

screen /dev/ttyAMA0 115200

After powering on the NAS, I was able to see what is on the screen of the device, which does not have any output port for graphics. It is like magic!

AB2015: VirtualBox’a CentOS Kurulumu

Geçen sene olduğu gibi, bu sene de sevgili Ali Erdinç Köroğlu ve Erdem Bayer ile Akademik Bilişim Konferansı öncesi 31 Ocak – 3 Şubat tarihleri arasında 4 gün boyunca Ağ Yönetimine Giriş anlatıyor olacağız. Katılımcıların anlatacaklarımızı kendileri uygulayıp deneyimleyebilmeleri için kişisel bilgisayarlarına CentOS 7 yükleyip gelmelerini bekliyoruz. Katılımcılar bu yazıda anlatılanları adım adım uygulayarak kurulumu gerçekleştirebilirler.

CentOS 7 Minimal sürümünü indirmek için: http://ftp.linux.org.tr/centos/7.0.1406/isos/x86_64/CentOS-7.0-1406-x86_64-Minimal.iso

Bilgisayarınız üzerinde değişiklik yapmadan bir işletim sistemi yükleyebilmenizi sağlayan en pratik yöntem bir sanal bilgisayar kullanmaktır. Sanal bilgisayar, bilgisayarınızdaki işlemci, bellek, ekran kartı gibi kaynakları kullanarak bir bilgisayarmış gibi davranan yazılımlardır. VirtualBox isimli özgür yazılım aracılığıyla kolayca sanal bilgisayarlar oluşturabiliyoruz. VirtualBox’ı kendi internet sitesinden indirebilirsiniz: https://www.virtualbox.org/wiki/Downloads

VirtualBox’ı kurduktan sonra çalıştırın ve “Yeni” butonuna basarak sihirbazı başlatın. Oluşturulacak sanal bilgisayar için adı kısmına “centos” yazın. İşletim sistemi türü otomatik olarak “Linux” ve “Red Hat (64 bit)” olacaktır. Devam butonuna basın.

Bellek boyutu olarak 512 MB yeterli olacaktır. Devam butonuna basarak bir sonraki aşamaya geçin. Bu aşamada “şimdi sanal sabit disk oluştur” seçeneğini seçin ve “Oluştur”a basın. Açılan ekranda “VDI (VirtualBox Disk Kalıbı)” seçeneği ile devam edin ve sonraki ekranda “değişken olarak ayrılan”ı seçin. Disk boyutu olarak 10 GB yeterli olacaktır.

Sanal bilgisayarı oluşturduktan sonra VirtualBox menüsünden “Tercihler”i açın ve “Ağ” sekmesinde yeni bir “Sadece-Anamakine Ağı” ekleyin. Daha sonra tercihleri kapatın ve oluşturduğunuz sanal bilgisayarı seçerek “Ayarlar” penceresini açın. “Ağ” sekmesinde ikinci bağdaştırıcıyı etkinleştirin ve “Sadece-Anamakine Bağdaştırıcısı”na bağlayın. “Ayarlar” penceresini de kapattıktan sonra sanal bilgisayarı “Başlat”ın.

Açılan pencerede indirmiş olduğunuz CentOS-7.0-1406-x86_64-Minimal.iso dosyasını seçip “Başlat”a basın. Klavyenizdeki Enter tuşu ile “Test this media & install CentOS 7” seçeneğini seçerek kurulumu başlatın. Dil seçimi ekranında listeden Türkçe’yi seçerek devam edin. Kurulumla ilgili çeşitli seçeneklerin olduğu bir ekranla karşılaşacaksınız. Üzerinde ünlem işareti bulunan “Installation Destination” seçeneğini seçip sol üstteki “Done” butonuna basın. “Begin Installation” butonuna tıklayarak kuruluma başlayabilirsiniz.

Kurulum sırasında CentOS sizden sistemin yönetici hesabı için parola belirlemenizi ve bir kullanıcı hesabı oluşturmanızı isteyecektir. “Root password” seçeneğine tıklayarak yönetici hesabı için bir parola belirleyin ve “Done” butonuna basın. Bu parolayı sakın unutmayın! Eğer yeterince karmaşık bir parola belirlemediyseniz “Done” butonuna bir kez daha basmanız gerekecektir. Sonra “User creation” seçeneği ile bir kullanıcı hesabı oluşturun. Username kısmında Türkçe karakter ve boşluk karakteri kullanmamaya çalışın. “Make this user administrator” seçeneğini işaretleyerek kullanıcınıza yönetici haklarını verin ve yine “Done” butonu ile işlemi tamamlayın. Kurulum işlemi bittiğinde sağ alttaki “Finish configuration” butonu ile az önce yaptığınız hesap işlemlerinin de sisteme kaydedilmesini sağlayın ve yeni sanal bilgisayarınızda oturum açmak için “Reboot” butonuna basın.

Eskişehir’de görüşmek üzere!

Sharing Screen Sessions

Recently, I learned a new feature of screen, it is referred as “multi display mode” in the manual. You can attach to a screen session that is not detached and the session is simply shared. In this mode, anything you typed are transferred simultaneously to the other display(s) as well. My mentor from my Google Summer of Code project used this feature to work collaboratively. In order to get in to multi display mode, you need to use “-x” parameter:

screen -x

If there are multiple sessions, you need to provide the session name as well:

screen -x session_name

Quick Guide to D-Bus with Python

Recent weeks, I dealt with D-Bus for my Google Summer of Code project. I was trying to control system services, and systemd has a D-Bus interface. In the beginning, D-Bus seemed a little confusing for me, but I believe I understand it now. In this post I will try to explain it in simple terms and an example.

D-Bus is a interprocess communication tool. It delivers messages to applications. The most confusing thing for me was that taxonomy of D-Bus having several terms such as bus names, objects, paths, methods, signals, properties, interfaces, proxies… But when you learn their meanings, the bigger picture gets more clear.

  • Bus names are applications. They often have well known names in a format similar to namespaces in Java (e.g “com.onurguzel.MyIntergalacticApplication”).
  • Objects are synonymous to the objects in programming languages, and paths are the object instances.
  • Methods are functions that is run on the object, and signals are the broadcasts from the object. Properties are the constants or variables in the object.
  • Interfaces are the types of the object. Thus, some object may support several interfaces. Their format is the same as bus names, but they should not be mixed with each other.
  • Proxies are higher level objects. When a method is invoked on the proxy, it is converted to D-Bus method call message, sent, and reply message is returned. They offer easier operation with D-Bus then manually creating messages, sending them and waiting for a reply.

Since all major Linux distributions use NetworkManager for network connections, I preferred to create this tutorial with it.

import dbus

bus = dbus.SystemBus()

# Warning: Bus names and interfaces are different terms.
# Just because they contain same format or even same data
# does not mean they are the same thing.
# I used these variables to denote the diffrance where bus names and
# interfaces are used.
NM_BUSNAME = 'org.freedesktop.NetworkManager'
NM_IFACE = 'org.freedesktop.NetworkManager'

# Create Python object from /org/freedesktop/NetworkManager instance
# in org.freedesktop.NetworkManager application.
nm = bus.get_object(NM_BUSNAME, '/org/freedesktop/NetworkManager')

# Get list of active connections from the properties
# "Get" method is in "org.freedesktop.DBus.Properties" interface
# It takes the interface name which has the property and name of
# the property as arguments.

connections = nm.Get(NM_BUSNAME, 'ActiveConnections',
                     dbus_interface=dbus.PROPERTIES_IFACE)

# While invoking a method on the object, dbus_interface keyword
# argument is provided to specify which interface has the method.

# Now, lets disconnect. This time we are using the NetworkManager
# interface: "org.freedesktop.NetworkManager"
for path in connections:
    nm.DeactivateConnection(path, dbus_interface=NM_IFACE)

If you have questions about this tutorial, you can ask in the comments section below. For more information about D-Bus, my references:

Google Summer of Code Heyecanı

Google Summer of Code‘a kabul edilen projelere baktığım an muhteşemdi. Öğrenciler arasında arama yapmak için adımı yazdım ve sayfa “Yükleniyor…” ibaresiyle takılı kaldı. Aramayı tekrar tetiklemek için son harfi silip tekrar yazdım, ama ekrana bakamadım. Gözlerimi kapattım, gerçekten, ve cesaretimi toplayıp açtım. İçinde adım geçen bir sonuç vardı. İnanamadım, o yüzden az önce yaptıklarımı tekrarladım: adımı yazdım, gözlerimi kapattım ve tekrar açtım. Pardus’a stajyer olarak seçildiğimi öğrendiğim andan çok da farklı değildi. Yüzümdeki gülümsemeye engel olamıyordum, heyecandan titriyordum. Hiçbir şeye tepki veremeyecek kadar kilitlenmiştim ve bolca terliyordum. Kendime sürekli nefes almam gerektiğini hatırlatıyordum. Elimi telefona uzatım birkaç dakika önce görüştüğüm annemi tekrar arayıp anlattım. Bu iki buçuk dakikayı hayatım boyunca hatırlayacağım.
Continue reading “Google Summer of Code Heyecanı”

Passion of Google Summer of Code

It was an epic moment when I was checking the accepted projects for Google Summer of Code. I typed my first name and searched through students. The page stuck “Loading…” I erased the last letter ‘r’, and typed it again to trigger the search once more. I literally closed my eyes, and prayed, and dared to open. There was a result, with my name. I couldn’t believe, so I repeated my last process: typed my name, closed my eyes, and opened again. It was not so much different the moment I was selected for internship at Pardus. I could not stop myself from smiling, and I was shaking, a lot! I was shocked, and constantly reminded myself to breathe. I hit the redial button on my phone, told my mom. I will remember that two and half minutes forever.
Continue reading “Passion of Google Summer of Code”

Install LESS on Ubuntu with npm

LESS is available on Ubuntu repositories as “node-less” package. However, as of writing this post, it is an old version (1.3.1) which contains lots of bugs, while a newer and more stable one (1.3.3) is available. And you can install latest LESS version with npm:

sudo apt-get install npm
sudo npm install -g less

Because the command name of the node.js is nodejs (instead of node) on Ubuntu, when the installation is complete, you need to change this first line of lessc command. Open /usr/local/bin/lessc with your favorite text editor (with root privileges), and change the end of the first line from node to nodejs.

--- lessc.old	2013-05-21 13:50:00 +0300
+++ lessc	2013-05-21 13:51:00 +0300
@@ -1,4 +1,4 @@
-#!/usr/bin/env node
+#!/usr/bin/env nodejs
 
 var path = require('path'),
     fs = require('fs'),

After saving the file, you can test if lessc command is available, and the correct version is installed.

which lessc
lessc -v

If you have any trouble, you can ask me on the comment section below.