Am pus de cateva zile pe niste statii diskless cu root prin NFS un
ramdisk cu busybox pt. diagnosticare in caz ca pica interfata din
varii motive. Sau cel putin asta era intentia...
Am un script care tine in bucla un shell busybox pe tty11 si care
testeaza in background conexiunea la retea. Cand vede c-a picat,
intentia lui e sa faca "./bin/chroot . chvt 11" ca sa ma scoata din
X si sa ma dea la consola. Numai ca... atunci cand pica interfata si
asta face chvt, ce era afisat de X pe ecran se "adapteaza" noii
rezolutii si ingheata tot. Comanda respectiva merge perfect pana
cand se duce naibii reteaua.
Vreo idee cum as putea rezolva problema asta?
Scriptul de care zic arata cam asa:
--------- Cut ---------
#!/bin/bash
Connectivity()
{
while ./bin/ping -c 1 dcerouter &>/dev/null; do
./bin/sleep 5
done
}
ShellLoop()
{
exec </dev/tty11 &>/dev/tty11
while :; do
bin/sh
bin/sleep 1
done
}
Emergency()
{
Connectivity
./bin/chroot . chvt 11
}
mke2fs -m 0 /dev/ram0
mkdir -p /mnt/recovery-rd
mount /dev/ram0 /mnt/recovery-rd
cd /mnt/recovery-rd
tar -xjf /usr/local/ramdisk.tar.bz2
mount -t devfs devfs dev
mount -t proc proc proc
Emergency &
ShellLoop &
--------- Cut ---------
Mai scosesem eu o bucata de cod din chvt si am compilat static, dar
nu prea merge:
--------- Cut ---------
#include <fcntl.h>
#define VT_ACTIVATE 0x5606
#define VT_WAITACTIVE 0x5607
int main()
{
int fd;
fd = open("./dev/tty", O_RDWR);
ioctl(fd, VT_ACTIVATE, 11);
ioctl(fd, VT_WAITACTIVE, 11);
return 0;
}
--------- Cut ---------
A mers la teste, dar in practica, ioctl-urile alea zic -1 EINVAL.
moon2:/mnt/recovery-rd# strace ./bin/chvt-11
execve("./bin/chvt-11", ["./bin/chvt-11"], [/* 15 vars */]) = 0
uname({sys="Linux", node="moon2", ...}) = 0
brk(0) = 0x80af000
brk(0x80d0000) = 0x80d0000
open("./dev/tty", O_RDWR) = 3
ioctl(3, VIDIOC_G_COMP or VT_ACTIVATE, 0xb) = -1 EINVAL (Invalid argument)
ioctl(3, VIDIOC_S_COMP or VT_WAITACTIVE, 0xb) = -1 EINVAL (Invalid argument)
exit_group(0) = ?
---
Detalii despre listele noastre de mail: http://www.lug.ro/