Search code examples
linuxusbdeviceunmount

Is this Possible to know device Mounting and Unmounting Time in Ubuntu?


from dmesg we can know that particular device has been mounted or unmounted.

But I want to know on which time the device has been mounted or unmounted.


Solution

  • Solution 1:

    dmesg output isn't having human readable date-time information

    Instead using dmesg you can use kernel log available, and filter it according to your need.

    for e.g. Ubuntu, Debian stores kernel log at /var/log/kern.log

    cat /var/log/kern.log | grep "usb"
    

    It will give output like,

    Apr 30 11:42:23 debian kernel: [ 1537.984584] usb 1-1.1: USB disconnect, device number 3
    Apr 30 11:42:23 debian kernel: [ 1538.207012] usb 1-1.1: new low-speed USB device number 5 using ehci_hcd
    Apr 30 11:42:29 debian kernel: [ 1543.409629] usb 1-1.1: new low-speed USB device number 6 using ehci_hcd
    Apr 30 11:42:29 debian kernel: [ 1543.504880] usb 1-1.1: New USB device found, idVendor=04f3, idProduct=0235
    Apr 30 11:42:29 debian kernel: [ 1543.504885] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
    Apr 30 11:42:29 debian kernel: [ 1543.504888] usb 1-1.1: Product: OM
    

    Solution 2:

    I've found one perl script to convert dmesg date-time to human readable.

    Try it,

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my @dmesg_new = ();
    my $dmesg = "/bin/dmesg";
    my @dmesg_old = `$dmesg`;
    my $now = time();
    my $uptime = `cat /proc/uptime | cut -d"." -f1`;
    my $t_now = $now - $uptime;
    
    sub format_time {
     my @time = localtime $_[0];
     $time[4]+=1;    # Adjust Month
     $time[5]+=1900;    # Adjust Year
     return sprintf '%4i-%02i-%02i %02i:%02i:%02i', @time[reverse 0..5];
    }
    
    foreach my $line ( @dmesg_old )
    {
     chomp( $line );
     if( $line =~ m/\[\s*(\d+)\.(\d+)\](.*)/i )
     {
     # now - uptime + sekunden
     my $t_time = format_time( $t_now + $1 );
     push( @dmesg_new , "[$t_time] $3" );
     }
    }
    
    print join( "\n", @dmesg_new );
    print "\n";
    

    Save and apply execute permission.

    $chmod a+x script.pl
    $./script.pl
    

    [Sample output:]

    [2014-04-30 11:17:27]  eth0: no IPv6 routers present
    [2014-04-30 11:42:18]  hub 1-1:1.0: port 1 disabled by hub (EMI?), re-enabling...
    [2014-04-30 11:42:18]  usb 1-1.1: USB disconnect, device number 3
    [2014-04-30 11:42:19]  usb 1-1.1: new low-speed USB device number 5 using ehci_hcd
    [2014-04-30 11:42:24]  hub 1-1:1.0: unable to enumerate USB device on port 1
    [2014-04-30 11:42:24]  usb 1-1.1: new low-speed USB device number 6 using ehci_hcd
    [2014-04-30 11:42:24]  usb 1-1.1: New USB device found, idVendor=04f3, idProduct=0235
    [2014-04-30 11:42:24]  usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
    [2014-04-30 11:42:24]  usb 1-1.1: Product: OM
    [2014-04-30 11:42:24]  input: OM as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/input/input11
    [2014-04-30 11:42:24]  generic-usb 0003:04F3:0235.0004: input,hidraw0: USB HID v1.11 Mouse [OM] on usb-0000:00:1a.0-1.1/input0
    

    Solution 3: If your distro supports -T option for dmesg

    Try dmesg -T. For me it worked on Debian, It should work for you too on Ubuntu. It enables time-stamp for output.

    [From man page]

       -T, --ctime
              Print human readable timestamps. The timestamp could be inaccurate!
    
              The time source used for the logs is not updated after system SUSPEND/RESUME.