Как я выполняю расставшуюся команду с функцией C?

Вот выдержка из ваших журналов ядра:

[194844.372691] ata1.00: exception Emask 0x0 SAct 0x700 SErr 0x0 action 0x0
[194844.372702] ata1.00: irq_stat 0x40000008
[194844.372710] ata1.00: failed command: READ FPDMA QUEUED
[194844.372723] ata1.00: cmd 60/08:40:98:cc:96/00:00:0b:00:00/40 tag 8 ncq 4096 in
[194844.372723]          res 41/40:00:98:cc:96/00:00:0b:00:00/40 Emask 0x409 (media error) 
[194844.372729] ata1.00: status: { DRDY ERR }
[194844.372734] ata1.00: error: { UNC }
[194844.384467] ata1.00: configured for UDMA/133
[194844.384495] sd 0:0:0:0: [sda] Unhandled sense code
[194844.384501] sd 0:0:0:0: [sda]  
[194844.384505] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[194844.384510] sd 0:0:0:0: [sda]  
[194844.384513] Sense Key : Medium Error [current] [descriptor]
[194844.384521] Descriptor sense data with sense descriptors (in hex):
[194844.384524]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
[194844.384542]         0b 96 cc 98
[194844.384550] sd 0:0:0:0: [sda]  
[194844.384555] Add. Sense: Unrecovered read error - auto reallocate failed
[194844.384560] sd 0:0:0:0: [sda] CDB:
[194844.384563] Read(10): 28 00 0b 96 cc 98 00 00 08 00
[194844.384586] end_request: I/O error, dev sda, sector 194432152
[194844.384599] ata1: EH complete
[194844.384628] EXT4-fs error (device dm-2): __ext4_get_inode_loc:3953: inode #32770: block 2721: comm cron: unable to read itable block
[194844.412579] Aborting journal on device dm-2-8.
[194844.412933] EXT4-fs (dm-2): Remounting filesystem read-only
[194844.412946] EXT4-fs error (device dm-2) in ext4_reserve_inode_write:4902: IO failure
[194844.514777] ------------[ cut here ]------------
[194844.514787] WARNING: CPU: 4 PID: 11053 at /build/buildd/linux-3.13.0/fs/ext4/ext4_jbd2.c:259 __ext4_handle_dirty_metadata+0x1a2/0x1c0()
[194844.514788] Modules linked in: usb_storage dm_snapshot pci_stub vboxpci(OX) vboxnetadp(OX) vboxnetflt(OX) vboxdrv(OX) bnep rfcomm bluetooth nfsd auth_rpcgss nfs_acl nfs lockd sunrpc fscache uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_core videodev snd_hda_codec_hdmi snd_hda_codec_idt lib80211_crypt_tkip hp_wmi sparse_keymap wl(POX) snd_hda_intel snd_hda_codec radeon hp_accel snd_hwdep intel_rapl snd_pcm i915 snd_page_alloc x86_pkg_temp_thermal snd_seq_midi intel_powerclamp snd_seq_midi_event ttm kvm_intel snd_rawmidi snd_seq kvm drm_kms_helper drm crct10dif_pclmul lib80211 lis3lv02d mei_me i2c_algo_bit snd_seq_device cfg80211 crc32_pclmul snd_timer mei input_polldev ghash_clmulni_intel snd aesni_intel rtsx_pci_ms aes_x86_64 lrw soundcore joydev gf128mul lpc_ich mac_hid memstick hp_wireless wmi glue_helper ablk_helper serio_raw video cryptd parport_pc ppdev coretemp lp parport hid_generic usbhid hid rtsx_pci_sdmmc ahci psmouse libahci sdhci_pci r8169 sdhci rtsx_pci mii
[194844.514843] CPU: 4 PID: 11053 Comm: cron Tainted: P           OX 3.13.0-43-generic #72-Ubuntu
[194844.514844] Hardware name: Hewlett-Packard HP Pavilion dv6 Notebook PC/17FA, BIOS F.1C 01/23/2013
[194844.514846]  0000000000000009 ffff88024ccf9970 ffffffff81720bf6 0000000000000000
[194844.514849]  ffff88024ccf99a8 ffffffff810677cd ffff88020a02f820 ffff880036509f70
[194844.514851]  ffff8802539194e0 ffffffff8182e3c0 000000000000017c ffff88024ccf99b8
[194844.514853] Call Trace:
[194844.514858]  [] dump_stack+0x45/0x56
[194844.514861]  [] warn_slowpath_common+0x7d/0xa0
[194844.514863]  [] warn_slowpath_null+0x1a/0x20
[194844.514866]  [] __ext4_handle_dirty_metadata+0x1a2/0x1c0
[194844.514869]  [] ext4_handle_dirty_dirent_node+0xc2/0x1b0
[194844.514872]  [] ? ext4_mark_inode_dirty+0x44/0x1f0
[194844.514874]  [] add_dirent_to_buf+0x1ee/0x230
[194844.514876]  [] ext4_add_entry+0x8bf/0xf30
[194844.514879]  [] ? ext4_mark_iloc_dirty+0x31c/0x710
[194844.514881]  [] ext4_add_nondir+0x1e/0x80
[194844.514892]  [] ext4_create+0x104/0x170
[194844.514896]  [] vfs_create+0xcd/0x130
[194844.514898]  [] do_last+0x103e/0x1230
[194844.514901]  [] ? link_path_walk+0x71/0x870
[194844.514903]  [] ? apparmor_file_alloc_security+0x5b/0x180
[194844.514907]  [] ? security_file_alloc+0x16/0x20
[194844.514910]  [] path_openat+0xbb/0x650
[194844.514912]  [] do_filp_open+0x3a/0x90
[194844.514916]  [] ? __alloc_fd+0xa7/0x130
[194844.514919]  [] do_sys_open+0x129/0x280
[194844.514921]  [] SyS_open+0x1e/0x20
[194844.514924]  [] system_call_fastpath+0x1a/0x1f
[194844.514926] ---[ end trace 863c5604899d0c53 ]---

Часть, начинающаяся с ATA1.00: Исключение Описана ошибка с диска. Эта ошибка влияет на файловую систему, и сохранить дальнейший ущерб, ядро ​​заканчивается «только изменение файловой системы только для чтения».

После этого есть след стека от драйвера файловой системы EXT4.

Существует три возможных объяснения.

  • Это ошибка в ядре - в драйвере файловой системы Ext4 или водителя для вашего дискового оборудования или в какой-либо другой соответствующей части оборудования.
  • Диск поврежден или подключение к нему плохое (Bucgy Controller Chip, поврежденный или свободный кабель). Это самое очевидное объяснение дискового икота, которое начало все это. Драйвер файловой системы может быть сбой, потому что он не полностью надежен ошибкам привода.
  • Ваша ОЗУ повреждена. Это вызвало некоторое поведение ядра, возможно, отправив недействительную команду на диск или неверно истолковывать свой выход.

Первое, что нужно сделать, это проверить вашу оперативную память. Чипсы RAM идут плохо со временем. Беги memtest86 + как минимум на один полный проход.

Если оперативная память проходит, диск является следующим наиболее вероятным виновником. Диски тоже плохо уходят. Запустите SmartCTL , чтобы увидеть, сообщает ли дисковый отчет о любой ошибке.

Если аппаратное обеспечение выглядит нормально, проверьте любые отчеты об ошибках на ядре вашего дистрибуции. Если вы управляете ядром, который не от распределения, вы можете попробовать использовать более стандартный двоичный файл.

0
17.03.2015, 15:52
1 ответ

Теоретически в вашей программе C вы должны добавить такую ​​строку:

int res = system("/bin/parted <options>");

программа C должна выполняться с помощью корневых привилегий (или проходить через sudo ). Переменная RES содержит результат команды (см. System .

В качестве альтернативы используйте команду семейства EXEC (см. MAN EXEC для получения подробной информации).

Например, это должно прочитать таблицу разделов для диска / dev / sdb .

#include <stdlib.h>

int main(int argc, char **argv)
{
     int res = 0;
     res = system("/bin/parted -s /dev/sdb print > /var/log/mypartedlist.txt");
     if (res == -1) /* command not executed  */
        exit(1);
     else /* command ok */
     {
          if (WIFEXITED(res))
          {
              if (WEXITSTATUS(res) == 0)
                  printf("Command executed ok\n");
              else
                  printf("Command had a trouble\n");
          }
          else
          {
              printf("Problems running system\n");
              exit(2);
          }
     }   
}
1
28.01.2020, 02:51

Теги

Похожие вопросы