|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 28 Sep 2002 19:06:27 To : All Subject : headless shutdown --------------------------------------------------------------------------------
Тут кто-то интересовался, как заставить систему погудеть динамиком
после того, как диски отмонтированы во время shutdown, чтобы знать,
что можно уже выключить питание, когда нет консоли у машины.
Теперь есть патч для этого. Пользоваться так:
cd /usr/src/sys; patch </path/to/patch
Потом пересобрать ядро (через config или make kernel, неважно)
и перегрузиться.
Патч вводит четыре новых целочисленных sysctl:
kern.shutdown.beep_duration - длительность гудка в милисекундах,
ноль - нет гудков (по умолчанию)
kern.shutdown.beep_hz - высота тона в герцах,
ноль - нет гудков (по умолчанию)
kern.shutdown.beep_number - количество гудков,
ноль - нет гудков (по умолчанию)
kern.shutdown.beep_pause - пауза между гудками в милисекундах,
ноль - бесконечный гудок (1 по умолчанию)
Гудки выдаются после того, как система выведет:
>The operating system has halted
>Please press any key to reboot
Выдаются при halt, shutdown -h. Hе выдаются при reboot, shutdown -r.
Критика приветствуется. Enjoy.
Index: i386/include/clock.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/clock.h,v
retrieving revision 1.38
diff -u -r1.38 clock.h
- --- i386/include/clock.h 29 Dec 1999 04:32:58 -0000 1.38
+++ i386/include/clock.h 28 Sep 2002 08:46:50 -0000
@@ -44,6 +44,7 @@
int release_timer1 __P((void));
#endif
int sysbeep __P((int pitch, int period));
+void sysbeepstop __P((void *chan));
void i8254_restore __P((void));
#endif /* _KERNEL */
Index: i386/isa/clock.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/clock.c,v
retrieving revision 1.149.2.5
diff -u -r1.149.2.5 clock.c
- --- i386/isa/clock.c 30 Jun 2002 07:56:49 -0000 1.149.2.5
+++ i386/isa/clock.c 28 Sep 2002 08:41:43 -0000
@@ -509,7 +509,7 @@
#endif
}
-static void
+void
sysbeepstop(void *chan)
{
outb(IO_PPI, inb(IO_PPI)&0xFC); /* disable counter2 output to speaker */
Index: kern/kern_shutdown.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_shutdown.c,v
retrieving revision 1.72.2.12
diff -u -r1.72.2.12 kern_shutdown.c
- --- kern/kern_shutdown.c 21 Feb 2002 19:15:10 -0000 1.72.2.12
+++ kern/kern_shutdown.c 28 Sep 2002 10:31:21 -0000
@@ -324,7 +324,28 @@
/*
* If the shutdown was a clean halt, behave accordingly.
+ * Issue beeps if requested. It may be useful for headless system shutdown.
*/
+
+static unsigned beep_duration = 0; /* duration of beep in miliseconds */
+ /* zero disables beeps */
+static unsigned beep_hz = 0; /* tone of beep in hertz, zero - no beeps */
+static unsigned beep_number = 0; /* number of beeps, zero disables beeps */
+static unsigned beep_pause = 1; /* pause between beeps, zero-infinite beep */
+
+SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_duration, CTLFLAG_RW,
+ &beep_duration, 0, "");
+SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_hz, CTLFLAG_RW,
+ &beep_hz, 0, "");
+SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_number, CTLFLAG_RW,
+ &beep_number, 0, "");
+SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_pause, CTLFLAG_RW,
+ &beep_pause, 0, "");
+
+#ifndef TIMER_FREQ
+#define TIMER_FREQ 1193182
+#endif
+
static void
shutdown_halt(void *junk, int howto)
{
@@ -332,6 +353,26 @@
printf("\n");
printf("The operating system has halted.\n");
printf("Please press any key to reboot.\n\n");
+
+ if (beep_hz>0 && beep_duration>0 &&
+ beep_number>0 ) { /* Beeps requested */
+ int i;
+ if (beep_pause<0) beep_pause=1;
+ for (i=1; i<beep_number; i++) {
+ sysbeep(TIMER_FREQ/beep_hz,0); /* Issue one */
+ DELAY(beep_duration*1000);
+ if (beep_pause>0) {
+ sysbeepstop(NULL); /* Do pause */
+ DELAY(beep_pause*1000);
+ }
+ }
+ sysbeep(TIMER_FREQ/beep_hz,0);
+ if (beep_pause>0) { /* Zero pause gives infinite */
+ DELAY(beep_duration*1000);
+ sysbeepstop(NULL);
+ }
+ }
+
switch (cngetc()) {
case -1: /* No console, just die */
cpu_halt();
Eugene
--- slrn/0.9.7.4 (FreeBSD)
* Origin: Svyaz Service JSC (2:5006/1@fidonet)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/8869c85b52d2.html, оценка из 5, голосов 10
|