Saturday, December 3, 2011

Booting Debian from a loopback filesystem

It is possible to boot a GNU/Linux system from a loopback filesystem. This is probably similar to the method Wubi uses. If don't want to bother creating and configuring the loopback filesystem by yourself, then just use Wubi instead.

First, you need a loopback filesystem. Create one using the dd command:
dd if=/dev/zero of=/path/to/loopback.img bs=1M count=4000
This will create a 4000MB file on the path you specified with 'of='. The 'bs' parameter means 'block size' - dd will take a block of zeroes that large and write it to the specified path.

Next thing you want to do is to create a filesystem inside the file, the same way you do with regular partitions (remember, "in Unix everything is a file"):
mkfs.ext3 /path/to/loopback.img
It will complain that loopback.img is not a block special device. Just ignore that and press 'y' to proceed.
The next step is to install the operating system on the loopback filesystem. I didn't really install anything, I just copied the files of my existing Debian installation. If you have an already installed system and you want to do the same, just mount the loopback filesystem and copy all its '/' on the loopback filesystem. For example:
mount -t ext3 -o loop /path/to/loopback.img /mnt
cp -a /path/to/already_installed_system_root /mnt


Alternatively you can use debootstrap.
From this step on, I assume that you have your loopback file with working system mounted on /mnt.

Next step is to configure the system in the loopback file to boot. First, you need to make initrd mount the loopback filesystem and run the init script of the installed system. That means that you have to generate a new initrd image that's capable of doing that. Put the following two lines at the end of the file '/mnt/usr/share/initramfs-tools/modules':
loop
ext3

Now, open the '/mnt/usr/share/initramfs-tools/scripts/local' file. Find the mountroot() bash function, and change the lines where it should mount the root partition with the following:
 mkdir /root2
mount -n -t ext3 -o nodiratime,noatime /dev/sdaX /root2
mount -n -t ext3 -o loop /root2/path/to/loopback.img /root

Replace /dev/sdaX with the correct partition where you'll keep the loopback.img file. Now chroot into /mnt:
chroot /mnt

Then generate a new initrd image with:

mkinitramfs 2.6.32-5-686 -o /boot/initrd-loopback.img
It's possible that you will need to replace '2.6.32-5-686' with the correct parameter which is the name of the sub-directory in /lib/modules for which you want to generate the image.

The next step is optional. If you want to create a menu entry for grub2 for the system in the loopback device, put this in '/etc/grub.d/40_custom':
menuentry "Loopback Debian" {
loopback loop (hd0,msdos4)/path/to/loopback.img
linux (loop)/boot/vmlinuz-2.6.32-5-686 root=/dev/sdaX
initrd (loop)/boot/initrd-loopback.img
}


then run update-grub2.
Please note that you need to replace the paths like /path/to/something with the real paths on your system.
I needed this in order to run Debian on a system that I wasn't allowed to change it's partition layout or MBR, so I installed grub on a portable usb drive. You can install it on the MBR of your hdd.

Thursday, April 8, 2010

Влијание на цената на суровата нафта врз цената на горивата во Македонија


Со Новица на едно сподели знаење сакавме да одредиме како влијае цената на суровата нафта врз одлуките на регулаторната комисија за одредуваање на цената на горивата. Тие податоци требаше да се одредат од даден spreadsheet документ во кој имаше записи за цените на бензините на секои две недели и цената на суровата нафта за секоја недела. Тоа што требаше да се постигне е да се добие график од овие податоци за да може визуелно да се види врската. Ова веројатно може да се реши со excel-fu, но еве какво решение искористивме ние:

Од .xls документот од листот за цената на горивата се добива една датотека во .csv формат, за листот со цени на суровата нафта друг. Со sed/awk се обработуваат во формат како во датотеките кои ги прикачив (се отфрлаат колони, се бришат запирки и се претвора долари/барел во денари/литар, иако тоа не е клучно за да се донесе заклучокот).

За цртање на графикот се користи gnuplot на следниот начин:

set xdata time
set timefmt "%d.%m.%Y"
plot "benzins.dat" using 1:2 title "benzin" smooth bezier, "crude_1.dat" using 1:2 title "crude" smooth bezier

Еве го добиениот резултат:

Документите (.xls и двата .csv) можете да ги преземете овде.

Friday, September 11, 2009

Workaround за кирилица на S60 3rd

До сега не сум имал прилика да видам S60 3rd уред (најчесто Nokia smartphones) со можност за внесување на кирилица. Тоа мe нервира. Затоа морав да најдам некое решение.

Платформата S60 нуди поддршка за Python, па еве едно ad-hoc решение за непостоењето на внес на кирилица. Во tar.bz2 архивата се наоѓа appswitch_selfsigned.sisx пакет, кој треба да се инсталира откако е веќе инсталиран python runtime. Можеби ќе се појави грешка дека сертификатот на appswitch е истечен, па за да се реши тој проблем датумот на телефонот треба да се врати на 2007. После тоа се инсталира kirilica.sis.

Во архивата се наоѓа и kirilica.py кој е изворниот код на оваа апликација, кој ми овозможува да пишувам кирилица на S60 3rd smartphone-от.

Како се користи kirilica

Се одбира kirilica од менито со апликации. Ќе се појави поле за внесување на текст. Напишете го текстот на латиница. За „ш“ треба да се внеси „sh“, за „ч“ - „ch“, за „ќ“ - „kj“... Стиснете на средното копче од џојстикот. Апликацијата ќе се стави во позадина, а на clipboard-от ќе биде текстот на кирилица. Користете го копчето за вметнување (најчесто на него стои слика од молив) и одберете „Paste“.

Update(09-04-2010): sis пакетот најверојатно нема да функционира на најновите верзии на python runtime-от, затоа што е сменет UID на runtime, па треба да се генерира нов со ensymble. Од мрза, нема да го направам тоа сега и не ветувам дека ќе го направам за скоро.

:)

Thursday, September 10, 2009

Python wrapper за google translate

Често го користам веб сервисот google translate. Понекогаш се јавува потреба излезните податоци од една таква веб алатка да бидат достапни за користење во некоја апликација/скрипта. Еве еден python wrapper за google translate.

Начин на употреба:

python GTranslate.py збор/реченица код_на_јазик1 код_на_јазик2

каде код_на_јазик1 е краток код на јазикот од кој преведувате, код_на_јазик2 е код на јазикот (листа има внатре во скриптата GTranslate.py) на кој сакате да го преведите зборот или реченицата.

Еве пример на користење како модул, ако скриптата која ја пишувате се наоѓа во ист директориум со GTranslate.py:

from GTranslate import *

g = GTranslate("word", "en", "mk)
print g.get_word()

збор