6.6 关机
有序关机操作在嵌入式系统的设计中一度曾被忽略,不正确的关机操作会影响到系统的启动时间,甚至会导致某些特定类型的文件系统崩溃。由于采用EXT2文件系统类型的系统在意外掉电后的重新启动过程中需要执行fsck(文件系统检查)命令,而执行该命令花费了太多的时间,这也成为了使用EXT2文件系统(桌面Linux系统多年来默认使用的文件系统)最多的报怨。对于具有大容量磁盘的服务器来说,对几个大的EXT2分区进行正确的fsck操作可能要花费几个小时。
每个嵌入式系统都可能有它自己的关机操作策略,不同的策略可能彼此适用也可能不适用。这里的关机操作所指的范围可能从一个完全的System V关机方案到一个简单脚本的挂起或重新启动。Linux下有一些工具可以用来实现关机操作,包括shutdown、halt和reboot命令,当然,所选的体系结构必须支持这些命令才可以用以实现关机操作。
一个用于关机操作的脚本应该可以终止所有用户空间下的程序,最终关闭那些被进程打开的文件。如果init正在使用中,那么执行init 0命令会将系统挂起。通常来说,首先关机进程会向所有进程发送SIGTERM信号,通知它们系统正在执行关机操作。一段短暂的延时可以确保所有进程有机会执行自身的关闭操作,例如关闭文件、保存当前状态等。然后,向这些进程发送SIGKILL信号,最终彻底终止这些进程。关机操作将试图卸载所有已挂载的文件系统,并调用体系结构专有的关机或重启例程。Linux的shutdown命令与init一起来完成这些操作。