Letzte Änderung am 2006-08-13 00:27:54 von RoEn
Editiert am 2006-06-27 17:17:03 von RoEn
Erweiterungen:
DEVICE=/dev/sdc
Löschungen:
(bash)DEVICE=/dev/sdc
Editiert am 2006-06-10 19:19:52 von RoEn
Erweiterungen:
cp -a $FLASH/* template
/dev/hda1 / ext2? defaults 0 0
Löschungen:
(bash)mkdir $FLASH/dev/pts
(bash)cp -a $FLASH/* template
(bash)/dev/hda1 / ext2? defaults 0 0
Editiert am 2006-06-10 19:18:15 von RoEn
Erweiterungen:
%%
Editiert am 2006-06-10 19:17:20 von RoEn
Erweiterungen:
Embedded Kanotix
Hardware: PC104, 32MB Compact Flash, 64MB Ram, National Geode GX1 Prozessor mit 200 MHz
Software: Ein (bis zur Unkenntlichkeit) abgespecktes Kanotix BH8. Original Kernel, original libc, busybox, dropbear (SSH) und tinylogin.
DEVICE=/dev/sdc
FLASH=/mnt/sdc1
cfdisk $DEVICE
mkfs.ext2 $PARTITION
(bash)tune2fs -c 0 -i 0 $PARTITION
mount $PARTITION $FLASH
grub-install --no-floppy --root-directory=$FLASH $DEVICE
echo "(hd0) /dev/hda" > $FLASH/boot/grub/device.map
(bash)mkdir $FLASH/bin
cp -a /bin/ash.static $FLASH/bin
(bash)mkdir $FLASH/dev
mknod $FLASH/dev/console c 5 1
(bash)mkdir $FLASH/dev/pts
mknod $FLASH/dev/ptmx c 5 2
Auf meinem Entwicklungssystem besteht folgende Verzeichnisstruktur:
(bash)cp -a $FLASH/* template
(bash)
tar cvfz ../template.tgz
(bash)/dev/hda1 / ext2 defaults 0 0
pts /dev/pts devpts gid=5,mode=0620 0 0
(bash)
tty4::respawn:/sbin/getty 38400 /dev/tty4
(bash)
cp -a target/* $FLASH
Löschungen:
Embedded Kanotix
:code:
:code:
Hardware: PC104, 32MB Compact Flash, 64MB Ram, National Geode GX1 Prozessor mit 200 MHz
Software: Ein (bis zur Unkenntlichkeit) abgespecktes Kanotix BH8. Original Kernel, original libc, busybox, dropbear (SSH) und tinylogin.
:code:DEVICE=/dev/sdc
FLASH=/mnt/sdc1?:code:
:code:cfdisk $code ∞:
:code:mkfs.ext2? $code ∞:
:code:tune2fs? -c 0 -i 0 $code ∞:
:code:mount $PARTITION $code ∞:
:code:grub-install --no-floppy --root-directory=$FLASH $DEVICE
echo "(hd0?) /dev/hda" > $FLASH/boot/grub/device.map:code:
:code:
:code:
:code:mkdir $FLASH/bin
cp -a /bin/ash.static $FLASH/bin:code:
:code:mkdir $FLASH/dev
mknod $FLASH/dev/console c 5 1
:code:
:code:mkdir $FLASH/dev/pts
mknod $FLASH/dev/ptmx c 5 2:code:
# Auf meinem Entwicklungssystem besteht folgende Verzeichnisstruktur:
:code:
- tgz
:code:
:code:cp -a $FLASH/* template:code:
:code:
tar cvfz ../template.tgz
:code:
:code:
shadow
:code:
:code:/dev/hda1 / ext2? defaults 0 0
pts /dev/pts devpts gid=5,mode=0620 0 0
:code:
:code:
tty4?::respawn:/sbin/getty 38400 /dev/tty4?
:code:
busybox http://busybox.net∞ stellt die meisten Tools zur Verfügung.
tinylogin http://tinylogin.busybox.net∞ liefert login, getty, passwd, su,...
dropbear http://matt.ucc.asn.au/dropbear∞ liefert ssh-Server und -Client.
:code:
:code:
:code:
cp -a target/* $FLASH
:code:
Editiert am 2006-06-10 17:08:18 von RoEn
Erweiterungen:
Embedded Kanotix
So meldet sich mein Rechner blackbox per SSH:
:code:
BusyBox? v1.00-rc3? (2004.09.30-12:24+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ # uname -a
Linux blackbox 2.6.8.1-kanotix-5 #1 Sun Sep 19 14:41:18 CEST 2004 i586 unknown
~ # df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda1 30721 7660 21475 26% /
tmpfs 29224 4 29220 0% /tmp
~ # free
- used free shared buffers
- 58448 5984 52464 0 152
Swap: 0 0 0
Total: 58448 5984 52464
~ #
:code:
Hardware: PC104, 32MB Compact Flash, 64MB Ram, National Geode GX1 Prozessor mit 200 MHz
Software: Ein (bis zur Unkenntlichkeit) abgespecktes Kanotix BH8. Original Kernel, original libc, busybox, dropbear (SSH) und tinylogin.
Mein Kochrezept, um ein Embedded Kanotix zu realisieren:
Ein paar Definitionen
:code:DEVICE=/dev/sdc
PARTITION=/dev/sdc1?
# Mountpoint
FLASH=/mnt/sdc1?:code:
1.) bootbare Linux Partition anlegen
:code:cfdisk $code ∞:
2.) Filesystem erzeugen
:code:mkfs.ext2? $code ∞:
3.) Checks ausschalten
:code:tune2fs? -c 0 -i 0 $code ∞:
4.) CF mounten
:code:mount $PARTITION $code ∞:
5.) $FLASH/lost+found kann gelöscht werden
6.) GRUB installieren
:code:grub-install --no-floppy --root-directory=$FLASH $DEVICE
echo "(hd0?) /dev/hda" > $FLASH/boot/grub/device.map:code:
7.) kernel -> $FLASH/boot/vmlinuz kopieren
8.) Benötigte Module nach $FLASH/lib/modules... kopieren
9.) $FLASH/boot/grub/menu.lst anpassen, z.B.:
:code:
default 0
timeout 10
#German keyboard (darf nur einmal aufgerufen werden)
setkey y z
setkey z y
setkey Y Z
setkey Z Y
setkey equal parenright
setkey parenright parenleft
setkey parenleft asterisk
setkey doublequote at
setkey plus bracketright
setkey minus slash
setkey slash ampersand
setkey ampersand percent
setkey percent caret
setkey underscore question
setkey question underscore
setkey semicolon less
setkey less numbersign
setkey numbersign backslash
setkey colon greater
setkey greater bar
setkey asterisk braceright
title Linux ash.static
- (hd0?,0)
- /boot/vmlinuz root=/dev/hda1 init=/bin/ash.static
title Linux
- (hd0?,0)
- /boot/vmlinuz root=/dev/hda1
- :code:
10.) Eine minimale Shell zur Verfügung stellen
:code:mkdir $FLASH/bin
cp -a /bin/ash.static $FLASH/bin:code:
11.) Devices einrichten
:code:mkdir $FLASH/dev
for n in 0 1 2 3 4 5 6 7 8 9; do
- $FLASH/dev/tty$n c 4 $n
- root:tty $FLASH/dev/tty$n
- 666 $FLASH/dev/tty$n
done
mknod $FLASH/dev/tty c 5 0
mknod $FLASH/dev/console c 5 1
:code:
12.) UNIX 98 pty devices einrichten, noch nicht nötig
:code:mkdir $FLASH/dev/pts
mknod $FLASH/dev/ptmx c 5 2:code:
Jetzt müßte der Kernel schon mal mit ash.static starten...
# Auf meinem Entwicklungssystem besteht folgende Verzeichnisstruktur:
:code:
/root
/projects
/blackbox
/src
/busybox
/dropbear
/tinylogin
/target
...
/template
...
- target
- template
- tgz
:code:
Wenn der Kernel mit ash.static startet, dann ein Abbild in template erzeugen.
:code:cp -a $FLASH/* template:code:
und mit ./make_template ein komprimiertes Abbild erzeugen.
make_template:
:code:
#!/bin/sh
cd template
tar cvfz ../template.tgz
:code:
In template/etc sind jetzt einige Anpassungen nötig, bei mir siehts so aus:
:code:
/dropbear
/init.d
/rcS?.d
busybox.conf
fstab
hosts
hostname
inittab
group
gshadow
passwd
shadow
:code:
Das Verzeichnis dropbear enthält die SSH-keys.
group, gshadow, passwd und shadow können (erstmal) vom Entwicklungsrechner übernommen werden.
fstab:
:code:/dev/hda1 / ext2? defaults 0 0
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
pts /dev/pts devpts gid=5,mode=0620 0 0
:code:
hosts und hostname sind klar.
init.d und rcS?.d gehören zu init, inittab weicht allerdings vom Standard ab, da busybox verwendet wird.
inittab:
:code:
# Run first
::sysinit:/etc/init.d/rcS?
#
::ctrlaltdel:/sbin/reboot
# To do before rebooting
::shutdown:/bin/umount -a -r
# Restart init
::restart:/sbin/init
#Shells on tty1?..4
tty1?::respawn:/sbin/getty 38400 /dev/tty1?
tty2?::respawn:/sbin/getty 38400 /dev/tty2?
tty3?::respawn:/sbin/getty 38400 /dev/tty3?
tty4?::respawn:/sbin/getty 38400 /dev/tty4?
:code:
Drei Softwarepakete liefern kompakte Programme für den Embedded-Bereich:
busybox http://busybox.net∞ stellt die meisten Tools zur Verfügung.
tinylogin http://tinylogin.busybox.net∞ liefert login, getty, passwd, su,...
dropbear http://matt.ucc.asn.au/dropbear∞ liefert ssh-Server und -Client.
Die Quellen nach src installieren und anpassen. Die Default-Werte sind soweit ganz gut. Nur bei dropbear habe ich "dropbearmulti" in options.h eingestellt.
Mit make_target wird jetzt alles zusammen gemixt, template.tgz wird entpackt, zusätzliche (Standard-)Programme werden kopiert, busybox, dropbear und tinylogin werden installiert, einige Standard-Libraries (pam, terminfo,..) werden installiert und anschließend werden per ldd alle Library-Abhängigkeiten ermittelt und die zugehörigen *.so kopiert.
make_target:
:code:
#!/bin/sh
WORK="/root/projects/blackbox
TARGET="$WORK/target"
#BINS="clear dmesg fuser gawk login netcat passwd pico rz scp setserial sftp smbclient smbpasswd ssh ssh-add ssh-agent ssh-keyconverter ssh-keygen ssh-keyscan strace stty su sudo sz zip"
#SBINS="dhcpcd dhcpd hwclock mgetty netdate nmbd nscd portmap pppd smbd sshd tcpd"
BINS="fuser apm"
SBINS="hwclock"
function error {
- " ERROR: " $* " ERROR"
}
function do_cp {
- -puv $1 $2 || error "cp $1 $2"
}
# MAIN
if [ ! -d $TARGET ] ; then
- "could not find the target-directory $TARGET"
- 1;
fi
echo "first we delete old stuff"
rm -rf $TARGET/*
echo "install template"
cd $TARGET
tar xzvf $WORK/template.tgz
cd $WORK
if [ "$BINS" ] ; then
- "copy $BINS to /bin:"
- -p $TARGET/bin
- -p $TARGET/usr/bin
- i in $BINS ; do
- [ -e /bin/$i ] ; then
- cp /bin/$i $TARGET/bin
- $TARGET/bin/$i
- [ -e /usr/bin/$i ] ; then
- cp /usr/bin/$i $TARGET/usr/bin
- $TARGET/usr/bin/$i
- error "cannot locate /bin/$i nor /usr/bin/$i"
- done
fi
if [ "$SBINS" ] ; then
- "copy $SBINS to /sbin:"
- -p $TARGET/sbin
- -p $TARGET/usr/sbin
- i in $SBINS ; do
- [ -e /sbin/$i ] ; then
- cp /sbin/$i $TARGET/sbin
- $TARGET/sbin/$i
- [ -e /usr/sbin/$i ] ; then
- cp /usr/sbin/$i $TARGET/usr/sbin
- $TARGET/usr/sbin/$i
- error "cannot locate /sbin/$i nor /usr/sbin/$i"
- done
fi
# busybox updaten
echo "update busybox"
cd $WORK/src/busybox
make all
make install
cd _install
tar czf $WORK/bb.tgz *
cd $TARGET
tar xzvf $WORK/bb.tgz
cd $WORK
# dropbear updaten
echo "update dropbear"
cd $WORK/src/dropbear
make dropbearmulti
cp dropbearmulti $TARGET/usr/sbin
ln -s dropbearmulti $TARGET/usr/sbin/dropbear
ln -s dropbearmulti $TARGET/usr/sbin/dropbearkey
ln -s dropbearmulti $TARGET/usr/sbin/dropbearconvert
make scp
cp scp $TARGET/usr/bin
# tinylogin updaten
echo "update tinylogin"
cd $WORK/src/tinylogin
make all
make install
cd _install
tar czf $WORK/tl.tgz *
cd $TARGET
tar xzvf $WORK/tl.tgz
cd $WORK
# copy needed libs
echo "copy terminfo :"
mkdir -p $TARGET/usr/share/terminfo/l
cp -puv /usr/share/terminfo/l/linux $TARGET/usr/share/terminfo/l
mkdir -p $TARGET/usr/lib/terminfo/l
cp -puv /usr/lib/terminfo/l/linux $TARGET/usr/lib/terminfo/l
echo "copy pam & co:"
cp -av /etc/pam.d $TARGET/etc
cp -av /etc/security $TARGET/etc
cp -av /etc/nsswitch.conf $TARGET/etc
echo "copy /lib/security/*"
mkdir -p $TARGET/lib/security
cp -r /lib/security/* $TARGET/lib/security
echo "copy ld-linux.so.*"
for i in /lib/ld-linux.so.[0-9] ; do
- cp $i $TARGET/lib
- $TARGET/$i
done
echo "copy libnss*"
for i in /lib/libnss* ; do
- cp $i $TARGET/lib
- $TARGET/$i
done
echo "copy libraries dynamic ..."
LIBS=$( ldd $TARGET/sbin/* $TARGET/bin/* $TARGET/usr/bin/* $TARGET/usr/sbin/* $TARGET/lib/security/* 2> /dev/null | grep ":space:∞lib" | awk '{print $1}' | sort -u )
echo "copy $LIBS to /lib :"
for i in $LIBS ; do
- [ -e /lib/$i ] ; then
- cp /lib/$i $TARGET/lib
- $TARGET/lib/$i
- [ -e /usr/lib/$i ] ; then
- cp /usr/lib/$i $TARGET/usr/lib
- $TARGET/usr/lib/$i
- error "cannot locate /lib/$i nor /usr/lib/$i"
- done
:code:
Zum Abschluß wird target ins Flash kopiert:
:code:
cp -a target/* $FLASH
:code:
Fortsetzung folgt...
Löschungen:
Embedded Kanotix
So meldet sich mein Rechner blackbox per SSH:
:code:
BusyBox? v1.00-rc3? (2004.09.30-12:24+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ # uname -a
Linux blackbox 2.6.8.1-kanotix-5 #1 Sun Sep 19 14:41:18 CEST 2004 i586 unknown
~ # df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda1 30721 7660 21475 26% /
tmpfs 29224 4 29220 0% /tmp
~ # free
- used free shared buffers
- 58448 5984 52464 0 152
Swap: 0 0 0
Total: 58448 5984 52464
~ #
:code:
Hardware: PC104, 32MB Compact Flash, 64MB Ram, National Geode GX1 Prozessor mit 200 MHz
Software: Ein (bis zur Unkenntlichkeit) abgespecktes Kanotix BH8. Original Kernel, original libc, busybox, dropbear (SSH) und tinylogin.
Mein Kochrezept, um ein Embedded Kanotix zu realisieren:
Ein paar Definitionen
:code:DEVICE=/dev/sdc
PARTITION=/dev/sdc1?
# Mountpoint
FLASH=/mnt/sdc1?:code:
1.) bootbare Linux Partition anlegen
:code:cfdisk $code ∞:
2.) Filesystem erzeugen
:code:mkfs.ext2? $code ∞:
3.) Checks ausschalten
:code:tune2fs? -c 0 -i 0 $code ∞:
4.) CF mounten
:code:mount $PARTITION $code ∞:
5.) $FLASH/lost+found kann gelöscht werden
6.) GRUB installieren
:code:grub-install --no-floppy --root-directory=$FLASH $DEVICE
echo "(hd0?) /dev/hda" > $FLASH/boot/grub/device.map:code:
7.) kernel -> $FLASH/boot/vmlinuz kopieren
8.) Benötigte Module nach $FLASH/lib/modules... kopieren
9.) $FLASH/boot/grub/menu.lst anpassen, z.B.:
:code:
default 0
timeout 10
#German keyboard (darf nur einmal aufgerufen werden)
setkey y z
setkey z y
setkey Y Z
setkey Z Y
setkey equal parenright
setkey parenright parenleft
setkey parenleft asterisk
setkey doublequote at
setkey plus bracketright
setkey minus slash
setkey slash ampersand
setkey ampersand percent
setkey percent caret
setkey underscore question
setkey question underscore
setkey semicolon less
setkey less numbersign
setkey numbersign backslash
setkey colon greater
setkey greater bar
setkey asterisk braceright
title Linux ash.static
- (hd0?,0)
- /boot/vmlinuz root=/dev/hda1 init=/bin/ash.static
title Linux
- (hd0?,0)
- /boot/vmlinuz root=/dev/hda1
- :code:
10.) Eine minimale Shell zur Verfügung stellen
:code:mkdir $FLASH/bin
cp -a /bin/ash.static $FLASH/bin:code:
11.) Devices einrichten
:code:mkdir $FLASH/dev
for n in 0 1 2 3 4 5 6 7 8 9; do
- $FLASH/dev/tty$n c 4 $n
- root:tty $FLASH/dev/tty$n
- 666 $FLASH/dev/tty$n
done
mknod $FLASH/dev/tty c 5 0
mknod $FLASH/dev/console c 5 1
:code:
12.) UNIX 98 pty devices einrichten, noch nicht nötig
:code:mkdir $FLASH/dev/pts
mknod $FLASH/dev/ptmx c 5 2:code:
Jetzt müßte der Kernel schon mal mit ash.static starten...
# Auf meinem Entwicklungssystem besteht folgende Verzeichnisstruktur:
:code:
/root
/projects
/blackbox
/src
/busybox
/dropbear
/tinylogin
/target
...
/template
...
- target
- template
- tgz
:code:
Wenn der Kernel mit ash.static startet, dann ein Abbild in template erzeugen.
:code:cp -a $FLASH/* template:code:
und mit ./make_template ein komprimiertes Abbild erzeugen.
make_template:
:code:
#!/bin/sh
cd template
tar cvfz ../template.tgz
:code:
In template/etc sind jetzt einige Anpassungen nötig, bei mir siehts so aus:
:code:
/dropbear
/init.d
/rcS?.d
busybox.conf
fstab
hosts
hostname
inittab
group
gshadow
passwd
shadow
:code:
Das Verzeichnis dropbear enthält die SSH-keys.
group, gshadow, passwd und shadow können (erstmal) vom Entwicklungsrechner übernommen werden.
fstab:
:code:/dev/hda1 / ext2? defaults 0 0
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
pts /dev/pts devpts gid=5,mode=0620 0 0
:code:
hosts und hostname sind klar.
init.d und rcS?.d gehören zu init, inittab weicht allerdings vom Standard ab, da busybox verwendet wird.
inittab:
:code:
# Run first
::sysinit:/etc/init.d/rcS?
#
::ctrlaltdel:/sbin/reboot
# To do before rebooting
::shutdown:/bin/umount -a -r
# Restart init
::restart:/sbin/init
#Shells on tty1?..4
tty1?::respawn:/sbin/getty 38400 /dev/tty1?
tty2?::respawn:/sbin/getty 38400 /dev/tty2?
tty3?::respawn:/sbin/getty 38400 /dev/tty3?
tty4?::respawn:/sbin/getty 38400 /dev/tty4?
:code:
Drei Softwarepakete liefern kompakte Programme für den Embedded-Bereich:
busybox http://busybox.net∞ stellt die meisten Tools zur Verfügung.
tinylogin http://tinylogin.busybox.net∞ liefert login, getty, passwd, su,...
dropbear http://matt.ucc.asn.au/dropbear∞ liefert ssh-Server und -Client.
Die Quellen nach src installieren und anpassen. Die Default-Werte sind soweit ganz gut. Nur bei dropbear habe ich "dropbearmulti" in options.h eingestellt.
Mit make_target wird jetzt alles zusammen gemixt, template.tgz wird entpackt, zusätzliche (Standard-)Programme werden kopiert, busybox, dropbear und tinylogin werden installiert, einige Standard-Libraries (pam, terminfo,..) werden installiert und anschließend werden per ldd alle Library-Abhängigkeiten ermittelt und die zugehörigen *.so kopiert.
make_target:
:code:
#!/bin/sh
WORK="/root/projects/blackbox
TARGET="$WORK/target"
#BINS="clear dmesg fuser gawk login netcat passwd pico rz scp setserial sftp smbclient smbpasswd ssh ssh-add ssh-agent ssh-keyconverter ssh-keygen ssh-keyscan strace stty su sudo sz zip"
#SBINS="dhcpcd dhcpd hwclock mgetty netdate nmbd nscd portmap pppd smbd sshd tcpd"
BINS="fuser apm"
SBINS="hwclock"
function error {
- " ERROR: " $* " ERROR"
}
function do_cp {
- -puv $1 $2 || error "cp $1 $2"
}
# MAIN
if [ ! -d $TARGET ] ; then
- "could not find the target-directory $TARGET"
- 1;
fi
echo "first we delete old stuff"
rm -rf $TARGET/*
echo "install template"
cd $TARGET
tar xzvf $WORK/template.tgz
cd $WORK
if [ "$BINS" ] ; then
- "copy $BINS to /bin:"
- -p $TARGET/bin
- -p $TARGET/usr/bin
- i in $BINS ; do
- [ -e /bin/$i ] ; then
- cp /bin/$i $TARGET/bin
- $TARGET/bin/$i
- [ -e /usr/bin/$i ] ; then
- cp /usr/bin/$i $TARGET/usr/bin
- $TARGET/usr/bin/$i
- error "cannot locate /bin/$i nor /usr/bin/$i"
- done
fi
if [ "$SBINS" ] ; then
- "copy $SBINS to /sbin:"
- -p $TARGET/sbin
- -p $TARGET/usr/sbin
- i in $SBINS ; do
- [ -e /sbin/$i ] ; then
- cp /sbin/$i $TARGET/sbin
- $TARGET/sbin/$i
- [ -e /usr/sbin/$i ] ; then
- cp /usr/sbin/$i $TARGET/usr/sbin
- $TARGET/usr/sbin/$i
- error "cannot locate /sbin/$i nor /usr/sbin/$i"
- done
fi
# busybox updaten
echo "update busybox"
cd $WORK/src/busybox
make all
make install
cd _install
tar czf $WORK/bb.tgz *
cd $TARGET
tar xzvf $WORK/bb.tgz
cd $WORK
# dropbear updaten
echo "update dropbear"
cd $WORK/src/dropbear
make dropbearmulti
cp dropbearmulti $TARGET/usr/sbin
ln -s dropbearmulti $TARGET/usr/sbin/dropbear
ln -s dropbearmulti $TARGET/usr/sbin/dropbearkey
ln -s dropbearmulti $TARGET/usr/sbin/dropbearconvert
make scp
cp scp $TARGET/usr/bin
# tinylogin updaten
echo "update tinylogin"
cd $WORK/src/tinylogin
make all
make install
cd _install
tar czf $WORK/tl.tgz *
cd $TARGET
tar xzvf $WORK/tl.tgz
cd $WORK
# copy needed libs
echo "copy terminfo :"
mkdir -p $TARGET/usr/share/terminfo/l
cp -puv /usr/share/terminfo/l/linux $TARGET/usr/share/terminfo/l
mkdir -p $TARGET/usr/lib/terminfo/l
cp -puv /usr/lib/terminfo/l/linux $TARGET/usr/lib/terminfo/l
echo "copy pam & co:"
cp -av /etc/pam.d $TARGET/etc
cp -av /etc/security $TARGET/etc
cp -av /etc/nsswitch.conf $TARGET/etc
echo "copy /lib/security/*"
mkdir -p $TARGET/lib/security
cp -r /lib/security/* $TARGET/lib/security
echo "copy ld-linux.so.*"
for i in /lib/ld-linux.so.[0-9] ; do
- cp $i $TARGET/lib
- $TARGET/$i
done
echo "copy libnss*"
for i in /lib/libnss* ; do
- cp $i $TARGET/lib
- $TARGET/$i
done
echo "copy libraries dynamic ..."
LIBS=$( ldd $TARGET/sbin/* $TARGET/bin/* $TARGET/usr/bin/* $TARGET/usr/sbin/* $TARGET/lib/security/* 2> /dev/null | grep ":space:∞lib" | awk '{print $1}' | sort -u )
echo "copy $LIBS to /lib :"
for i in $LIBS ; do
- [ -e /lib/$i ] ; then
- cp /lib/$i $TARGET/lib
- $TARGET/lib/$i
- [ -e /usr/lib/$i ] ; then
- cp /usr/lib/$i $TARGET/usr/lib
- $TARGET/usr/lib/$i
- error "cannot locate /lib/$i nor /usr/lib/$i"
- done
:code:
Zum Abschluß wird target ins Flash kopiert:
:code:
cp -a target/* $FLASH
:code:
Fortsetzung folgt...
älteste bekannte Version dieser Seite wurde bearbeitet am 2004-10-04 17:36:52 von HoRo [ ]
Embedded Kanotix
So meldet sich mein Rechner blackbox per SSH:
:code:
BusyBox? v1.00-
rc3? (2004.09.30-12:24+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ # uname -a
Linux blackbox 2.6.8.1-kanotix-5 #1 Sun Sep 19 14:41:18 CEST 2004 i586 unknown
~ # df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/
hda1 30721 7660 21475 26% /
tmpfs 29224 4 29220 0% /tmp
~ # free
- used free shared buffers
- 58448 5984 52464 0 152
Swap: 0 0 0
Total: 58448 5984 52464
~ #
:code:
Hardware: PC104, 32MB Compact Flash, 64MB Ram, National Geode GX1 Prozessor mit 200 MHz
Software: Ein (bis zur Unkenntlichkeit) abgespecktes Kanotix BH8. Original Kernel, original libc, busybox, dropbear (SSH) und tinylogin.
Mein Kochrezept, um ein Embedded Kanotix zu realisieren:
Ein paar Definitionen
:code:DEVICE=/dev/sdc
PARTITION=/dev/
sdc1?
# Mountpoint
FLASH=/mnt/
sdc1?:code:
1.) bootbare Linux Partition anlegen
:code:cfdisk $
code ∞:
2.) Filesystem erzeugen
:code:mkfs.
ext2? $
code ∞:
3.) Checks ausschalten
:code:
tune2fs? -c 0 -i 0 $
code ∞:
4.) CF mounten
:code:mount $PARTITION $
code ∞:
5.) $FLASH/lost+found kann gelöscht werden
6.) GRUB installieren
:code:grub-install --no-floppy --root-directory=$FLASH $DEVICE
echo "(
hd0?) /dev/hda" > $FLASH/boot/grub/device.map:code:
7.) kernel -> $FLASH/boot/vmlinuz kopieren
8.) Benötigte Module nach $FLASH/lib/modules... kopieren
9.) $FLASH/boot/grub/menu.lst anpassen, z.B.:
:code:
default 0
timeout 10
#German keyboard (darf nur einmal aufgerufen werden)
setkey y z
setkey z y
setkey Y Z
setkey Z Y
setkey equal parenright
setkey parenright parenleft
setkey parenleft asterisk
setkey doublequote at
setkey plus bracketright
setkey minus slash
setkey slash ampersand
setkey ampersand percent
setkey percent caret
setkey underscore question
setkey question underscore
setkey semicolon less
setkey less numbersign
setkey numbersign backslash
setkey colon greater
setkey greater bar
setkey asterisk braceright
title Linux ash.static
- (hd0?,0)
- /boot/vmlinuz root=/dev/hda1 init=/bin/ash.static
title Linux
- (hd0?,0)
- /boot/vmlinuz root=/dev/hda1
- :code:
10.) Eine minimale Shell zur Verfügung stellen
:code:mkdir $FLASH/bin
cp -a /bin/ash.static $FLASH/bin:code:
11.) Devices einrichten
:code:mkdir $FLASH/dev
for n in 0 1 2 3 4 5 6 7 8 9; do
- $FLASH/dev/tty$n c 4 $n
- root:tty $FLASH/dev/tty$n
- 666 $FLASH/dev/tty$n
done
mknod $FLASH/dev/tty c 5 0
mknod $FLASH/dev/console c 5 1
:code:
12.) UNIX 98 pty devices einrichten, noch nicht nötig
:code:mkdir $FLASH/dev/pts
mknod $FLASH/dev/ptmx c 5 2:code:
Jetzt müßte der Kernel schon mal mit ash.static starten...
# Auf meinem Entwicklungssystem besteht folgende Verzeichnisstruktur:
:code:
/root
/projects
/blackbox
/src
/busybox
/dropbear
/tinylogin
/target
...
/template
...
- target
- template
- tgz
:code:
Wenn der Kernel mit ash.static startet, dann ein Abbild in template erzeugen.
:code:cp -a $FLASH/* template:code:
und mit ./make_template ein komprimiertes Abbild erzeugen.
make_template:
:code:
#!/bin/sh
cd template
tar cvfz ../template.tgz
:code:
In template/etc sind jetzt einige Anpassungen nötig, bei mir siehts so aus:
:code:
/dropbear
/init.d
/
rcS?.d
busybox.conf
fstab
hosts
hostname
inittab
group
gshadow
passwd
shadow
:code:
Das Verzeichnis dropbear enthält die SSH-keys.
group, gshadow, passwd und shadow können (erstmal) vom Entwicklungsrechner übernommen werden.
fstab:
:code:/dev/
hda1 /
ext2? defaults 0 0
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
pts /dev/pts devpts gid=5,mode=0620 0 0
:code:
hosts und hostname sind klar.
init.d und
rcS?.d gehören zu init, inittab weicht allerdings vom Standard ab, da busybox verwendet wird.
inittab:
:code:
# Run first
::sysinit:/etc/init.d/
rcS?
#
::ctrlaltdel:/sbin/reboot
# To do before rebooting
::shutdown:/bin/umount -a -r
# Restart init
::restart:/sbin/init
#Shells on
tty1?..4
tty1?::respawn:/sbin/getty 38400 /dev/
tty1?
tty2?::respawn:/sbin/getty 38400 /dev/
tty2?
tty3?::respawn:/sbin/getty 38400 /dev/
tty3?
tty4?::respawn:/sbin/getty 38400 /dev/
tty4?
:code:
Drei Softwarepakete liefern kompakte Programme für den Embedded-Bereich:
busybox
http://busybox.net∞ stellt die meisten Tools zur Verfügung.
tinylogin
http://tinylogin.busybox.net∞ liefert login, getty, passwd, su,...
dropbear
http://matt.ucc.asn.au/dropbear∞ liefert ssh-Server und -Client.
Die Quellen nach src installieren und anpassen. Die Default-Werte sind soweit ganz gut. Nur bei dropbear habe ich "dropbearmulti" in options.h eingestellt.
Mit make_target wird jetzt alles zusammen gemixt, template.tgz wird entpackt, zusätzliche (Standard-)Programme werden kopiert, busybox, dropbear und tinylogin werden installiert, einige Standard-Libraries (pam, terminfo,..) werden installiert und anschließend werden per ldd alle Library-Abhängigkeiten ermittelt und die zugehörigen *.so kopiert.
make_target:
:code:
#!/bin/sh
WORK="/root/projects/blackbox
TARGET="$WORK/target"
#BINS="clear dmesg fuser gawk login netcat passwd pico rz scp setserial sftp smbclient smbpasswd ssh ssh-add ssh-agent ssh-keyconverter ssh-keygen ssh-keyscan strace stty su sudo sz zip"
#SBINS="dhcpcd dhcpd hwclock mgetty netdate nmbd nscd portmap pppd smbd sshd tcpd"
BINS="fuser apm"
SBINS="hwclock"
function error {
- " ERROR: " $* " ERROR"
}
function do_cp {
- -puv $1 $2 || error "cp $1 $2"
}
# MAIN
if [ ! -d $TARGET ] ; then
- "could not find the target-directory $TARGET"
- 1;
fi
echo "first we delete old stuff"
rm -rf $TARGET/*
echo "install template"
cd $TARGET
tar xzvf $WORK/template.tgz
cd $WORK
if [ "$BINS" ] ; then
- "copy $BINS to /bin:"
- -p $TARGET/bin
- -p $TARGET/usr/bin
- i in $BINS ; do
- [ -e /bin/$i ] ; then
- cp /bin/$i $TARGET/bin
- $TARGET/bin/$i
- [ -e /usr/bin/$i ] ; then
- cp /usr/bin/$i $TARGET/usr/bin
- $TARGET/usr/bin/$i
- error "cannot locate /bin/$i nor /usr/bin/$i"
- done
fi
if [ "$SBINS" ] ; then
- "copy $SBINS to /sbin:"
- -p $TARGET/sbin
- -p $TARGET/usr/sbin
- i in $SBINS ; do
- [ -e /sbin/$i ] ; then
- cp /sbin/$i $TARGET/sbin
- $TARGET/sbin/$i
- [ -e /usr/sbin/$i ] ; then
- cp /usr/sbin/$i $TARGET/usr/sbin
- $TARGET/usr/sbin/$i
- error "cannot locate /sbin/$i nor /usr/sbin/$i"
- done
fi
# busybox updaten
echo "update busybox"
cd $WORK/src/busybox
make all
make install
cd _install
tar czf $WORK/bb.tgz *
cd $TARGET
tar xzvf $WORK/bb.tgz
cd $WORK
# dropbear updaten
echo "update dropbear"
cd $WORK/src/dropbear
make dropbearmulti
cp dropbearmulti $TARGET/usr/sbin
ln -s dropbearmulti $TARGET/usr/sbin/dropbear
ln -s dropbearmulti $TARGET/usr/sbin/dropbearkey
ln -s dropbearmulti $TARGET/usr/sbin/dropbearconvert
make scp
cp scp $TARGET/usr/bin
# tinylogin updaten
echo "update tinylogin"
cd $WORK/src/tinylogin
make all
make install
cd _install
tar czf $WORK/tl.tgz *
cd $TARGET
tar xzvf $WORK/tl.tgz
cd $WORK
# copy needed libs
echo "copy terminfo :"
mkdir -p $TARGET/usr/share/terminfo/l
cp -puv /usr/share/terminfo/l/linux $TARGET/usr/share/terminfo/l
mkdir -p $TARGET/usr/lib/terminfo/l
cp -puv /usr/lib/terminfo/l/linux $TARGET/usr/lib/terminfo/l
echo "copy pam & co:"
cp -av /etc/pam.d $TARGET/etc
cp -av /etc/security $TARGET/etc
cp -av /etc/nsswitch.conf $TARGET/etc
echo "copy /lib/security/*"
mkdir -p $TARGET/lib/security
cp -r /lib/security/* $TARGET/lib/security
echo "copy ld-linux.so.*"
for i in /lib/ld-linux.so.[0-9] ; do
- cp $i $TARGET/lib
- $TARGET/$i
done
echo "copy libnss*"
for i in /lib/libnss* ; do
- cp $i $TARGET/lib
- $TARGET/$i
done
echo "copy libraries dynamic ..."
LIBS=$( ldd $TARGET/sbin/* $TARGET/bin/* $TARGET/usr/bin/* $TARGET/usr/sbin/* $TARGET/lib/security/* 2> /dev/null | grep "
:space:∞lib" | awk '{print $1}' | sort -u )
echo "copy $LIBS to /lib :"
for i in $LIBS ; do
- [ -e /lib/$i ] ; then
- cp /lib/$i $TARGET/lib
- $TARGET/lib/$i
- [ -e /usr/lib/$i ] ; then
- cp /usr/lib/$i $TARGET/usr/lib
- $TARGET/usr/lib/$i
- error "cannot locate /lib/$i nor /usr/lib/$i"
- done
:code:
Zum Abschluß wird target ins Flash kopiert:
:code:
cp -a target/* $FLASH
:code:
Fortsetzung folgt...
Letzter Editor :
Eigentümer :