7 دستور ‘dmesg’ برای عیب یابی و جمع آوری اطلاعات سیستم های لینوکس
دستور dmesg پیام های از kernel ring buffer را نمایش میدهد. یک سیستم از چندین runlevel میگذرد و ما میتوانیم اطلاعات زیادی مانند معماری سیستم، cpu، دیوایس های متصل شده، ram و غیره به دست بیاوریم. زمانی که کامپیوتر بوت میشود یک کرنل (هسته یک سیستم عامل) درون مموری لود میشود در طول این زمان تعدادی از پیام ها نمایش داده میشوند که ما میتوانیم سخت افزارهای شناسایی شده توسط کرنل را مشاهده کنیم.
این پیغام ها به منظور شناسایی مواردی از مشکلات در دیوایس و یا سایر بخش ها بسیار مفید هستند. زمانی که ما سخت افزاری را متصل و یا جدا میکنیم روی سیستم با کمک دستور dmesg میتوانیم اطلاعات شناسایی و یا قطع شدن سخت افزار را به سرعت دریابیم. دستور dmesg روی اکثر سیستم عاملی های unix و linux موجود میباشد.
حالا مروری داشته باشیم روی مثال های عملی از یکی از مشهورترین ابزار لینوکسی به نام dmesg .
1 – لیست تمامی درایورهای متصل شده در kernel :
ما میتوانیم ابزاری مانند ‘more’ , ‘tail’ , ‘less’ یا ‘grep’ (ابزار مفید برای کار کردن با متن) را به همراه دستور dmesg استفاده کنیم.
از آنجایی که خروجی لاگ dmesg در یک صفحه جا نمیشود استفاده از دستور های more یا less که پایپ ‘|’ شده به دستور dmesg هستند میتوان لاگ ها را صفحه به صفحه نمایش داد :
1 2 |
[root@tecmint.com ~]# dmesg | more [root@tecmint.com ~]# dmesg | less |
Sample Output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Initializing cgroup subsys cpuacct [ 0.000000] Linux version 3.11.0-13-generic (buildd@aatxe) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 17:26:33 UTC 2013 (Ubuntu 3.11.0-13.20-generic 3.11.6) [ 0.000000] KERNEL supported cpus: [ 0.000000] Intel GenuineIntel [ 0.000000] AMD AuthenticAMD [ 0.000000] NSC Geode by NSC [ 0.000000] Cyrix CyrixInstead [ 0.000000] Centaur CentaurHauls [ 0.000000] Transmeta GenuineTMx86 [ 0.000000] Transmeta TransmetaCPU [ 0.000000] UMC UMC UMC UMC [ 0.000000] e820: BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable [ 0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007dc08bff] usable [ 0.000000] BIOS-e820: [mem 0x000000007dc08c00-0x000000007dc5cbff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x000000007dc5cc00-0x000000007dc5ebff] ACPI data [ 0.000000] BIOS-e820: [mem 0x000000007dc5ec00-0x000000007fffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fed003ff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fed20000-0x00000000fed9ffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000feefffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] reserved [ 0.000000] NX (Execute Disable) protection: active ..... |
2 – لیست تمامی دستگاه های متصل شده :
برای پیدا کردن هارد دیسک هایی که توسط کرنل دیتکت شده اند شما میتوانید عبارت ‘sda’ را به همراه دستور grep سرچ کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@tecmint.com ~]# dmesg | grep sda [ 1.280971] sd 2:0:0:0: [<b>sda</b>] 488281250 512-byte logical blocks: (250 GB/232 GiB) [ 1.281014] sd 2:0:0:0: [<b>sda</b>] Write Protect is off [ 1.281016] sd 2:0:0:0: [<b>sda</b>] Mode Sense: 00 3a 00 00 [ 1.281039] sd 2:0:0:0: [<b>sda</b>] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [ 1.359585] <b>sda</b>: <b>sda</b>1 <b>sda</b>2 < <b>sda</b>5 <b>sda</b>6 <b>sda</b>7 <b>sda</b>8 > [ 1.360052] sd 2:0:0:0: [<b>sda</b>] Attached SCSI disk [ 2.347887] EXT4-fs (<b>sda</b>1): mounted filesystem with ordered data mode. Opts: (null) [ 22.928440] Adding 3905532k swap on /dev/<b>sda</b>6. Priority:-1 extents:1 across:3905532k FS [ 23.950543] EXT4-fs (<b>sda</b>1): re-mounted. Opts: errors=remount-ro [ 24.134016] EXT4-fs (<b>sda</b>5): mounted filesystem with ordered data mode. Opts: (null) [ 24.330762] EXT4-fs (<b>sda</b>7): mounted filesystem with ordered data mode. Opts: (null) [ 24.561015] EXT4-fs (<b>sda</b>8): mounted filesystem with ordered data mode. Opts: (null) |
نکته : sda در حقیقت اولین هارد درایو SATA میباشد.sdb دومین هارد درایو SATA میباشد و sdc سومین هارد درایو میباشد و … . برای هارد درایوهای IDE از hda یا hdb و … استفاده میشود.
3 – نمایش تنها 20 خط اول از خروجی دستور dmesg :
استفاده از دستور head به همراه dmesg خطوط ابتدایی را نمایش خواهد داد به طور مثال دستور زیر تنها 20 خط از ابتدای log ها را نمایش میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[root@tecmint.com ~]# dmesg | head -20 [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Initializing cgroup subsys cpuacct [ 0.000000] Linux version 3.11.0-13-generic (buildd@aatxe) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 17:26:33 UTC 2013 (Ubuntu 3.11.0-13.20-generic 3.11.6) [ 0.000000] KERNEL supported cpus: [ 0.000000] Intel GenuineIntel [ 0.000000] AMD AuthenticAMD [ 0.000000] NSC Geode by NSC [ 0.000000] Cyrix CyrixInstead [ 0.000000] Centaur CentaurHauls [ 0.000000] Transmeta GenuineTMx86 [ 0.000000] Transmeta TransmetaCPU [ 0.000000] UMC UMC UMC UMC [ 0.000000] e820: BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable [ 0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007dc08bff] usable [ 0.000000] BIOS-e820: [mem 0x000000007dc08c00-0x000000007dc5cbff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x000000007dc5cc00-0x000000007dc5ebff] ACPI data [ 0.000000] BIOS-e820: [mem 0x000000007dc5ec00-0x000000007fffffff] reserved |
4 – نمایش تنها 20 خط از آخر خروجی dmesg :
دستور ‘tail’ به همراه dmesg خطوط آخر log ها را نمایش میدهد. استفاده از آن در مواردی که ‘removable device’ را به سیستم وصل میکنیم بسیار مفید است. دستور زیر 20 خط آخر از لاگ dmesg را نمایش میدهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[root@tecmint.com ~]# dmesg | tail -20 parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE] ppdev: user-space parallel port driver EXT4-fs (sda1): mounted filesystem with ordered data mode Adding 2097144k swap on /dev/sda2. Priority:-1 extents:1 across:2097144k readahead-disable-service: delaying service auditd ip_tables: (C) 2000-2006 Netfilter Core Team nf_conntrack version 0.5.0 (16384 buckets, 65536 max) NET: Registered protocol family 10 lo: Disabled Privacy Extensions e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None Slow work thread pool: Starting up Slow work thread pool: Ready FS-Cache: Loaded CacheFiles: Loaded CacheFiles: Security denies permission to nominate security context: error -95 eth0: no IPv6 routers present type=1305 audit(1398268784.593:18630): audit_enabled=0 old=1 auid=4294967295 ses=4294967295 res=1 readahead-collector: starting delayed service auditd readahead-collector: sorting readahead-collector: finished |
5 – جستجوی دستگاه های متصل شده یا string خاص :
جستجوی یک string خاص به دلیل طول خروجی dmesg کار بسیار سختی است بنابراین خطوط را که شامل string های مانند usb , dma , tty و memory و غیره هستند فیلتر میکنیم. گزینه i- دردستور grep به منظور نادیده گرفتن حروف کوچیک و بزرگ میباشد :
1 2 3 4 |
[root@tecmint.com log]# dmesg | grep -i usb [root@tecmint.com log]# dmesg | grep -i dma [root@tecmint.com log]# dmesg | grep -i tty [root@tecmint.com log]# dmesg | grep -i memory |
Sample Output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[ 0.000000] Scanning 1 areas for low <b>memory</b> corruption [ 0.000000] initial <b>memory</b> mapped: [mem 0x00000000-0x01ffffff] [ 0.000000] Base <b>memory</b> trampoline at [c009b000] 9b000 size 16384 [ 0.000000] init_<b>memory</b>_mapping: [mem 0x00000000-0x000fffff] [ 0.000000] init_<b>memory</b>_mapping: [mem 0x37800000-0x379fffff] [ 0.000000] init_<b>memory</b>_mapping: [mem 0x34000000-0x377fffff] [ 0.000000] init_<b>memory</b>_mapping: [mem 0x00100000-0x33ffffff] [ 0.000000] init_<b>memory</b>_mapping: [mem 0x37a00000-0x37bfdfff] [ 0.000000] Early <b>memory</b> node ranges [ 0.000000] PM: Registered nosave <b>memory</b>: [mem 0x0009f000-0x000effff] [ 0.000000] PM: Registered nosave <b>memory</b>: [mem 0x000f0000-0x000fffff] [ 0.000000] please try 'cgroup_disable=<b>memory</b>' option if you don't want <b>memory</b> cgroups [ 0.000000] <b>Memory</b>: 2003288K/2059928K available (6352K kernel code, 607K rwdata, 2640K rodata, 880K init, 908K bss, 56640K reserved, 1146920K highmem) [ 0.000000] virtual kernel <b>memory</b> layout: [ 0.004291] Initializing cgroup subsys <b>memory</b> [ 0.004609] Freeing SMP alternatives <b>memory</b>: 28K (c1a3e000 - c1a45000) [ 0.899622] Freeing initrd <b>memory</b>: 23616K (f51d0000 - f68e0000) [ 0.899813] Scanning for low <b>memory</b> corruption every 60 seconds [ 0.946323] agpgart-intel 0000:00:00.0: detected 32768K stolen <b>memory</b> [ 1.360318] Freeing unused kernel <b>memory</b>: 880K (c1962000 - c1a3e000) [ 1.429066] [drm] <b>Memory</b> usable by graphics device = 2048M |
6 – پاک کردن لاگ های بافر dmesg :
بله ما میتوانیم لاگ های dmesg را در صورت نیاز پاک کنیم. دستور زیر لاگ های ring buffer در dmesg تا زمانی که شما آن را اجرا کنید پاک خواهد کرد. البته هنوز شما میتوانید لاگ های ذخیره شده در فایل های /var/log/dmesg را مشاهده کنید. اگر شما هر دیوایسی را متصل کنید خروجی dmesg ایجاد خواهد گردید :
1 |
[root@tecmint.com log]# dmesg -c |
7 – مانیتورینگ dmesg به صورت Real Time :
در بعضی از توضیع های لینوکسی میتوان از دستور tail -f /var/log/dmesg برای مانیتورینگ real time دستور dmesg استفاده کرد :
1 |
[root@tecmint.com log]# watch "dmesg | tail -20" |