강좌 & 팁
그동안 미루고 미룬 udev 포팅 성공기를 올립니다.
테스트 타겟보드 : EZ-S3C6410
1. udev 소스 받기
http://www.kernel.org/pub/linux/utils/kernel/hotplug/
에서 udev-124.tar.gz 를 다운로드 받습니다. ( udev-125.tar.gz 는 인스톨시 문제가 있네요. )
2. 압축 풀기
root@tsheaven:udev# tar -zxvf udev-124.tar.gz
3 Makefile 수정하기
root@tsheaven:udev# cd udev-124
root@tsheaven:udev-124# vi Makefile
87 prefix ?= ./_install
103 CROSS_COMPILE ?= arm-generic-linux-gnueabi-
115 LDFLAGS += -Wl,-warn-common,--as-needed,-s
4. 컴파일
root@tsheaven:udev-124# make
root@tsheaven:udev-124# vi udev_version.h
1 /* Generated by make. */
2 #define UDEV_VERSION "124"
3 #define UDEV_ROOT "/dev"
4 #define UDEV_CONFIG_FILE "./_install/etc/udev/udev.conf"
5 #define UDEV_RULES_DIR "./_install/etc/udev/rules.d"
를 다음과 같이 수정합니다.
1 /* Generated by make. */
2 #define UDEV_VERSION "124"
3 #define UDEV_ROOT "/dev"
4 #define UDEV_CONFIG_FILE "/etc/udev/udev.conf"
5 #define UDEV_RULES_DIR "/etc/udev/rules.d"
root@tsheaven:udev-124# make install
정상적으로 컴파일이 되고, 인스톨이 되었다면 아래와 같이 _install 디렉토리가 생성되고,
이 디렉토리에 udev 관련 디렉토리 및 파일들이 생성됩니다.
root@tsheaven:udev-124# ls _install/
etc/ sbin/ usr/
5. 생성된 udev 관련 디렉토리 및 파일들을 램디스크 파일 시스템의 해당 디렉토리에 복사를 해 주면 됩니다.
6. 램디스크 파일 시스템에서 해야할 몇가지 작업.
6.1. udev 데몬 실행 스크립트 파일 만들기
타겟보드에서 부팅 -> 로그인 후에 다음과 같이 명령을 치면 udev를 실행 할 수 있습니다.
/sbin/udevd --daemon
위와 같이 명령으로 실행을 하면 되지만 원래의 목적이 부팅시 자동으로 udev를 실행하는 것이므로 다음과 같이
스크립트 파일을 만들어 부팅시 실행을 하면 됩니다.
아래의 스크립트는 현재 에프에이리눅스에서 제공하는 램디스크파일 시스템을 기준으로 하였습니다.
만일 다른 램디스크 파일 시스템을 사용할 경우에는 이 스크립트파일이 실행 할 수 있는 곳에 두시면 됩니다.
에프에이리눅스에서 제공하는 램디스크 파일 시스템의 구조는 다음과 같습니다.
etc/rc.d/
etc/rc.d/ini.d
etc/rc.d/rc1.d
etc/rc.d/rc2.d
etc/rc.d/rc3.d
etc/rc.d/rc4.d
etc/rc.d/rc5.d
etc/rc.d/rc6.d
6.1.1 스크립트 파일 만들기
[root@falinux etc/rc.d/init.d] vi udev
#!/bin/sh
PATH=$PATH:/sbin:/bin
CMDLINE=$(cat /proc/cmdline)
if [ ! -x /sbin/udevd ]
then
exit 0
fi
case "$1" in
start)
echo "" > /proc/sys/kernel/hotplug
mount -n -o mode=0755 -t tmpfs tmpfs /dev
# Create static device nodes in /dev
mknod /dev/console c 5 1
mknod /dev/null c 1 3
echo "Starting the hotplug events dispatcher udevd"
udevd --daemon
echo "Synthesizing initial hotplug events"
udevtrigger
udevsettle --timeout=300
mkdir /dev/pts
mount -n -t devpts devpts /dev/pts
mkdir /dev/shm
# FALINUX
## set getty console
CONSOLE=$(cmd_parsing console $CMDLINE)
if [ "$CONSOLE" = "" ]; then
ln -s /dev/ttyS0 /dev/ttyFC
else
IFS=","
set $CONSOLE
rm /dev/ttyFC > /dev/null 2>&1
ln -s /dev/$1 /dev/ttyFC
fi
;;
stop)
;;
reload)
udevcontrol --reload_rules
;;
*)
echo "Usage: /etc/rc.d/init.d/udev {start|stop|reload}"
echo
exit 1
;;
esac
exit 0
6.1.2 런레벨 따른 실행 링크 만들기
etc/inittab 파일을 보시면 런레벨이 3으로 되어 있습니다.
따라서 아래의 rc3.d 디렉토리에서 위에서 작성한 /etc/rc.d/init.d/udev 파일을 link 하면 됩니다.
[root@falinux etc/rc.d/rc3.d] ls
S05syslog S50inet
[root@falinux etc/rc.d/rc3.d] ln -s ../init.d/udev S70udev
6.2. udev 파일들 확인하기
/sbin 디렉토리에서 udev 관련 파일들을 확인 합니다.
root@tsheaven:sbin# ls -al udev*
-rwxr-xr-x 1 root root 72935 2011-05-20 21:47 udevadm*
lrwxrwxrwx 1 root root 7 2011-05-20 22:00 udevcontrol -> udevadm*
-rwxr-xr-x 1 root root 65063 2011-05-20 21:47 udevd*
lrwxrwxrwx 1 root root 7 2011-05-20 21:47 udevsettle -> udevadm*
lrwxrwxrwx 1 root root 7 2011-05-20 22:00 udevtrigger -> udevadm*
여기서 udevcontrol, udevtrigger 파일이 없다면 다음과 같이 link 를 해 줘야 합니다.
root@tsheaven:sbin# ln -s udevadm udevcontrol
root@tsheaven:sbin# ln -s udevadm udevtrigger
7. 커널에서 작업할일
타겟보드가 부팅 후 로그인을 하기 위헤서는 램디스크파일시스템의 /etc/inittab 파일에 보시면
아래와 같이 /sbin/getty 부분을 확인 할 수 있습니다.
T0:12345:respawn:/sbin/getty -L ttySAC0 115200 vt100
위의 내용은 로그인시 ttySAC0 시리얼 장치를 통하여 메세지를 표출하는 것을 의미합니다.
따라서 udev가 실행되어 장치파일을 만들 경우 ttySAC0 장치 파일 이름으로 생성되어야 합니다.
하지만 현재 에프에이리눅스에서 제공되는 S3C6410 커널에서는 이 이름을 사용하지 않아서 커널에서 수정을 해 주어야 합니다.
7.1 커널에서 수정할 내용
root@tsheaven:linux-2.6.29# vi drivers/serial/samsung.c
827 static struct uart_driver s3c24xx_uart_drv = {
828 .owner = THIS_MODULE,
829 .dev_name = "s3c2410_serial",
830 .nr = CONFIG_SERIAL_SAMSUNG_UARTS,
831 .cons = S3C24XX_SERIAL_CONSOLE,
832 .driver_name = S3C24XX_SERIAL_NAME,
833 .major = S3C24XX_SERIAL_MAJOR,
834 .minor = S3C24XX_SERIAL_MINOR,
835 };
에서 .dev_name 을 수정합니다.
827 static struct uart_driver s3c24xx_uart_drv = {
828 .owner = THIS_MODULE,
829 .dev_name = "ttySAC",
830 .nr = CONFIG_SERIAL_SAMSUNG_UARTS,
831 .cons = S3C24XX_SERIAL_CONSOLE,
832 .driver_name = S3C24XX_SERIAL_NAME,
833 .major = S3C24XX_SERIAL_MAJOR,
834 .minor = S3C24XX_SERIAL_MINOR,
835 };
7.2 커널 부팅 메세지에서 확인 하기
fb4: s3cfb frame buffer device
s3c6400-uart.0: s3c2410_serial0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10
s3c6400-uart.1: s3c2410_serial1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10
s3c6400-uart.2: s3c2410_serial2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10
s3c6400-uart.3: s3c2410_serial3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10
brd: module loaded
의 s3c2410_serial0 부분들이 아래와 같이 변경되면 정상적인 것입니다.
fb4: s3cfb frame buffer device
s3c6400-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10
s3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10
s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10
s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10
brd: module loaded
7.3 커널에서 .config 파일 확인 하기
CONFIG_HOTPLUG=y
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_SYSFS=y
CONFIG_SYSFS_DEPRECATED*=n
CONFIG_PROC_FS=y
CONFIG_TMPFS=y
CONFIG_INOTIFY_USER=y
CONFIG_SIGNALFD=y
CONFIG_TMPFS_POSIX_ACL=y (user ACLs for device nodes)
CONFIG_BLK_DEV_BSG=y (SCSI devices)
8. 마무리
램디스크 및 커널이 작업을 모두 마쳤다면 커널이미지와 램디스크이미지를 타겟보드에 다운로드를 하면 됩니다.
이후 각자의 환경에 맞게 /etc/udev/rules.d 디렉토리에 있는 rules 파일들을 추가 또는 수정하면 됩니다.
****
/etc/rc.d/init.d/udev 파일을 첨부합니다.