精华内容
下载资源
问答
  • 今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。 2、sysinfo结构 sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用内存空间、共享内存空间...
  • 1、前言  时间对操作系统来说非常...今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。 2、sysinfo结构  sysinfo结构保持了系统启动后的信息,主要包括启动...

    1、前言

      时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。

    2、sysinfo结构

      sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用内存空间、共享内存空间、进程的数目等。man sysinfo得到结果如下所示:

    复制代码
     1 struct sysinfo {
     2                long uptime;             /* Seconds since boot */
     3                unsigned long loads[3];  /* 1, 5, and 15 minute load averages */
     4                unsigned long totalram;  /* Total usable main memory size */
     5                unsigned long freeram;   /* Available memory size */
     6                unsigned long sharedram; /* Amount of shared memory */
     7                unsigned long bufferram; /* Memory used by buffers */
     8                unsigned long totalswap; /* Total swap space size */
     9                unsigned long freeswap;  /* swap space still available */
    10                unsigned short procs;    /* Number of current processes */
    11                char _f[22];             /* Pads structure to 64 bytes */
    12            };
    复制代码

    3、获取系统启动时间

      通过sysinfo获取系统启动到现在的秒数,用当前时间减去这个秒数即系统的启动时间。程序如下所示:

    复制代码
     1 #include <stdio.h>
     2 #include <sys/sysinfo.h>
     3 #include <time.h>
     4 #include <errno.h>
     5 
     6 static int print_system_boot_time()
     7 {
     8     struct sysinfo info;
     9     time_t cur_time = 0;
    10     time_t boot_time = 0;
    11     struct tm *ptm = NULL;
    12     if (sysinfo(&info)) {
    13     fprintf(stderr, "Failed to get sysinfo, errno:%u, reason:%s\n",
    14         errno, strerror(errno));
    15     return -1;
    16     }
    17     time(&cur_time);
    18     if (cur_time > info.uptime) {
    19     boot_time = cur_time - info.uptime;
    20     }
    21     else {
    22     boot_time = info.uptime - cur_time;
    23     }
    24     ptm = gmtime(&boot_time);
    25     printf("System boot time: %d-%-d-%d %d:%d:%d\n", ptm->tm_year + 1900,
    26         ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
    27    return 0; 
    28 }
    29 
    30 int main()
    31 {
    32     if (print_system_boot_time() != 0) {
    33     return -1;
    34     }
    35     return 0;
    36 }
    复制代码

    测试结果如下所:

    转载于:https://www.cnblogs.com/alantu2018/p/8468715.html

    展开全文
  • 操作系统如何通过不同的启动状态阶段。本文是为那些刚刚接触Linux的读者编写的。了解Linux如何启动对于在系统出现故障时有效地进行故障排除非常重要。当系统打开,几分钟后,我们得到一个登录提示。我们有没有试着找...

    请关注本头条号,每天坚持更新原创干货技术文章。

    如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习

    1. 前言

    在本文中我们将回顾Linux操作系统中的引导过程。操作系统如何通过不同的启动状态阶段。本文是为那些刚刚接触Linux的读者编写的。了解Linux如何启动对于在系统出现故障时有效地进行故障排除非常重要。当系统打开,几分钟后,我们得到一个登录提示。我们有没有试着找出启动序列的所有阶段都发生了什么,以及系统启动过程中幕后发生了什么。

    2. 启动电源

    • BIOS基本输入输出系统是一个预置在主板芯片组中的软件程序。
    • BIOS加载并扫描诸如硬盘、CD-ROM、RAM等设备。
    • BIOS搜索主硬盘驱动器的MBR(主引导记录:第一扇区),扫描第一阶段加载程序(在我们的示例中,启动加载程序是(GRUB LILO),并将职责移交给MBR。
    • Boot PROM/FLASH/BIOS能够熟练地将MBR加载到RAM中并执行它。

    3. MBR (Master Boot Record)

    512 bytes of space –> MBR
    MBR包含了大多数操作系统的加载器信息。比如UNIX, Linux和WINDOWS。
    MBR存储加载程序第阶段的二进制信息。
    MBR包括第一个磁盘驱动器的物理扇区(通常是512bytes),它不是任何分区的一部分。
    放置在主磁盘驱动器上,磁道第一柱面的主扇区为0,磁头为0(这整个路径通常是为引导程序预订的)
    MBR包括一个小型可执行程序和一个指定主分区的表。

    1c326d20929d2239a5dc762cfcb63b02.png

    MBR (Master Boot Record)

    Boot Code (GRUB) 446 bytespartition 1: 16 bytespartition 2: 16 bytespartition 3: 16 bytespartition 4: 16 bytesmagic Number: 2 bytes
    • MBR还记录哪个主分区是活动的。
    • BIOS向第一阶段引导加载程序提交权限,第一阶段启动加载程序并随后扫描分区表,并在配置为可引导的分区上找到第二阶段启动加载程序。

    4. Linux操作系统引导器Boot Loader

    • 引导加载程序从第一阶段加载程序中定义,并将自身加载到RAM中。所有这些都是在几毫秒内发生的。
    • 默认的第二阶段引导加载程序是GRUB (Grand Unified boot loader)或LILO (Linux加载程序)
    • 一旦GRUB加载到RAM中,它就会搜索内核的位置。
    • GRUB将仔细检查映射文件,以找到位于(/boot)下的内核映像并加载它。
    • GRUB从/boot分区加载内核(vmlinux -version)
    a176e98f06e9eee6de81fd5103ed9c8a.png

    Linux操作系统引导器Boot Loader

    5. Linux操作系统引导器之grub

    GRUB为initrd - >组织RAMDISK (RAMDISK是从RAM中保留的空间)。此外,它还将initrd驱动到RAM中,以使内核准备好将自己加载到内存和依赖的模块中,这样它就可以将系统留给“init”进程

    45b5a1500115106e15708c743b4a4d24.png

    Linux操作系统引导器之grub

    在Linux中,大多数驱动程序都是预先构建为模块的,这些模块是初始ram驱动器(initrd.img),它可以保存附加模块的所有信息。因此,当内核引导时,它创建ramdrive并加载initrd.img及其相关模块。

    GRUB读取/boot/grub/grub.conf 为用户选择操作系统提供了一个干净的接口。

    一旦内核加载了它所依赖的模块,它就会移交给“init”进程。内核映像有一个小的、未打包的程序,它解压缩内核并运行它。

    6. Linux操作系统引导过程之LILO

    为了在硬盘上定位操作系统,LILO需要指示MBR。对/etc/lilo.conf进行的任何修改,它必须在MBR中更新,但是在GRUB的情况下不需要更新,它直接从文件/boot/grub/grub.conf中读取。
    在/etc/lilo.conf进行更改之后,我们必须手动更新MBR

    2b2cbf22a2c2f2030a8e2082bde7f20f.png

    Linux操作系统引导过程之LILO

    /sbin/lilo -v

    7. Linux操作系统引导过程之第二阶段

    GRUB第二阶段加载程序驻留在MBR和/boot分区中。一旦GRUB加载到内存中,它就变成了第二阶段加载器。

    8. Linux操作系统引导过程之第三阶段

    不应该删除/initrd目录,它是内核快速访问启动系统模块所需的模块(包括设备驱动程序)的临时占位符。

    9. Linux内核初始化的关键点包括:

    • 初始化CPU组件,如MMU
    • 初始化调度器(PID 0)
    • 以rw模式挂载根文件系统
    • 派生init进程(PID 1)

    本质上,内核初始化做了两件事:

    • 启动共享资源管理器(RAM、处理器和大容量存储)的核心系统。
    • 启动单个进程/sbin/init
    • Init进程(sbin/init)是第一个进程,它加载所有不同的守护进程,并挂载/etc/fstab下列出的所有分区。

    10. 关于/etc/fstab

    • /sbin/init读取/etc/inittab文件
    • 设置默认运行级别(telinit命令允许管理员告诉init进程更改其当前运行级别)
    • 调用/etc/rc.d/rc.sysinit和/etc/rc.d/rc x(其中“x”是一个运行级)
    • 在/etc/rc.d/rc5.d目录文件以字母K表示杀进程的脚本。文件以字母S开头代表启动脚本。
    • 启动tty流程和xdm (X display manager)
    • 启动用户登录屏幕

    11. 总结

    经过本文,大家应该对Linux操作系统引导的过程有一定的认识和了解吧?

    展开全文
  • 今天需要在应用程序获取系统的启动时间,通过sysinfo中的uptime可以计算出系统的启动时间。 2、sysinfo结构 sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用内存空间、共享内存空间、进程的数目...
  • 获取系统启动时间 一、前言  时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在...

    获取系统启动时间

    一、前言

      时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。

     

    二、sysinfo结构

      sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用内存空间、共享内存空间、进程的数目等。man sysinfo得到结果如下所示:

    struct sysinfo {
                   long uptime;             /* Seconds since boot */
                   unsigned long loads[3];  /* 1, 5, and 15 minute load averages */
                   unsigned long totalram;  /* Total usable main memory size */
                   unsigned long freeram;   /* Available memory size */
                   unsigned long sharedram; /* Amount of shared memory */
                   unsigned long bufferram; /* Memory used by buffers */
                   unsigned long totalswap; /* Total swap space size */
                   unsigned long freeswap;  /* swap space still available */
                   unsigned short procs;    /* Number of current processes */
                   char _f[22];             /* Pads structure to 64 bytes */
               };

     

    三、获取系统启动时间

      通过sysinfo获取系统启动到现在的秒数,用当前时间减去这个秒数即系统的启动时间。程序如下所示:

    #include <stdio.h>
    #include <sys/sysinfo.h>
    #include <time.h>
    #include <errno.h>
    
    static int print_system_boot_time()
    {
        struct sysinfo info;
        time_t cur_time = 0;
        time_t boot_time = 0;
        struct tm *ptm = NULL;
        if (sysinfo(&info)) {
          fprintf(stderr, "Failed to get sysinfo, errno:%u, reason:%s\n", errno, strerror(errno));
          return -1;
        }
        time(&cur_time);
        if (cur_time > info.uptime) {
          boot_time = cur_time - info.uptime;
        }
        else {
          boot_time = info.uptime - cur_time;
        }
        ptm = gmtime(&boot_time);
        printf("System boot time: %d-%-d-%d %d:%d:%d\n", ptm->tm_year + 1900, ptm->tm_mon + 1, 
            ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); return 0; } int main() { if (print_system_boot_time() != 0) {   return -1; } return 0; }

    测试结果如下所:

     

    参考:http://www.cnblogs.com/Anker/p/3527609.html

     

    转载于:https://www.cnblogs.com/jeakeven/p/5301109.html

    展开全文
  • 一般来说,我们所说的Linux系统指的是各种基于Linux Kernel和GNU Project的操作系统发行版。为了掌握Linux操作系统的使用,了解 Linux操作系统的运作过程,理解内核与外围支撑系统的关系,加深对开源操作系统的认识...

    一般来说,我们所说的Linux系统指的是各种基于Linux Kernel和GNU Project的操作系统发行版。为了掌握Linux操作系统的使用,了解 Linux操作系统的运作过程,理解内核与外围支撑系统的关系,加深对开源操作系统的认识,我决定造个轮子——自己定制一个Linux文件系统。

    这里有两种实现方法:

    • 直接自己实现init***(M1)***

    加载bios 的硬件信息-> 读取MBR –>执行Grub ->加载kernel–> 加载驱动–> init –> 执行bash

    • 利用系统/sbin/init***(M2)***

    加载bios 的硬件信息-> 读取MBR –>执行Grub ->加载kernel–> 加载驱动–> init –> /sbin/init -> 取得run-level信息 -> /etc/rc.d/rc.sysinit -> services –> /etc/rc.d/rc.local –> mingetty –> login

    我们先选择***M1***。

    思路

    1. 利用原有系统复制必备部件到新存储器
    2. 利用initrd.img机制在RAM Disk中测试
    3. 搭配原文件内核和模块启动

    Step1:获得shell版本的initrd.img

    首先,我们可以写一个脚本init,使得内核用该文件系统启动后能够直接获得一个Bash。

    e2aecfbd685a9d3b63af6dcc4e8c3529.png

    创建脚本 init

    其中:/bin目录下是常用命令,init是自己写的脚本,/lib64目录下是应用程序所依赖的动态库。

    362ecef2116d2cb1894ab3954fc88e38.png

    init 内容

    现在我们需要使用命令行,创建bin和sbin目录,向其中添加bash、ls、rm、cp、mv、echo、cat、less等基础命令。由于这些命令需要依赖/lib64等目录下的一些动态链接的共享库,所以需要将依赖的库拷贝到小系统对应的目录下,用ldd命令查询应用程序及其依赖的动态库。完成之后,执行:

    find . | cpio -H newc -o | gzip > /boot/initrd.img

    将根文件系统打包成initrd.img放到/boot目录下。启动时系统会自动执行initrd.img中的init。

    费了这么大劲生成initrd.img,如何测试新建的initrd.img呢,需要在grub启动配置文件当中增加一个入口用于测试。

    title CentOS 6 Miniroot (hd0,0)kernel /vmlinuz-2.6.32-642.el6.x86_64initrd /initrd.img

    这样重启之后就会出现启动选项了。

    Step2:完成挂载原系统能力

    为了能挂载原系统,必须在initrd.img中加载原系统运行所必须的驱动模块,比如ext4文件系统的驱动、scsi设备的相关驱动等,/sbin/modinfo 配合/sbin/insmod,驱动放到/module

    70eef978290f64844131b84c69658fca.png

    Step3:完成拥有管理设备能力(udev)

    利用管理、监控主机设备的服务程序udevd来自动加载所需的驱动模块,比我们自己实现更加可靠。udevd的规则文件在/lib/udev/目录下,配置文件在/etc/udev/目录下,同时还需要/etc/nsswitch.conf配置的名称服务交换,其依赖的库为/lib目录下以libnss开头的文件,将上述文件拷贝到我们的目录下,然后使用/sbin/start_udev命令可以启动udevd服务。(udevd需要调用一些其他的系统命令,如/sbin/modprobe,可用strace进行跟踪获取)。

    4640e6c13a9e5dda3a70a2cd353ef57f.png

    小系统的目录文件

    其中:/dev目录下是系统存放可用设备的目录,/log是使用strace命令生成的log记录文件。

    Step4:完成拥有login登录能力

    由于login的机制比较复杂,涉及进程管理机制和进程组、控制台等许多方面,因此我们采用***M2***,将/sbin/init命令拷到小系统目录下,init脚本改为

    #!/bin/bashexec /sbin/init

    将控制权交给/sbin/init之后,系统启动时就必须等到它完成一系列调用之后,进入login界面,用户才能重新获得控制权。

    /sbin/init的过程大致分为三块:第一块是udevd加载驱动模块、文件系统检查和根切换,相关配置在/etc/rc.sysinit中;第二块是启动各项服务,相关配置在/etc/rc.d/目录下;第三块是登录部分,需要调用/sbin/mingetty和/bin/login等命令。将上述所涉及的命令及文件拷贝到小系统对应的目录下,并对配置进行修改。

    由于小系统启动之后initrd.img作为临时根文件系统直接在内存中运行,而我们小系统不需要进行根切换,故将/etc/rc.sysinit中remount_needed()函数体注释掉,这样就不会根切换了。

    由于系统采用了全新的Upstart启动方式(/sbin/init程序已经改由upstart软件包提供),将与Upstart启动相关的配置文件拷贝至小系统目录下:

    /etc/inittab 配置默认运行级别/etc/init/rcS.conf 加载rc.sysinit脚本,完成系统初始化任务/etc/init/rc.conf 兼容脚本,负责各运行级别的调用处理/etc/init/rcS-sulogin.conf 为单用户模式启动/sbin/sushell环境/etc/init/control-alt-delete.conf 控制终端下的Ctrl+Alt+Del热键操作/etc/init/start-ttys.conf 配置tty终端的开启数量、设备文件/etc/sysconfig/init 控制tty终端的开启数量、终端颜色方案/etc/init/tty.conf 控制tty终端的开启

    将bootmini/etc/inittab的运行优先级改为2,那么系统启动时/sbin/init将执行bootmini/etc/rc.d/rc2.d/目录下以S开头的文件,将一些不需要开启的服务文件名改为K开头。

    在bootmini/etc/rc.d/rc.local文件中可以加入用户需要系统开机启动后自动执行的操作。

    login程序基于认证体系PAM, 配置文件在/etc/pam.d/目录下,相关库文件有/lib64/security/及其依赖的库文件;login还涉及用户组管理/bin/chgrp、/bin/chown、/bin/chmod等,保存用户名的文件/etc/passwd、/etc/group,用户密码文件为/etc/shadow。其他一些涉及的文件可通过strace来帮助分析。

    可在真机上运行的完整版小系统

    部分目录文件:

    e323bf4866d71e174c28271676e7749f.png

    /etc

    056129e53b55aefaafc952c02bfa597c.png

    /bin

    b74aef59309c0a0e34987f61e8534e50.png

    /sbin

    d3c83a67f1fd8c63514096b13d7b5882.png

    /usr/bin

    63c196037fb0200128ab3ef7852520d7.png

    /usr/sbin

    至此,文件系统算是可以跑了。下一篇我们再造个轮子——进行Linux内核的裁剪。真机效果也将在下篇看到。

    本文由云+社区发表,作者:我是乖宝宝哦。如有侵删,请联系删除.

    展开全文
  • 使用秒表是一种方法,但在 Linux 中,你有一种更好、更轻松地了解系统启动时间的方法。-- Abhishek Prakash(作者)当你打开系统电源时,你会等待制造商的徽标出现,屏幕上可能会显示一些消息(以非安全模式启动),...
  • 点击右上方,关注开源中国OSC头条号,获取最新技术资讯本文由云+社区发表作者:我是乖宝宝哦一般来说,我们所说的Linux系统指的是各种基于Linux Kernel和GNU Project的操作系统发行版。为了掌握Linux操作系统的使用...
  • 本文主要适用于 x86-64 体系结构下的 Linux C/C++ 服务器程序。程序运行的时候,我们经常需要测量某一段代码的执行时间。...测量代码执行时间的时候需要考虑以下几个问题:代价 - 这可能是一个高频操作获取时...
  • Linux C获取系统的运行时间

    千次阅读 2016-01-26 17:39:55
    1、前言 时间对操作...今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。2、sysinfo结构 sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用
  • 今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。 2、sysinfo结构 sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用内存空间、共享内存...
  • 在编写shell程序时,经常会涉及到字符串相关操作。... 事实上shell内置一系列操作符号,能够达到相似效果,使用内部操作符会省略启动外部程序等时间,因此速度会很的快。如果内置的操作符能够做到的,优先使用内置的
  • 在Tomca 启动的sh中,默认的设置是 -Duser.timezone=GMT,如果在程序中使用 Date = new Date()则对应的是零时区的时间。如果操作系统的时区也是零时区就没什么。如果不是就有时间偏差。以下可以帮助纠正import java....
  • 事实上shell内置一系列操作符号,能够达到相似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会很的快。   一、推断读取字符串值 表达式 含义 ${var} ...
  • linux下的时间

    2019-09-23 12:20:04
    在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔11分钟会将系统时间写入CMOS,同步时间。 从这可以看出,获取...
  • java获取Linux时区

    千次阅读 2012-02-27 16:50:09
    在Tomca 启动的sh中,默认的设置是 -Duser.timezone=GMT,如果在程序中使用 Date = new Date()则对应的是零时区的时间。如果操作系统的时区也是零时区就没什么。如果不是就有时间偏差。以下可以帮助纠正 import...
  • 标准C库中只有获取系统...在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔11分钟会将系统时间写入CMOS,同步时间
  • 介绍一下Linux系统中一些自带信息的获取操作等,首先从源码中找到系统信息结构体进行分析。 1、系统信息结构体说明与获取方法: 含义: struct sysinfo { long uptime; /* 启动到现在经过的时间 */ unsigned ...
  • 问题描述:在软件启动过程中,某个线程与其他线程会有数据交互,在代码中会有线程中相互的锁的操作,然后呢此线程在测试过程中发现整个线程会突然挂起几秒什么事情也不干的现象。由于接口是客户提供,调试比较困难,...
  • 原因:操作系统时区跟JVM的时区不一致 解决: 启动java时配置参数-Duser.timezone=GMT+8 ...配置Linux时区/etc/sysconfig/clock (jre从这里获取时区信息) ZONE="Asia/Shanghai" UTC=false ARC=false ...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 252
精华内容 100
热门标签
关键字:

linux获取操作启动时间

linux 订阅