å®¶åºçšã³ã³ããŒãã³ãããçµã¿ç«ãŠããããµãŒããŒã®æ¬ ç¹ã®ããã€ããæé€ããããã«ãæè¿å
±æãããããã€ã¹ãéçºããŸããã ãã®è©³çްãªèª¬æã¯ãã¹ããŒã ãšãœãŒã¹ã³ãŒããšãšãã«ã æåã®ããŒãã«ãããŸãã
èšäºã®ãã®ããŒãã§ã¯ãã«ãŒãã«ç©ºéã®ã·ãªã¢ã«ããŒããšããåãããæ¹æ³ãšãLinuxã®RS232ãä»ããŠè€æ°ã®ããã€ã¹ãµãã·ã¹ãã ã§äœæ¥ãæŽçããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ããã€ã¹ã«ã¯ã次ã®ãµãã·ã¹ãã ãå«ãŸããŸãã
watchdog
ããŒã¢ã³ã§åäœããããŒããŠã§ã¢ãŠã©ããããã°ã- çã®ä¹±æ°ãžã§ãã¬ãŒã¿ãŒã
- èªåŸã»ã³ãµãŒããããŒã¿ãåéããããã®nRF24L01 +ç¡ç·ã¢ãžã¥ãŒã«ã

çžå¯Ÿçã«èšãã°ãã·ãªã¢ã«ããŒãã¯2ã€ã®ãšã³ããã€ã³ãïŒãšã³ããã€ã³ãïŒã§ãã ãã®å Žåãå°ãªããšã4ã€å¿
èŠã§ãã
- ã³ãã³ãã転éããŸãã
- åçãèªã;
- ä¹±æ°ã®ã¹ããªãŒã ãåä¿¡ããŸãã
- ã»ã³ãµãŒããããŒã¿ãåä¿¡ããŸãã
ãã®åé¡ã¯ãã³ãã³ããããã€ã¹ã«çŽæ¥çºè¡ããããã£ã¹ãããã£ã䜿çšããŠããã€ã¹ããã®ãã©ãã£ãã¯ãéã¢ã»ã³ãã«ãããå Žåã«è§£æ±ºã§ããŸãã ã¢ã€ãã¢ã¯ãããã€ãã®æèã®åŸã次ã®åœ¢åŒãåããŸããã
ïŒã¯ãªãã¯ããŠæ¡å€§ïŒ

ããã§ãããã¯ã°ã©ãŠã³ãããã»ã¹ïŒããŒã¢ã³ïŒ wrnd
ã¯ãã£ã¹ãããã£ãšããŠæ©èœããŸãããã®ç®çã¯ã3ã€ã®FIFOãã£ãã«ã§ãã©ãã£ãã¯ããã£ã«ã¿ãªã³ã°ããããšã§ãã
- rng.fifo-ä¹±æ°ã®ã¹ããªãŒã ã
- nrf.fifo-ã»ã³ãµãŒããã®ããŒã¿ã¹ããªãŒã ã
- cmd.fifo-ã³ãã³ãã«ãã£ãŠè¿ãããããŒã¿ã
ãã€ã¢ã°ã©ã ã«ã¯ä»¥äžã瀺ãããŠããŸãã
- wrn_wdt-ãŠã©ããããã°ã¿ã€ããŒãå¶åŸ¡ãããã£ã©ã¯ã¿ãŒããã€ã¹ãã©ã€ããŒ
/dev/watchdog
éçº/dev/watchdog
ã - wrnctrl-ãã¡ãŒã ãŠã§ã¢ãç£èŠãããã³ããã€ã¹ç®¡ççšã®ãŠãŒãã£ãªãã£ã
- ãªã¬ã³ãžã¯ããããžã§ã¯ãã察話ãããµãŒãã¹ã瀺ããŸãã
ã³ãã³ãã¯ã [C|W|R|N][0-99]:[1]
ã®åœ¢åŒã§ããã¹ã圢åŒã§ããã€ã¹ã«éä¿¡ãããŸããæåã®æåã¯ãµãã·ã¹ãã ã®èå¥åã§ãããã³ãã³ãçªå·ãšåŒæ°ã¯ã³ãã³ã®åŸã«ç¶ããŸãã
åºæ¬çã«ããœãããŠã§ã¢ã¯çŽç²ãªCã§èšè¿°ãããŠãããBashããã³Makefileã«ã¹ã¯ãªãããå«ãŸããŠããŸãã ã€ã³ã¹ããŒã©ãŒã¯Gentooçšã«èšèšãããŠããŸãããå¿
èŠã«å¿ããŠä»ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ç°¡åã«é©åãããããšãã§ããŸãã
ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã¯ã wrndãã£ã¬ã¯ããªã®GitHub alexcustos / wrn-projectã§å
¥æã§ããŸãã ã³ãŒãã«ã¯ãã»ã³ãµãŒããã®åŠçããŒã¿ãå«ãŸããŠããŸãããã®ããŒã¿ã¯ã ATtiny85ïŒãããã¿ã€ãã¯ã€ã€ã¬ã¹ã»ã³ãµãŒã«ãããŸãã
ãã¹ãŠã®ã³ã³ããŒãã³ãã«ã€ããŠããã«è©³ãã説æããŸãã
é転æ
èšäºã®å
¬éåŸãwdt.fifoãã£ãã«ããããžã§ã¯ãã«è¿œå ãããŸãããããã¯ã wrnd
ããŒã¢ã³ã«ãã£ãŠæäŸãããããã€ã¹ãã¡ã€ã«/dev/watchdog
ãè€è£œããŸãã äž¡æ¹ã®ãªãã·ã§ã³ã¯ã watchdog
ããŒã¢ã³ã䜿çšããã®ã«é©ããŠãããäžè¬çã«äŒŒãŠããŸãã ãããã£ãŠã以äžã®æ
å ±ã¯é¢é£æ§ãããããŠã©ããããã°ã¿ã€ããŒãã©ã€ããŒã®åäœæ¹æ³ãç¥ãããå Žåã«åœ¹ç«ã¡ãŸãã
ããã°ã©ãã³ã°ã®èгç¹ããèŠããšãLinuxãã©ã€ããŒã¯éåžžã«åçŽã§ãã ãããã®éçºã¯ãå€ãã®ããææžåãããäŸãã«ãŒãã«ãœãŒã¹ããªãŒã§å©çšå¯èœã§ãããšããäºå®ã«ãã£ãŠç°¡çŽ åãããŠããŸãã èšç»ãã³ã³ãã€ã«ããã³ãããã°ããããšããå Žåã«ã®ã¿ãããã€ãã®åé¡ãçºçããå¯èœæ§ããããŸãã äºå®ãã«ãŒãã«ç©ºéã§ã¯ãglibcã©ã€ãã©ãªã®äœ¿ãæ
£ãã颿°ã¯äœ¿çšã§ãããã«ãŒãã«ã§æç€ºããã颿°ã®ã¿ã䜿çšã§ããŸãã ããã«ãã€ã³ã¿ã©ã¯ãã£ããªã³ãŒãã®ãããã°ã¯éåžžã«å°é£ã§ãã
ãããããã®å Žåããã£ã©ã¯ã¿ãŒããã€ã¹/dev/watchdog
ãå®è£
ããã®ã¯ã¿ã¹ã¯ãéåžžã«ç°¡åãªã®ã§ãæãããšã¯ãããŸããïŒ ã³ãŒãã¯å®å
šã« wrn_wdt.cã§ã ïŒã ããã€ã¹ã¯ãã©ã€ããŒçªå·10ïŒãã®ä»ã®ããã€ã¹ïŒã«ãã£ãŠãµãŒãã¹ããããããæåã«é©åãªããŒã¿æ§é ãæ±ºå®ããå¿
èŠããããŸãã
static struct miscdevice wrn_wdt_miscdev = { .minor = WATCHDOG_MINOR,
次ã«ããã³ãã©ãŒãèšå®ããŸãã
static const struct file_operations wrn_wdt_fops = { .owner = THIS_MODULE, // .llseek = no_llseek, // .write = wrn_wdt_write, // .unlocked_ioctl = wrn_wdt_ioctl, // ioctl .open = wrn_wdt_open, // .release = wrn_wdt_release, // };
ããã§ãunlocked_ioctlãããã¯ioctlïŒïŒãä»ããŠããã€ã¹èšè¿°åã«ã¢ã¯ã»ã¹ããããã®éåžžã®ãã³ãã©ã§ãããã°ããã®éãåŒã³åºãã¯éããããã³ã°ã«ãªããŸããããããã£ãŠãå¿
èŠã«å¿ããŠåæããããã«è¿œå ã®å¯Ÿçãå¿
èŠã§ã
次ã«ãã¢ãžã¥ãŒã«ã®ããŒãããã³ã¢ã³ããŒãæäœã®ãã³ãã©ãŒãå®çŸ©ããå¿
èŠããããŸãã
module_init(wrn_wdt_init)
å¿
èŠã«å¿ããŠãmodule_paramïŒïŒãMODULE_PARM_DESCïŒïŒãä»ããŠã¢ãžã¥ãŒã«ã«ãã©ã¡ãŒã¿ãŒã远å ããé åºãæå®ã§ããŸãã
MODULE_DESCRIPTION("..."); // MODULE_AUTHOR("..."); // MODULE_LICENSE("..."); //
次ã®ã³ãã³ãã§ãã®æ
å ±ã衚瀺ã§ããŸãã
modinfo [path]/[module].ko
ãã®ã¹ãããã§ããã©ã€ããŒã¯ã»ãšãã©æºåãã§ããŠããŸãã ãããè¡ãã«ã¯ãå°ãªããšãã·ãªã¢ã«ããŒãã«ããŒã¿ãéä¿¡ããæ©èœãå¿
èŠã§ãã ããã¯ãã«ãŒãã«ã¹ããŒã¹ã§ã¯APIãæäŸãããŠããªããããçŽæ¥è¡ãããšã¯ã§ããŸããã æšæºãã©ã€ããŒã®åé€ãšç¬èªã®ãã©ã€ããŒã®éçºã«é¢é£ãããªãã·ã§ã³ã¯ãã€ããªãã®ãŒçã«æ£ãããªããã®ãšããŠããã«é€å€ã§ããŸãã ãããã£ãŠã2ã€ã®ãªãã·ã§ã³ãæ®ããŸãã
- ã«ãŒãã«ã¹ããŒã¹ããããŠãŒã¶ãŒã¹ããŒã¹ã®ãã¡ã€ã«ã·ã¹ãã ã«ã¢ã¯ã»ã¹ããŸãã
- LDISCã«ãŒãã«ã¹ããŒã¹ã«ç»é²ããŠïŒã©ã€ã³ãã£ã·ããªã³ïŒãã·ãªã¢ã«ããŒããã©ãã£ãã¯ãã€ã³ã¿ãŒã»ããããã³å¶åŸ¡ããŸãã
æåã®ãªãã·ã§ã³ãéžæããããšã¯ãã§ã«æããã§ãããããã«ã€ããŠèšãèš³ã¯ã§ããŸããã çå£ã«ãåç·å¶åŸ¡ã䜿çšããŠããã©ãã£ãã¯ãããŒãžã£ãã«ãŒãã«ç©ºéã«é
眮ããå¿
èŠããããŸãã ãã ããæ¢ã«è¿°ã¹ãããã«ããã®ç©ºéã§ã®ããã°ã©ãã³ã°ãšãããã°ã¯ç°¡åãªåé¡ã§ã¯ãªããå¯èœã§ããã°ããŠãŒã¶ãŒç©ºéã§å®è¡ã§ããI / Oæäœãšåæ§ã«ãåé¿ããå¿
èŠããããŸãã
ãããããã®ãããªãã©ã€ããŒã®äžé©åãªéçºã®äž»ãªçç±ã¯ããããããããUSBãã©ã€ããŒã§ãããã®ããã«ç¬ç«æ§ãéæããããšãã§ããªãããšã§ãã ã©ã€ã³ãã£ã·ããªã³ã¯ãããŒããã©ã¡ãŒã¿ãèšå®ããå¿
èŠãªã©ã€ã³ãã£ã·ããªã³ãèšå®ããããã«ããŠãŒã¶ãŒç©ºéã«ã³ãŒããå¿
èŠãšããåãªãã¬ã€ã€ãŒã§ãã
å¯èœã§ããã°ãéžæãè¡ãããã¡ã€ã³ãã©ã€ããŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
static int __init wrn_wdt_init(void) { int ret; // , wrnd filp_port = filp_open(serial_port, O_RDWR | O_NOCTTY | O_NDELAY, 0); if (IS_ERR(filp_port)) ... // else { ret = misc_register(&wrn_wdt_miscdev); // miscdevice if (ret == 0) wdt_timeout(); // } return ret; } static void wdt_enable(void) { ... // spin_lock(&wrn_wdt_lock); // ( ) // watchdog keep-alive interval, // WRN , getnstimeofday(&t); time_delta = (t.tv_sec - wdt_keep_alive_sent.tv_sec) * 1000; // sec to ms time_delta += (t.tv_nsec - wdt_keep_alive_sent.tv_nsec) / 1000000; // ns to ms if (time_delta >= WDT_MIN_KEEP_ALIVE_INTERVAL) { // cmd_keep_alive fs = get_fs(); // FS set_fs(get_ds()); // KERNEL_DS ( ) ret = vfs_write(filp_port, cmd_keep_alive, strlen(cmd_keep_alive), &pos); set_fs(fs); // FS if (ret != strlen(cmd_keep_alive)) ... // getnstimeofday(&wdt_keep_alive_sent); } spin_unlock(&wrn_wdt_lock); // ( ) } static long wrn_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { ... // switch (cmd) { case WDIOC_KEEPALIVE: wdt_enable(); ret = 0; break; case WDIOC_SETTIMEOUT: ret = get_user(t, (int *)arg); // ... // timeout = t; wdt_timeout(); wdt_enable(); /* */ case WDIOC_GETTIMEOUT: ret = put_user(timeout, (int *)arg); // break; ... // } return ret; }
äžèšã®ã³ãŒãã¹ãããã以å€ã§ã¯ãMAGICCLOââSEãµããŒããæ®ããŸãã ããã¯ãããã€ã¹ãã¡ã€ã«ãéãããšãã«ãã©ã€ããŒããŠã©ããããã°ãç¡å¹ã«ããããã«å¿
èŠã§ãã ãããã£ãŠãã·ã¹ãã ã«ãã£ãŠãã¡ã€ã«ãéããããwatchdog
ããŒã¢ã³ã®ç°åžžãªã·ã£ããããŠã³ãèªèããããšãéèŠã§ãã ãã®å ŽåãMAGICCLOââSEã¡ã«ããºã ã¯åèµ·åãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã ãã®ãµããŒãã¯ãç¹æ®æåïŒéåžžã¯VïŒãåä¿¡ããçŽåŸã«ããã€ã¹ãã¡ã€ã«ãéããããå Žåã«ã®ã¿ããŠã©ããããã°ã¿ã€ããŒã®éã¢ã¯ãã£ãåãæäŸããŸãã
ãã©ã€ããŒã¯ã make driver
ã³ãã³ãã§Makefileã䜿çšããŠæ§ç¯ããããã®äžéšã¯æ¬¡ã®ããšãè¡ããŸãã
TARGET_WDT = wrn_wdt ifneq ($(KERNELRELEASE),) # , obj-m := $(TARGET_WDT).o else # make KERNEL := $(shell uname -r) # driver: $(MAKE) -C /lib/modules/$(KERNEL)/build M=$(PWD) # install: driver $(MAKE) -C /lib/modules/$(KERNEL)/build M=$(PWD) modules_install endif
ã·ã¹ãã ã®èµ·åæã«ã€ã³ã¹ããŒã«åŸã«ã¢ãžã¥ãŒã«ãããŒãããã«ã¯ã次ã®è¡ã/etc/conf.d/modules
ãã¡ã€ã«ã«è¿œå ããå¿
èŠããããŸãã
modules="wrn_wdt"
æåã¢ãžã¥ãŒã«ã¯ãã³ãã³ãmodprobe wrn_wdt
ãŸãã¯insmod ./wrn_wdt.ko
modprobe wrn_wdt
insmod ./wrn_wdt.ko
ãŸãã ã¢ããããŒãïŒ modprobe -r wrn_wdt
ãŸãã¯rmmod wrn_wdt
; ã¢ãžã¥ãŒã«ãããŒããããŠããããšã確èªããŠãã ããïŒ lsmod | grep wrn_wdt
lsmod | grep wrn_wdt
ã
watchdog
ããŒã¢ã³ã®ããã€ã¹ãã¡ã€ã«ãšããŠwdt.fifoãã£ãã«ã䜿çšããå ŽåãäŸåé¢ä¿ãæ£ããèšå®ããã wrnd
ããŒã¢ã³ãããæ©ãèµ·åããåŸã§watchdog
ã忢ããããšã確èªããããšãéèŠã§ãã ããããªããšãããã«å¿ããŠãFIFOãã£ãã«ããŸã äœæãããŠããªãããã¿ã€ããŒãéã¢ã¯ãã£ãã«ãªããªããããäžèŠãªåèµ·åãçºçããå¯èœæ§ããããŸãã
鬌
wrnd
ããŒã¢ã³ã®ç®çã¯ãã·ãªã¢ã«ããŒãããã®ãã€ããªããŒã¿ã®ã¹ããªãŒã ããœãŒããããããããµãŒãã¹ã«äŸ¿å©ãªåœ¢åŒã«å€æããããšã§ãã
ã·ãªã¢ã«ããŒãèšå®ã¯ããã©ã«ãã§ããã¹ã端æ«åãã«æé©åãããŠãããããããããã©ã€ã³ã«å
¥ããããã€ã¹ãšåäœã¢ãŒãã調æŽããå¿
èŠããããŸãïŒ å®å
šãªã³ãŒãïŒ serialport.c ïŒïŒ
// termios / struct termios2 ttyopts; memset(&ttyopts, 0, sizeof ttyopts); // if (ioctl(fd, TCGETS2, &ttyopts) != 0) ... // // ttyopts.c_cflag &= ~CBAUD; ttyopts.c_cflag |= BOTHER; ttyopts.c_ispeed = speed; // unsigned int, B9600 ttyopts.c_ospeed = speed; ... // // ttyopts.c_cc[VMIN] = vmin; // ( ) ttyopts.c_cc[VTIME] = vtime; // if (ioctl(fd, TCSETS2, &ttyopts) != 0) ... //
ããã§æé©ãªVMINããã³VTIMEå€ãéžæããããšãéèŠã§ãã ãããããŒãã§ããå ŽåãããŒãã¯ã·ã¹ãã ãªãœãŒã¹ãäžå¿
èŠã«æ¶è²»ããé
å»¶ãªãã§ããŒãªã³ã°ãããŸãã ããŒã¿ããªãå ŽåããŒã以å€ã®VMINå€ã¯ããããŒãç¡å¶éã«ãããã¯ã§ããŸãã
ãã®å ŽåãããŒã¿ã¯ã¡ã€ã³ããã°ã©ã ã¹ããªãŒã ã§1ãã€ãèªã¿èŸŒãŸããŸãã é·æéãããã¯ããã®ã¯è¯ããªãã®ã§ãVMINã¯åžžã«ãŒãã§ãããVTIMEã¯ãã©ã¡ãŒã¿ãŒã§å€æŽã§ããŸããããã©ã«ãã§ã¯5ïŒæå€§é
å»¶0.5ç§ïŒã§ãã
åä¿¡ãããã€ãã¯ãåºå®ãµã€ãºã®ãããã¡ã«å°çããŸãã äºæ³ããããã€ãæ°ãåãåããšããããã¡ãŒã¯å¯Ÿå¿ããããŒã¿æ§é ïŒæ§é ïŒã«å€æãããŸãã ãã®æ¹æ³ã¯åªããŠããŸãããèŠããŠããå¿
èŠãããæ©èœããããŸãã ã³ã³ãã€ã©ã¯ããã£ãŒã«ãéã«ã¹ããŒã¹ã远å ããéåžžã¯åèªã®å¢çã«åãããŠãã£ãŒã«ããé
眮ããããšã«ãããããŒã¿æ§é ãæé©åããŸãã ããŒã¿ã¯ç°ãªããã©ãããã©ãŒã éã§éä¿¡ããããããã¯ãŒããµã€ãºãšãã€ãé ïŒãšã³ãã£ã¢ã³ïŒãç°ãªããããäžæŽåãçºçããå¯èœæ§ããããŸãã
ã¢ã©ã€ã¡ã³ããè§£æ¶ããã«ã¯ãããŒã¿æ§é ãããã¯ãšããŠå®£èšããå¿
èŠããããŸãã AtmelStudioã®ãããžã§ã¯ãã¯ããã©ã«ãã§-fpack-struct
ã¹ã€ããã䜿çšããŠ-fpack-struct
ããããããã®ããŒã®ãã£ã³ã»ã«ã«é¢ããèŠåããªãããšã確èªããŠãã ããã ããŒã¿ã¢ã¯ã»ã¹ã®é床ã®ããã«ã¡ã¢ãªãç¯çŽããã¿ã¹ã¯ããªãããããã®ããŒã䜿çšããŠwrndãããžã§ã¯ããã¢ã»ã³ãã«ããããšã¯ãå§ãã§ããŸããã å¿
èŠã«å¿ããŠã察å¿ãã屿§ãæå®ããã ãã§ååã§ããæ¬¡ã«äŸã瀺ããŸãã
struct payload_header { ...
ããã»ã¹ã¯ã daemon
æ©èœã«ãã£ãŠããã¯ã°ã©ãŠã³ãã§éå§ããdaemon
ã
if (arguments->daemonize && daemon(0, 0) < 0) ...
ãã®çµæãæ°ããPIDãæã€ããã»ã¹ïŒãã©ãŒã¯ïŒã®ã³ããŒãäœæããããããããã«æ©èœãç¶ããçŸåšã®ããã»ã¹ãçµäºããŸãã 颿°ã®åŒæ°ã¯ãæ°ããããã»ã¹ã§ã¯ãã«ãŒããã£ã¬ã¯ããªãæ©èœããããã«èšå®ããæšæºå
¥åãåºåãããã³ãšã©ãŒã¹ããªãŒã ã/dev/null
ãªãã€ã¬ã¯ãããå¿
èŠãããããšã瀺ããŠã/dev/null
ã
ãªãŒããŒãæ¥ç¶ãããŠããªãFIFOã«æžã蟌ãããšãããšãã«ããŒã¢ã³ãã·ã£ããããŠã³ããªãããã«ããã«ã¯ãSIGPIPEã·ã°ãã«ãç¡èŠããå¿
èŠããããŸãã
signal(SIGPIPE, SIG_IGN)
ã³ãŒãã®æ®ãã®ç®çã¯ã次ã®ããã«ãªã¹ãã§ããŸãã
- 転éããããã©ã¡ãŒã¿ãŒã®åæã
- å¿
èŠãªãã¡ã€ã«ãéå§ãäœæãéãããã®æ¡ä»¶ã確èªããŸãã
- ãã°ãã¡ã€ã«ãæäœãã
logrotate
ããã®SIGHUPã·ã°ãã«ã䜿çšããŠåæ€åºãlogrotate
ã - æ£ããã·ã£ããããŠã³ã®ããã«SIGINTãSIGTERMãåŠçããã·ã°ãã«ã
- ããã€ã¹ãšã®åæãšãã®åæåã
- çä¿¡ããŒã¿ã®åŠçãšã察å¿ããFIFOãã£ãã«ã§ã®çµæã®èšé²ã
ãã£ã³ãã«rng.fifo
ããŒã¿ã¯ãçŽ636ãã€ã/ç§ã®é床ã§ãã€ããªåœ¢åŒã§ãã£ãã«ã«çŽæ¥éä¿¡ãããŸãã ãšã³ããããŒã/dev/random
ã«è¿œå ããã«ã¯ã rngd
ããŒã¢ã³ã䜿çšãããŸãã å¿
èŠãªãœãŒã¹ã®ã¿ã䜿çšããã«ã¯ããã©ã¡ãŒã¿ " --no-tpm=1 --no-drng=1 --rng-device /run/wrnd/rng.fifo
"ãåœŒã«æž¡ãå¿
èŠããããŸãã
ããã§ããšã³ããããŒã®æ¬ åŠã®åé¡ã解決ããããã«ãçã®ä¹±æ°ãžã§ãã¬ãŒã¿ãŒã䜿çšããå¿
èŠããªãããšã«æ³šæãã䟡å€ããããŸãã ãã©ã¡ãŒã¿ãŒ " --rng-device /dev/urandom
"ãæå®ããŠrngd
ãå®è¡ããã ãã§ååã§ãã /dev/urandom
䜿çšãããã¢ã«ãŽãªãºã ã¯ååã§ãããããããªãããšãæšå¥šããããšã¯éåžžå®å
šã«æ£åœåãããŠããŸããã æ¯èŒãã¹ãã®çµæã¯ãåºçç©ã®çµããè¿ãã®æåã®éšåã§èŠãããšãã§ããŸãã
çã«ä¹±æ°ãçæããããšãéžæããã®ã¯ç°¡åã§ã-åæ§ã®ããã€ã¹ãçµã¿ç«ãŠããã£ãã®ã§ãããããã«å¯Ÿããè°è«ã¯èŠã€ãããŸããã§ããã
ãã£ã³ãã«nrf.fifo
ã»ã³ãµãŒããã®ããŒã¿ã¯åŠçãããSQLã¯ãšãªã®åœ¢åŒã§ãã£ãã«ã«éä¿¡ãããããŒãã«ã«ã¬ã³ãŒããæ¿å
¥ãããŸãã wrnsensors.shã®äŸã¯ãSQLite3ããŒã¿ããŒã¹ã§ã®äœæ¥ã瀺ããŠããŸãããINSERTã¯ãšãªã¯æ®éçã§ãããã©ã®SQLããŒã¿ããŒã¹ã§ãæ©èœããã¯ãã§ãã
ãã£ã³ãã«cmd.fifo
ãã£ãã«ã¯ã以äžã§wrnctrl
管çwrnctrl
ã«ãã£ãŠäœ¿çšãããŸãã
make daemon
ã³ãã³ãã§Makefileã䜿çšããŠwrnd
ãwrnd
ã§ãmake daemon
ã ãããã°ããŒãžã§ã³ããã«ãããããã®ãããã°ã¿ãŒã²ãããæäŸãããŸãã
管çãŠãŒãã£ãªãã£
ãŠãŒãã£ãªãã£wrnctrl
ã¯cmd.fifoãã£ãã«ããããã€ã¹ããããŒã¿ãåãåãããã wrnd
ããŒã¢ã³ãwrnctrl
ããå¿
èŠãwrnd
ãŸãã
ãªãŒããŒã¯ãã¹ãŠã®ãœãŒã¹ããããŒã¿ãåä¿¡ããŸãããFIFOãåæã«éããšãäºæž¬å¯èœãªçµæãåŸãããŸãããèšé²ã®ã¿ãå¯èœã§ãã è€æ°ã®ãªãŒããŒã1ã€ã®FIFOãéãå Žåãã©ã®ãªãŒããŒãããŒã¿ãåä¿¡ããããäºæž¬ããããšã¯äžå¯èœã§ãã ãã®åäœã¯å®çŸ©äžæ£ããã§ãããæãŸãããªããããcmd.fifoãžã®ã¢ã¯ã»ã¹ãåæããå¿
èŠããããŸãã
Linuxã§ã¯flock
ã䜿çšããŠãã¡ã€ã«ãããžãŒã§ããããšã宣èšã§ãããããã³ãŒãå
ã§ã®ã¿åæã«ãã¡ã€ã«ãåŠçããããšãé€å€ã§ããŸãã ãã®ã¡ã«ããºã ã¯ååä»ããã€ãã§ã¯æ©èœããªãããã /tmp
å
ã®è¿œå ãã¡ã€ã«ã䜿çšããå¿
èŠããããŸãïŒ å®å
šãªã³ãŒãïŒ wrnctrl ïŒã
function device_cmd() { cmd=$1
ããã€ã¹ãã¡ãŒã ãŠã§ã¢ã®å Žåã wrnctrl flash [firmware].hex
ãŸãã éå§ããåã«ã watchdog
ããã³wrnd
忢ããå¿
èŠãããwrnd
ã ãã®ã³ãã³ãã¯avrdude
ãŠãŒãã£ãªãã£ã䜿çšããŸããããšãã°ãããã±ãŒãžãããŒãžã£ãŒããã€ã³ã¹ããŒã«ã§ããŸãã
emerge -av dev-embedded/avrdude
äžèšã®ãã¡ã€ã«ã«å ããŠããããžã§ã¯ãã€ã³ã¹ããŒã«ããã±ãŒãžã«ã¯æ¬¡ã®ãã®ãå«ãŸããŠããŸãã
- ããŒã¢ã³èšå®ãå«ããã¡ã€ã«ã
- ããŒã¢ã³ãå¶åŸ¡ããOpenRCã¹ã¯ãªããã
- logrotateã®èšå®ãã¡ã€ã«ã
- cronãä»ããŠå®è¡ãããã¹ã¯ãªããã¯ãããã€ã¹ã®ãã¹ãŠã®ãµãã·ã¹ãã ã®ã¹ããŒã¿ã¹ãã°ããã°ã«æžã蟌ã¿ãŸãã
ãããžã§ã¯ãã®çµã¿ç«ãŠãšã€ã³ã¹ããŒã«ã¯ã make install
ã³ãã³ãã§è¡ããŸãã ã€ã³ã¹ããŒã«ã¯ãã¹ãŒããŒãŠãŒã¶ãŒç¹æš©ïŒrootïŒã§å®è¡ããå¿
èŠããããŸãã ãã¡ã€ã«ã¯ã·ã¹ãã ãŠãŒãã£ãªãã£install
ã«ãã£ãŠã³ããŒãããŸããããã«ãããã¿ãŒã²ãããã¡ã€ã«ã®æš©éãšææè
ãããã«èšå®ã§ããŸãã
ãããã«
ãã®ããã€ã¹çšã®USBã€ã³ã¿ãŒãã§ãŒã¹ã確å®ã«æãŸããã§ãããã ãããããµãŒããŒã«äœ¿çšå¯èœãªUSBããŒãããªãããããã®åœ¢åŒã§ãããžã§ã¯ãã衚瀺ãããŸããã ããã«ãããããããããã¯ããªãã·ã³ãã«ã§å®å®ããäœæ¥ããã€ã¹ã§ããããšã倿ããã®ã§ãåçã«åŒ·ããå§ãããŸãã