Showing posts with label VoIP. Show all posts
Showing posts with label VoIP. Show all posts

Wednesday, March 17, 2010

Enable "Large File Support" in uClibc

Sources:

[1] Blackfin uClinux (http://docs.blackfin.uclinux.org/doku.php?id=faq)

Steps:

1. Jump to a toolchain source folder

cd /opt/ifx-lxdb-1-2


2. Delete ".configured" file (it was created once the toolchain built)

rm -f .configured


3. Enable LFS (Large File Support) in the configuration files

cd source/uclibc
chmod 666 ifx-uClibc-def-config.mips
chmod 666 ifx-uClibc-opt-config.mips


Replace
# UCLIBC_HAS_LFS is not set

with
UCLIBC_HAS_LFS=y

in both files.

4. Return to the top folder and build the toolchain again.

cd ../..
./setup.sh all

Strace build on mips with uClibc

Sources:

[1] Building Embedded Linux Systems, pp. 297-298 (how to build strace)
[2] Blackfin uClinux (important tips)
[3] Assabet (compiling strace)
[4] Unable to build strace - busybox forum (same build error and reason of the error)

Steps:

1. Download strace package (strace-4.5.19.tar.bz2, 499,6KB) from sourceforge (http://sourceforge.net/projects/strace/) and save it under "~/debug" folder on a host [1].

2. Jump to the folder and unpack the package

cd ~/debug
tar -xjf strace-4.5.19.tar.bz2

(it will be a folder named "strace-4.5.19" created)

3. Jump to the recently created folder

cd strace-4.5.19


4. Configure and build it against uClibc [1]

CC=mips-linux-gcc ./configure --host=mips-linux
make LDFLAGS="-static"


5. First time it will return error messages as shown below:

file.c: In function `printstatfs64':
file.c:1695: error: storage size of `statbuf' isn't known
file.c:1695: warning: unused variable `statbuf'
file.c: In function `sys_statfs64':
file.c:1729: error: invalid application of `sizeof' to an incomplete type
file.c: In function `sys_fstatfs64':
file.c:1743: error: invalid application of `sizeof' to an incomplete type
make[1]: *** [file.o] Error 1
make[1]: Leaving directory `/home/boldoo/debug/strace-4.5.19'
make: *** [all] Error 2


6. By searching on the Internet [4], the build failure reason results from not supporting large file (Large File Support, LFS) in uClibc. So decided to modify sources that references following functions:

sys_truncate64()
sys_ftruncate64()
sys_getdents64()
sys_statfs64()
sys_fstatfs64()


Two files found that contain the functions:
file.c
linux/mips/syscallent.h


7. All lines that include 64-bit functions were commented in both source files.

8. Clean and build again.

make clean
make LDFLAGS="-static"


Build passed without any error.

9. Copy strace executable to root filesystem [1]

cp strace /opt/rootfs.incaip2/sbin/


10. Run minicom, connect a target board (INCAIP2) serially to the host and turn on the target board.

11. After booting Linux on the target, check if strace works:

# strace ls
execve("/bin/ls", ["ls"], [/* 11 vars */]) = 0
ioctl(0, TIOCNXCL, {B115200 opost isig icanon echo ...}) = 0
ioctl(1, TIOCNXCL, {B115200 opost isig icanon echo ...}) = 0
getuid() = 0
getgid() = 0
setgid(0) = 0
setuid(0) = 0
ioctl(1, 0x40087468, 0x7fff7cc0) = 0
ioctl(1, TIOCNXCL, {B115200 opost isig icanon echo ...}) = 0
lstat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
brk(0) = 0x1000a120
brk(0x1000b120) = 0x1000b120
brk(0x1000c000) = 0x1000c000
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open(".", O_RDONLY) = 3
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
getdents(3, /* 7 entries */, 3933) = 128
lstat("./drv_vmmc", {st_mode=S_IFREG|0755, st_size=345000, ...}) = 0
lstat("./hapi.o", {st_mode=S_IFREG|0664, st_size=10996, ...}) = 0
lstat("./tmp", {st_mode=S_IFLNK|0777, st_size=22, ...}) = 0
lstat("./drv_tapi", {st_mode=S_IFREG|0755, st_size=171132, ...}) = 0
lstat("./startpa.sh", {st_mode=S_IFREG|0755, st_size=246, ...}) = 0
getdents(3, /* 0 entries */, 3933) = 0
close(3) = 0
open("/etc/TZ", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/TZ", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/TZ", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/TZ", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/TZ", O_RDONLY) = -1 ENOENT (No such file or directory)
write(1, "drv_tapi drv_vmmc hapi.o "..., 52drv_tapi drv_vmmc hapi.p
) = 52
exit(0) = ?


12. Strace the "voip" application

# strace voip
execve("/usr/local/bin/voip", ["voip"], [/* 11 vars */]) = 0
old_mmap(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x0
stat("/etc/ld.so.cache", {st_mode=S_IFREG|0644, st_size=64, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY) = 3
old_mmap(NULL, 64, PROT_READ, MAP_SHARED, 3, 0) = 0x2aaaf000
close(3) = 0
open("/lib/libc.so.0", O_RDONLY) = 3
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0\265\0\0\0\0004"..6
old_mmap(NULL, 684032, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaee000
old_mmap(0x2aaee000, 397556, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) 0
old_mmap(0x2ab8f000, 4748, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x610
old_mmap(0x2ab91000, 15800, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANO0
close(3) = 0
munmap(0x2aab0000, 4096) = 0
munmap(0x2aaaf000, 64) = 0
ioctl(0, TIOCNXCL, {B115200 opost isig icanon echo ...}) = 0
ioctl(1, TIOCNXCL, {B115200 opost isig icanon echo ...}) = 0
write(1, "voip application (Mar 12 2010, 1"..., 42voip application (Mar 12 2010)

) = 42
rt_sigaction(SIGINT, {0x14000000, [RT_68], 0x400b80 /* SA_??? */}, {SIG_DFL, [R0
open("/dev/vmmc10", O_RDWR) = 3
open("/dev/vmmc11", O_RDWUnable to handle kernel paging request at virtual addr4
Oops in fault.c::do_page_fault, line 226:
$0 : 00000000 802e0000 fffffffc fffffffc 00000000 83791d4c 20004f11 83791d4c
$8 : 00000000 8027fb38 00000000 00000000 00000007 00000020 836c66b0 00000013
$16: 00000000 ffffffea 83791d4c 806e4f00 00000001 c0080fb0 83707000 836c4000
$24: 00000000 00432050 83790000 83791c80 00000000 802aa1b4
Hi : 00000000
Lo : 00000002
epc : 802ac5c8 Not tainted
Status: 1000fd03
Cause : 00800008
PrId : 00019640
Process voip (pid: 66, stackpage=83790000)
Stack: 806a4a3c 801cf2c4 83a09000 80309178 00000000 802aa1b4 2ab420d0
00000fff 801cf474 839a7550 83e25e80 00000001 83e25e80 00000001 00000000
80118e78 00000000 00001000 00000000 80118ad0 00000000 80118ad0 80103550
810e6c00 c00869cc 83e25e80 80307c00 83e25e80 00000060 83791d40 00000000
00000000 00000000 c00d9cb0 83791dd0 00000000 00000000 c0080fb0 c00b8b90
00000102 ...
Call Trace: [< 801cf2c4 >] [< 802aa1b4 >] [< 801cf474 >] [< 80118e78 >] [< 80118ad0 >]
[< 80118ad0 >] [< 80103550 >] [< c00869cc >] [< c00d9cb0 >] [< c0080fb0 >] [< c00b8b90 >]
[< c0080fb0 >] [< 80134094 >] [< c00d9cb0 >] [< c00d9d20 >] [< c009d610 >] [< c0080f14 >]
[< 80126a98 >] [< 80131438 >] [< 80131438 >] [< c0077540 >] [< 8011e964 >] [< 80126b14 >]
[< 8011ea3c >] [< 8011ea34 >] [< 8010c180 >] [< 8010c004 >] [< c0080710 >] [< c0076e2c >]
[< 8014e0d8 >] [< 80108b4c >] [< 8014de38 >] [< 80109a60 >] [< 80161e4c >]

Code: 00021080 00441021 aca30004 < 8c460000 > 00061a02 00061402 00431021 004
R) = 4
brk(0) = 0x1000013c
brk(0x1000113c) = 0x1000113c
brk(0x10002000) = 0x10002000
ioctl(4, 0x2000710f
+++ killed by SIGSEGV +++
Segmentation fault

Friday, February 12, 2010

A client-server application example (socket programming)

Applications:
- server: streamserver
- client: streamclient

Application sources:
- server: /home/< user>/Desktop/socket_programming/server.c
- client: < home>/source/user/efe/streamclient

Building/running applications:
- server: gcc server.c –o streamserver
- client: refer to “Building an application”, “Installing an application” and “Running/testing an application” sections.

Description/synopsis

On a target (INCA-IP2 board) will be run the “streamclient” client application and on a host computer the “streamserver” server application.

“Streamclient” tries to establish stream socket (TCP) connection with “streamserver”, which runs on the host (whos IP address is 192.168.0.98) and listens to the port 3490. When “streamserver” detects incoming connection from the remote target, it sends “Hello world” text as response. “streamclient” will display on the standard output what it has received.

Preperation

1. Enabling port 3490 in firewall

Allow port 3490 by adding following lines (before COMMIT) to “/etc/sysconfig/iptables”:

# Allow port 3490 for an example application
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3490 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 3490 -j ACCEPT
# End of port 3490 rule


After that restart firewall with “service iptables restart” command.

2. Check if port 3490 opened

After loading “streamserver”, open another terminal window and invoke “netstat –na | grep 3490” to check if the port 3490 is open and listened. If the port is open, the command should return:

tcp 0 0 0.0.0.0:3490 0.0.0.0:* LISTEN

Testing example

First, start “streamserver” on the host computer:

server

When starts, it must display:

server: waiting for connections...

Then start “streamclient” on the target. For starting “streamclient”, an IP address of the host must be given as command line argument:

streamclient 192.168.0.98

When the client starts and receives data from the server, it must display:

client: connecting to 192.168.0.98
client: received 'He'


and the server must display:

server: got connection from 192.168.0.97

Then, terminate the server application with CTRL+C command on the host and start again client connection. This time the client must return:

client: connect: Connection refused
client: failed to connect


It means the socket on port 3490 is closed.

Wednesday, February 10, 2010

Select - synchronous I/O multiplexing (оролт/гаралтыг синхрон сонгох)

Юникс програмчлалаас:

#include < sys/time.h>

int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *errorfds, struct timeval *timeout);

void FD_CLR(int fd, fd_set *fdset);
int FD_ISSET(int fd, fd_set *fdset);
void FD_SET(int fd, fd_set *fdset);
void FD_ZERO(fd_set *fdset);

Энэ select() функц нь өгөгдсөн файл тодорхойлогчуудын (file descriptor) аль нь уншихад бэлэн, эсвэл бичихэд бэлэн, эсвэл алдаатай байгааг заана. Хэрэв өгөгдсөн файл тодорхойлогчуудын хувьд заагдсан нөхцөл хангагдаагүй (FALSE) байвал эдгээр файл тодорхойлогчуудын аль нэг дээр заагдсан нөхцөл биелэх хүртэл заасан хугацааг дуустал саатна.

select() функц нь ердийн файлууд, терминал төхөөрөмжүүд, STREAMS файлууд, FIFO төхөөрөмж, pipe төхөөрөмжүүдтэй ажиллах чадвартай.

nfds аргумент нь шалгагдах/тестлэгдэх файл тодорхойлогчдын хязгаарыг заана. Өөрөөр хэлбэл 0nfds-1 хязгаарт багтсан файл тодорхойлогчууд шалгагдана.

Хэрэв readfds аргумент нь тэг заагч (null pointer) биш бол, оролтон дээр уншихад бэлнийг нь шалгах файл тодорхойлогчуудыг, гаралтан дээр уншихад бэлэн болсон файл тодорхойлогчуудыг заана. Эдгээр файл тодорхойлуулагчууд нь fd_set төрлийнх байна.

Хэрэв writefds аргумент нь тэг заагч (null pointer) биш бол, оролтон дээр бичихэд бэлнийг нь шалгах файл тодорхойлогчуудыг, гаралтан дээр бичихэд бэлэн болсон файл тодорхойлогчуудыг заана. Эдгээр файл тодорхойлуулагчууд нь мөн адил fd_set төрлийнх байна.

Хэрэв errorfds аргумент нь тэг заагч (null pointer) биш бол, оролтон дээр алдаатай эсэхийг нь шалгах файл тодорхойлогчуудыг, гаралтан дээр алдаа гараад хүлээгдэж байгаа файл тодорхойлогчуудыг заана. Эдгээр файл тодорхойлуулагчууд нь мөн адил fd_set төрлийнх байна.

select() хэвийн гүйцэтгэгдвэл readfds, writefds, errorfds заагчуудын зааж байгаа обьектууд тус бүр уншихад, бичихэд, эсвэл алдаатай файл тодорхойлогчуудыг зааж өөрчлөгдөнө. Мөн энэ тохиолдолд бас nfds хязгаарт багтсан файл тодорхойлогч бүрийн хувьд харгалзах бит нь 1 болно. Үүний тулд оролтонд уг харгалзах бит 1 гэж тавигдсан, тэгээд шалгалт/тестээр файл тодорхойлогчуудад харгалзах нөхцөлүүдээс (уншихад, бичихэд бэлэн, эсвэл алдаатай) биелсэн байх ёстой.

Хэрэв timeout аргумент нь тэг заагч (null pointer) биш бол, энэ аргумент select() функцыг биелж дуусахыг заасан хугацааны интервалыг агуулсан обьектыг заах ба уг обьектын төрөл нь struct timeval байх ёстой. Хэрэв timeout аргументын зааж байгаа struct timeval төрлийн обьектын гишүүд нь 0 утгатай бол select() ерөөсөө саатахгүй (блоклохгүй). Хэрэв timeout аргумент тэг заагч (null pointer) бол select() функц түүний шалгах ёстой эвэнт (event) үнэн зөв (non-zero) утга автал хүлээж саатна (блоклоно). Хэрэв түүний шалгах ёстой эвэнт болохоос өмнө заагдсан хугацааны интервал дуусвал select() 0 утга буцааж, шалгалтаа дуусгана. select()-д ашиглагдах хугацааны интервал нь бусад alarm(), ualarm(), settimer() зэрэг функцүүдээр тавигдсан таймерийн (timer) ажиллагаанд нөлөөлөхгүй. Функцын амжилттай төгссөн тохиолдолд timeout аргументаар заагдаж байсан обьектын утга өөрчлөгдсөн байх талтай.

Хэрэв readfds, writefds, errorfds аргументууд бүгд тэг заагч, харин timeout аргумент тэг заагч биш бол select() заагдсан хугацааны интервал өнгөртөл саатна эсвэл сигналаар ажиллагаа нь тасалдана. Харин эдгээр бүх аргументууд бүгд тэг заагч бол select()-н ажиллагаа зөвхөн сигналаар тасалдана.

Ердийн файлын файл тодорхойлогч ямар ч тохиолдолд уншихад бэлэн, бичихэд бэлэн, алдаатай гэсэн сонголтыг буцаана.

Хэрэв select() амжилтгүй гүйцэтгэгдвэл readfds, writefds, errorfds аргументуудын зааж буй обьектуудын утга өөрчлөгдөхгүй. Хэрэв заагдсан хугацааны интервал шалгагдах нөхцөл биелэхээс өмнө өнгөрвөл readfds, writefds, errorfds аргументын зааж буй обьектууд 0 утга авна.

Өгөгдсөн файл тодорхойлогчуудыг масклах fd_set төрлийн маскууд нь дараахь командаар тохируулагдах ба шалгагдана: FD_CLR(), FD_SET(), FD_ISSET(), FD_ZERO(). Эдгээр нь функц эсвэл макро гэдэг нь тодорхойгүй.

FD_CLR(fd, &fdset) - fdset дэх fd файл тодорхойлогчид харгалзах битийг тэглэнэ (цэвэрлэнэ).

FD_SET(fd, &fdset) - fdset дэх fd файл тодорхойлогчид харгалзах битийг нэглэнэ (тавина).

FD_ISSET(fd, &fdset) - хэрэв fdset дэх fd файл тодорхойлогчид харгалзах бит тавигдсан (нэглэсэн) бол тэгээс ялгаатай утга, үгүй бол 0 утга буцаана.

FD_ZERO(&fdset) - fdset дэх бүх файл тодорхойлогчид харгалзах битийн утгыг тэглэнэ (цэвэрлэнэ).

Хэрэв fd аргументын утга 0-с бага эсвэл FD_SETSIZE-тай тэнцүү буюу түүнээс их байвал (fd < 0, fd >= FD_SETSIZE) эдгээр командууд заагдсан ёсоор биш, харин тодорхойгүй байдлаар ажиллана.

FD_CLR(), FD_SET(), FD_ZERO() командууд ямар ч утга буцаахгүй, харин FD_ISSET() команд fdset дэх fd-д харгалзах битийн утгаас хамаарч 1 эсвэл 0 гэсэн утгыг буцаана.

Хэрэв select() амжилттай биелэгдсэн тохиолдолд бит маскад тавигдсан (нэглэгдсэн) битийн тоотой тэнцүү утга буцаана. Эсрэг тохиолдолд -1 утгыг буцааж, errno-г нэглэнэ.

Source: http://www.opengroup.org/onlinepubs/007908799/xsh/select.html

Tuesday, February 9, 2010

Signal handling (Сигнал боловсруулах)

С программчлалаас:

Сигнал гэдэг нь програм ажиллаж явцад үүсч болох онцгой нөхцөлийг (exceptional condition) хэлнэ. Тухайлбал тасалдал (interrupt), программын ажиллах явцад гарах алдаа (run-time error), эсвэл гаднаас үүсэлтэй нөхцөлүүд (program termination/break) байж болно. Сигналтай ажиллах 2 функц, мөн сигналуудын төрлийг "signal.h" гэсэн толгой файлд тодорхойлсон байдаг.

Дараахь сигналын төрлүүд тодорхойлогдсон байдаг:
SIGABRT - Abort буюу програмын хэвийн бус тасралт (abnormal termination). Жишээ нь abort() функцээр үүснэ.
SIGFPE - Floating point exception буюу алдаатай арифметик үйлдлүүд. Жишээ нь тэгд хуваах, эсвэл дүүрэлт г.м.
SIGILL - Illegal instruction буюу програм зөвшөөрөгдөөгүй/танигдахгүй инструкц (процессорын код) агуулсныг мэдээллэнэ.
SIGINT - Interrupt буюу програмын ажиллагааг зогсоох хүсэлтийн гараас буюу терминалаас тавьсныг мэдээллэнэ.
SIGSEGV - Segment violation буюу хадгалах төхөөрөмж (storage) руу хандсан хандалт буруу хийгдсэнийг мэдээллэнэ. Жишээ нь санах ойн хязгаараас давсан хандалт хийх.
SIGTERM - Terminate буюу програмыг зогсоох хүсэлт хийгдсэнийг мэдээллэнэ.

Дээрх стандарт сигналуудаас гадна өөр сигналыг нэмж тодорхойлох боломжтой. Тэр тохиолдолд сигналын нэр заавал SIG гэсэн эхлэлтэй байх ёстой.

#include
void (*signal(int sig, void (*handler)(int)))(int)


signal() фунцк нь sig сигналыг хүлээн авсан үед ямар функцыг (handler()) түүний боловсруулагчаар сонгохыг тохируулна. Уг боловсруулагч функцын аргумент нь тухайн сигнал байж болно. signal() функцын 2 дахь аргументэд SIG_DFL, SIG_IGN гэсэн тусгай утгыг бас оноож өгч болно. Эхнийх нь сигналыг системд урьдчилан зааж өгсөн байдлаар боловсруулах бол дараагийнх нь сигналыг боловсруулахгүйгээр орхино.

signal() функцээр сигнал болон түүнийг боловсруулагч функцын оноолт амжилттай хийгдсэн тохиолдолд боловсруулагч функцын (handler()) өмнөх утга буцна, харин оноолт хийгдэж чадаагүй бол SIG_ERR гэсэн утга буцах ба errno-н утга 1 болно.

Ямар нэгэн сигнал мэдээлэгдвэл, эхлээд програмын ажиллагаа зогсоно. Энэ нь signal(sig, SIG_DFL) гэсэн оноолттой адил шинжтэй. Дараа нь хэрэв тухайн сигналд боловсруулагч функц оноогдсон байвал уг функцыг дуудаж ажиллуулна. Боловсруулагч функц ажиллагаагаа хэвийн дуусгасан тохиолдолд програмын ажиллагаа зогссон цэгээсээ үргэлжлэн ажиллана. Хэрэв сигналын төрөл SIGFPE байсан бол програм үргэлжлэн ажиллахгүй, харин тодорхой байдалд орно. Иймээс SIGFPE сигнал боловсруулах функцууд нь ямагт abort, exit, эсвэл longjump гэсэн функцуудыг агуулсан байх хэрэгтэй.

Програм өөрөө сигналыг мэдээллэх шаардлага заримдаа гардаг. Энэ тохиолдолд raise() функцыг хэрэглэнэ.

#include
int raise (int sig);


Хэрэв raise() функц амжилттай биелэгдвэл 0 утга, үгүй бол тэгээс ялгаатай утга буцаана.

Дараахь жишээ програмд interrupt сигнал хүлээн авсан тохиолдолд програмын ажиллагааг хэрхэн зогсоож байгааг харууллаа.


#include < stdio.h>
#include < stdlib.h>
#include < signal.h>


FILE *temp_file;
void leave(int sig);

main() {
/* сигнал, түүнийг боловсруулагч функцын оноолтыг хийх */
(void) signal(SIGINT,leave);

/* tmp файлыг бичихээр нээх */
temp_file = fopen("tmp","w");

for(;;) {
/* ямар нэг үйлдэл хийх */
printf("Ready...\n");

/* гараас унших */
(void)getchar();
}

/* програм энд хэзээ ч хүрэхгүй ... */
exit(EXIT_SUCCESS);
}

/*
* SIGINT сигналыг хүлээн авмагц, tmp файлыг хаана
* гэхдээ стандарт функцыг (fprintf, fclose) сигнал боловсруулагчаас
* дуудах нь бүх тохиолдолд ажиллах баталгаагүй, энэ нь тухайн системээс
* хамаарна. Тиймээс энэ код ажиллахгүй бол гайхах хэрэггүй.
*/

void
leave(int sig) {
fprintf(temp_file,"\nInterrupted..\n");
fclose(temp_file);
exit(sig);
}

Wednesday, September 9, 2009

genext2fs: too big filesystem

Эмбэддэд линуксыг хөрвүүлж, NFS дээр байрлах үндсэн файлын системийг үүсгэх үед
genext2fs: too big filesystem

алдаа өгөх тохиолдол гардаг.

Looking up port of RPC 100003/2 on "ip_addr"

Хэрэв эмбэддэд линукс цөм ачааллаад, үндсэн файлын системийг NFS-р дамжуулан суурилуулж чадахгүй дараахь симптомыг үзүүлээд байвал
Looking up port of RPC 100003/2 on "ip_addr"
Looking up port of RPC 100005/1 on "ip_addr"

name server, firewall-н тохиргоог дараахь файлуудад шалгаарай:
- /etc/resolv.conf (name server)
- /etc/sysconfig/iptables (firewall)

Name server-н хувьд:
nameserver "ip_addr"

firewall-н хувьд:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4000:4003 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 4000:4003 -j ACCEPT

гэсэн тохиргоо байх ёстой.

Monday, September 7, 2009

Temporary failure in name resolution

When Fedora (10) yum returns "[Errno 4] IOError: Trying other mirror." and prevent to install any rpm package, configure /etc/resolv.conf by specifying nameserver IP address, such as
nameserver 192.168.0.1

Friday, September 4, 2009

Kernel panic: No init found. Try passing init= option to kernel.

Линукс-н цөмийг ачааллах үед гардаг энэ алдааг хэрхэн засах талаар.

1. rootpath is empty in IP-Config during kernel boot. -> Configured DHCP with
option root-path "192.168.0.98:/opt/rootfs.incaip2";
to the file /etc/dhcpd.conf. Did not helped.

2. Embed initrd to kernel. Solved.

Kernel panic: No init found. Try passing init= option to kernel.

Линукс-н цөмийг ачааллах үед гардаг энэ алдааг хэрхэн засах талаар

Setting up the Network File System (NFS) on Fedora 9

Here's a quick post on how to build and setup NFS server on Fedora 9. (Fedora 9 болон түүнээс дээшхи хувилбарын үйлдлийн систем дээр хэрхэн Network File System суулгаж, холбогдох тохируулгыг хийх тухай товч заавар. Зөвхөн өгөгдсөн командуудыг дууриагаад хийхэд хангалттай гэж найдаж байна)

NFS server installation and configuration

Do following as root.

1. Download and install NFS rmp by using yum:
yum -y install nfs-utils rpcbind

2. Configure the server by specifing the shared directories, the IP address(es) of the hosts that have access to the shared directories and their rights (read-only, read+write etc) in the /etc/exports file. For example, /opt/rootfs.incaip2 is NFS share and a host with the IP address 192.168.0.97 can access to this share:
/opt/rootfs.incaip2 *(rw,async,no_root_squash)

or
/opt/rootfs.incaip2 192.168.0.0/24(rw,async,no_root_squash)

or
/opt/rootfs.incaip2 192.168.0.97(rw,async,no_root_squash)

To make this change in effect, invoke:
exportfs -rv

3. Copy files to your NFS share. For example, copy unpacked root file system, /tmp//build/root_filesystem, to the /opt/rootfs.incaip2 directory.
4. In order to prevent hosts from other networks from connecting any of the NFS-related daemons, edit /etc/hosts.deny file as follows:
lockd:ALL
mountd:ALL
rpcbind:ALL
rquotad:ALL
statd:ALL

5. In order to allow only the host with IP address of 192.168.0.97 to connect, add following lines to the /etc/hosts.allow file:
lockd:127.0.0.1,192.168.0.97
mountd:127.0.0.1,192.168.0.97
rpcbind:127.0.0.1,192.168.0.97
rquotad:127.0.0.1,192.168.0.97
statd:127.0.0.1,192.168.0.97

6. Specify fixed IP ports in use of NFS by adding following lines to the /etc/sysconfig/nfs file:
STATD_PORT=4000
LOCKD_TCPPORT=4001
LOCKD_UDPPORT=4001
MOUNTD_PORT=4002
RQUOTAD_PORT=4003

These are suggested ports to be used in NFS-related daemons.

Firewall configuration

7. Configure firewall to allow above selected TCP and UDP ports. To do so edit the /etc/sysconfig/iptables file, so that it contains following settings:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4000:4003 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 4000:4003 -j ACCEPT

Make sure that these lines must be before COMMIT, otherwise they have no effect.
8. Once the changes are made to the firewall, restart it:
service iptables restart


Starting and verifying NFS services

9. With all of the changes made, the NFS daemons can be started up:
service rpcbind restart
service nfs restart
service nfslock restart

10. To make sure that everything is working properly, the RPC information can be checked by invoking:
rpcinfo -p

The similar information should be displayed as below:
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 4000 status
100024 1 tcp 4000 status
100011 1 udp 4003 rquotad
100011 2 udp 4003 rquotad
100011 1 tcp 4003 rquotad
100011 2 tcp 4003 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 4001 nlockmgr
100021 3 udp 4001 nlockmgr
100021 4 udp 4001 nlockmgr
100021 1 tcp 4001 nlockmgr
100021 3 tcp 4001 nlockmgr
100021 4 tcp 4001 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100005 1 udp 4002 mountd
100005 1 tcp 4002 mountd
100005 2 udp 4002 mountd
100005 2 tcp 4002 mountd
100005 3 udp 4002 mountd
100005 3 tcp 4002 mountd

11. Verify that the selected directories are exported:
showmount -e

12. In order to verify that the selected TCP and UDP ports are being listened, invoke:
netstat -tauap

13. If everything is OK, make NFS services startable at boot time with following commands:
chkconfig portmap off
chkconfig nfs off
chkconfig nfslock off
chkconfig --level 345 portmap on
chkconfig --level 345 nfs on
chkconfig --level 345 nfslock on


Sources:
1. Setting up a Fedora NFS server
2. Fedora9: Quick NFS Server Howto setup NFS server fedora
3. F9 Network File System (NFS)

Wednesday, August 26, 2009

Uploading a file to TFTP server from local host

In this case, we are uploading a text file from the Windows host to the TFTP server running on Fedora guest. (VirtualBox!)

1. The command given in Windows host is depicted below.


2. The "Permission denied" response from the server is due to the SElinux policy.


3. Серверт файл хадгалах шаардлага одоогоор шаардлагагүй тул шийдлийг нь хийсэнгүй. Шийдэх арга замыг эндээс үз.

Starting up TFTP server

1. switch to superuser
su

2. invoke following commands
/sbin/chkconfig tftp on
/sbin/chkconfig xinetd on
/sbin/service xinetd start

Tuesday, August 25, 2009

Installing TFTP on Virtualbox/Fedora (guest)

Virtualbox-н зочин Fedora дээр TFTP суулгах, суугаад ажиллаж байгаа эсэхийг шалгах.

1. Дараахь командаар TFTP серверийн багцыг Fedora дээр суулгана
yum install tftp-server


2. Харин TFTP клиентийг суулгахдаа
yum install tftp

гэсэн командыг өгнө.

3. TFTP серверийн тохируулгыг
/etc/xinetd.d/tftp

файлд хийх ба
disable = yes

мөрийг
disable = no

болгож солино. Энэ нь TFTP серверийн ажиллагааг "зөвшөөрөөгүй" байсан анхны (default) тохиргоог "зөвшөөрсөн" болгож солино.

Энэ файл дахь
server_args
хувьсагч нь TFTP серверийн файлын санг заасан мэдээллийг агуулна. Сан нь анхны байдлаар
/tftpboot
гэж байх боловч хэрэглэгч үүнийг өөрийн дураар өөрчилж болно.

Мөн сангийн эзэмшигч нь анхны байдлаар (default)
root
гэж өгөгдөх боловч түүнийг
chown nobody:nobody /tftpboot

гэсэн командаар nobody хэрэглэгчийн мэдэлд шилжүүлж болно.

Түүнчлэн TFTP сервер луу файл хадгалдаг болгохын туд server_args хувьсагчид -c аргументийг нэмж өгч болно. Ж/нь
server_args = -c -s /tftpboot


Лог системд xinetd сервисийн логийг бүртгүүлэх бол нэг буюу хэд хэдэн -v аргументийг server_args хувьсагчид олгоно. Ж/нь:
server_args = -c -s -v -v -v /tftpboot


4. Ингээд серверийг ачааллахдаа
/sbin/chkconfig tftp on
/sbin/chkconfig xinetd on
/sbin/service xinetd start

эсвэл
chkconfig tftp on
chkconfig xinetd on
service xinetd start

командуудыг өгнө.

Хэрэв сервер ажиллах явцын дунд түүний тохиргуулгын файлд (/etc/xinetd.d/tftp) ямар нэгэн өөрчлөлт хийсэн бол
/etc/rc.d/init.d/xinetd reload

гэсэн командаар идэвхжүүлнэ.

5. Сервер ажиллаж байгаа эсэхийг шалгахдаа, /tftpboot санд дурын файл байрлуулж байгаад түүнийг татан авч шалгаж болно. Ж/нь:
touch /tftpboot/test.txt

гэсэн командаар /tftpboot санд test.txt файлыг үүсгэе.

Дараа нь локал хост дээрээ TFTP клиентээ ачааллан сервертэйгээ холбогдоно.
tftp

server_ip_addr нь тухайн сервер ажиллаж байгаа хостын IP хаяг юм. Ж/нь: 192.168.0.100

TFTP клиент дээрээс дараахь командаар файлаа татна, хэрэв амжилттай бол quit командаар гараарай.
tftp> get test.txt
tftp> quit


6. Хэрэв үл мэдэгдэх шалтгааны улмаас TFTP серверээс файл татаж болохгүй байвал дараахь аргуудаар сервер ачаалагдан ажиллаж байгаа эсэхийг шалгаж болно.

6.1. netstat ашиглах
netstat -a | grep tftp

командыг өгөхөд хариуд нь
udp 0 0 *:tftp *:*

гэсэн мөр буцаж байвал сервер ажиллаж байна гэсэн үг.

6.2. chkconfig ашиглах
chkconfig --list | grep xinetd
командыг өгөхөд
xinetd based services:
хэсэгт
tftp: on
гэж байвал сервер хэвийн ажиллаж байгааг заана.

7. Нэмэлт, firewall-г хаах, буцааж идэвхжүүлэх
Хаахдаа:
/etc/init.d/iptables save
/etc/init.d/iptables stop

командуудыг өгнө.
Буцааж идэвхжүүлэхдээ:
/etc/init.d/iptables start

гэсэн командыг өгнө.

Эх сурвалж:
1. Installing TFTP on Fedora
2. Check TFTP server
3. Quick HOWTO: Ch16: Telnet, TFTP, and xinetd
4. Setting up DHCP and TFTP servers
5. How to disable the iptables firewall in Linux