24 Şubat 2007

linux sockettraffic

Linuxte çok fazla seçeneğimiz var (ntop, iptstate, iptraf...) network trafiğini görebilmek için. Bu programlar gerçekten de detaylı bilgiler veriyor. Fakat linux dünyasında henüz processlerin saniyedeki veri hızını gösteren basit bir tool bulamadım. Windows kullandığım günlerde bu tür araçlar kullanırdım hep.
Ben de kendim yazmaya karar verdim ve dün gece başladım. C ile yazdığım programın adı sockettraffic olacak. Bu yazıyı yazarken aynı zamanda programı da yazıyorum. Şuan processlerin socket bilgilerini almak bitti, herhalde bugün de linked listlerle uğraşırım processlerin bilgilerini tutmak için. Şuan için öyle gözüküyor ki, programı non-root olarak çalıştırınca sadece hangi porttan hangi adrese ve porta bağlıyız onu gösterecek. Program root olarak çalıştırıldığında ise bu bağlantıları hangi processlerin yaptığı ve hızları KB/s cinsinden yazacak.
Kullanıcı arayüzüne gelecek olursak, sadece konsolda çalışan bir uygulama olacak, sanırım ncurses a ihtiyacım olacak. Belki ileride graphical bir araç da olur hatta applet belki de :)

12 Şubat 2007

freebsd quake3 ses

Linuxte ses sitemi olarak alsa kullanan uygulamaların sesleri mixlenerek çıkabiliyor. Ama oss kullanan, /dev/dsp yi kullanan uygulamalarda sadece tek ses çalabiliyor sistem. Mesela hem quake 3 oynayıp hem de amaroktan müzik dinleyemedim hiç bir zaman :-)
FreeBSD oss yi kullanıyor ama bunu yapabiliyor. sysctl ile ayarlanabilen hw.snd.pcm0.vchans değeri kaç olursa o kadar kanal aynı anda çalınabiliyor.

# sysctl hw.snd.pcm0.vchans=4
# sysctl hw.snd.maxautovchans=4

ile şuanki ve yeni yüklenecek modüller için kanal sayısını 4 olarak ayarladık. Bu sayede amarokta şarkı çalarken sesli quake 3 de oynayabiliyorum (linuxte hiç yapamamıştım:-))
Bu arada oynadığım quake 3, linux binary si (zaten quake3 ün native FreeBSD sürümü yok) ve harika çalışıyor. FreeBSD nin linux binary compatibility si gerçekten harika, hatta bazı uygulamaların linuxte olduğundan da iyi çalıştığı belirtiliyor.

08 Şubat 2007

loopback image disk yapmak

Bugün initrd olarak da kullanabileceğiniz disk imajı yapmayı anlatmaya karar verdim. Gerçi yeni kerneller cpio arşivi kullanıyorlar ama bu da olur :)

Öncelikle boş bir dosya yaratarak başlayalım, adı im olsun (mesela 8 MB olsun):
$ dd if=/dev/zero of=im bs=1M count=8
8+0 records in
8+0 records out
8388608 bytes (8.4 MB) copied, 0.0377943 seconds, 222 MB/s

Dosya yaratmak yerine /dev/ram0'da da yapabilirsiniz bu işlemi.

Şimdi dosyamızda file system yaratmaya sıra geldi, ext2 oluşturalım.
$ mkfs.ext2 im
mke2fs 1.40-WIP (14-Nov-2006)
im is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2048 inodes, 8192 blocks
409 blocks (4.99%) reserved for the super user
First data block=1
Maximum filesystem blocks=8388608
1 block group
8192 blocks per group, 8192 fragments per group
2048 inodes per group

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

Eveeet dosya sistemimizi de oluşturduktan sonra dosyamızı mount edip (loopback olarak) içine istediğimizi koyup umount edebiliriz. Artık o bir disk imajı. Gzip'leyip initrd olarak da kullanabiliriz.
# mount -o loop im /mnt/x
$ mount
/home/alp/im on /mnt/x type ext2 (rw,loop=/dev/loop/0)

01 Şubat 2007

sharehttp

Bilgisayarlar arasında dosya transferi her zaman gerekiyor. Evimizde özellikle ağdan devamlı dosya transferi ihtiyacı duyarız. Her şeyi ayarlanmış bilgisayarlarımız varsa dosyaları kolayca paylaşırız ama devamlı yeni sistem kuruyorsak paylaşmak gıcık bir işlemdir (samba, nfs, ftp hiçbiri yokken ve kurmak istemiyorsak).
Ağdaki başka bir bilgisayardan dosya almak için http iyi bir seçim, çünkü her bilgisayarda browser ya da wget gibi araçlar var.

Dosya sunan http server ruby ile birkaç satırda yapılabiliyor. Aşağıdaki kodu sharehttp ismiyle kaydedip çalıştırma izni verdikten sonra normal bir program gibi (sisteminizde ruby yüklüyse) kullanabilirsiniz.

#!/usr/bin/ruby
#Alp OZKUL, Feb 2007

if ARGV.length == 0
port = 4000
path = Dir::pwd
elsif ARGV.length == 1
if ARGV[0] == "-h" || ARGV[0] == "--help" || ARGV[0] == "-help"
puts " Usage: sharehttp [PATH] [PORT]"
puts " Default values are PORT=4000, PATH=current working directory"
exit
end
port = 4000
path = ARGV[0]
elsif ARGV.length == 2
port = ARGV[1].to_i
path = ARGV[0]
else
exit
end

puts "(CTRL+C to exit)"
puts "PATH: #{path}"
puts "PORT: #{port}"

require 'webrick'
include WEBrick

server = HTTPServer.new(
:Port => port,
:DocumentRoot => path
)

trap("INT"){ server.shutdown }
server.start
Kullanmak için /usr/bin/sharehttp olarak kaydedip, çalıştırma izni verebilirsiniz(ya da PATH inizde istediğiniz bir yere). Mesela /home/alp dizinini paylaşmak istiyorum:
sharehttp /home/alp
Browserdan http://localhost:4000 e girip dizinin listelenmiş olduğunu göreceksiniz.