1 бит в файле был изменен после вызова функции read().

Вопрос или проблема

После выполнения transmission-create для генерации метаинформационного файла для папки некоторые файлы в папке были изменены. Информация стат показывает, что изменилось только время доступа. Кроме того, проверка локальной папки на соответствие метаинформационному файлу завершилась неудачей.

Что делает transmission-create, так это проходит по папке, открывает каждый файл в режиме только для чтения, считывает заданный объем данных из каждого файла, вычисляет SHA1-хэш каждой части и, наконец, записывает все SHA1-хэши и другую информацию из памяти в файловую систему.

Я изменяю исходный код, чтобы выяснить, что произошло, см. https://github.com/transmission/transmission/issues/6839#issuecomment-2472786410

Что не упоминается в вопросе на github, так это некоторые логи dmesg, смотрите их ниже.

Я думаю, что это проблема на уровне системы, конкретно с файловой системой ext4 или что-то не так с моей системой, пожалуйста, помогите мне.

BUG: unable to handle page fault for address: ffff984057cca1f0
#PF: supervisor read access in kernel mode
#PF: error_code(0x0000) - not-present page
PGD 0 P4D 0 
Oops: Oops: 0000 [#1] PREEMPT SMP PTI
CPU: 0 UID: 1000 PID: 40939 Comm: transmission-da Not tainted 6.11.0-9-generic #9-Ubuntu
Hardware name: ZOTAC MEK1/MEK1, BIOS 5.12 05/03/2018
RIP: 0010:__xas_next+0xb0/0x170
Code: 01 41 88 44 24 12 48 8b 5b 08 49 89 5c 24 18 48 85 db 0f 84 8c 00 00 00 3c 40 74 de 44 0f b6 e8 0f 87 a2 00 00 00 49 83 c5 04 <4a> 8b 44 eb 08 48 89 c2 83 e2 03 48 83 fa 02 75 50 48 3d 00 10 00
RSP: 0018:ffffbce000c039d8 EFLAGS: 00010202
RAX: 0000000000000039 RBX: ffff984057cca000 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000008e3f RDI: ffffbce000c03a28
RBP: ffffbce000c03a00 R08: ffff98c057cd2920 R09: 0000000000000000
R10: 0000000008e3f000 R11: 000000007ca12f5d R12: ffffbce000c03a28
R13: 000000000000003d R14: 000000000000003f R15: 000000000000003f
FS:  00007c03952006c0(0000) GS:ffff98c13fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffff984057cca1f0 CR3: 00000001063d2005 CR4: 00000000003706f0
Call Trace:
 <TASK>
 ? show_trace_log_lvl+0x1be/0x310
 ? show_trace_log_lvl+0x1be/0x310
 ? filemap_get_read_batch+0x1f4/0x340
 ? show_regs.part.0+0x22/0x30
 ? __die_body.cold+0x8/0x10
 ? __die+0x2a/0x40
 ? page_fault_oops+0x16c/0x180
 ? kernelmode_fixup_or_oops.isra.0+0x69/0x90
 ? __bad_area_nosemaphore+0x18e/0x1e0
 ? default_wake_function+0x1a/0x40
 ? autoremove_wake_function+0x12/0x50
 ? bad_area_nosemaphore+0x16/0x30
 ? do_kern_addr_fault+0x78/0xa0
 ? exc_page_fault+0x1b0/0x1c0
 ? asm_exc_page_fault+0x27/0x30
 ? __xas_next+0xb0/0x170
 ? xas_load+0x17/0x100
 filemap_get_read_batch+0x1f4/0x340
 filemap_get_pages+0xa2/0x3b0
 ? copy_page_to_iter+0x9f/0x180
 filemap_read+0x104/0x490
 generic_file_read_iter+0xbe/0x110
 ext4_file_read_iter+0x63/0x210
 vfs_read+0x2a0/0x380
 __x64_sys_pread64+0xa6/0xd0
 x64_sys_call+0x1aea/0x22b0
 do_syscall_64+0x7e/0x170
 ? handle_softirqs+0xe7/0x340
 ? irqentry_exit_to_user_mode+0x43/0x250
 ? irqentry_exit+0x43/0x50
 ? sysvec_apic_timer_interrupt+0x57/0xc0
 entry_SYSCALL_64_after_hwframe+0x76/0x7e
RIP: 0033:0x7c0398d02035
Code: e8 48 89 75 f0 89 7d f8 48 89 4d e0 e8 04 b8 f9 ff 4c 8b 55 e0 48 8b 55 e8 41 89 c0 48 8b 75 f0 8b 7d f8 b8 11 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 2b 44 89 c7 48 89 45 f8 e8 57 b8 f9 ff 48 8b
RSP: 002b:00007c03951f8590 EFLAGS: 00000293 ORIG_RAX: 0000000000000011
RAX: ffffffffffffffda RBX: 00007c03951f8660 RCX: 00007c0398d02035
RDX: 0000000000040000 RSI: 00007c0384221740 RDI: 0000000000000011
RBP: 00007c03951f85b0 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000008e2019e R11: 0000000000000293 R12: 0000000000000000
R13: 0000000073bf2dbf R14: 0000000000040000 R15: 0000000001b00000
 </TASK>
Modules linked in: tls snd_soc_avs intel_rapl_msr intel_rapl_common snd_soc_hda_codec snd_hda_ext_core intel_uncore_frequency intel_uncore_frequency_common snd_soc_core intel_tcc_cooling x86_pkg_temp_thermal intel_powerclamp coretemp snd_compress ac97_bus snd_pcm_dmaengine kvm_intel btusb snd_hda_codec_realtek snd_hda_codec_generic snd_hda_scodec_component snd_hda_codec_hdmi nouveau ee1004 btrtl kvm iwlmvm snd_hda_intel btintel mac80211 snd_intel_dspcfg libarc4 snd_intel_sdw_acpi btbcm btmtk snd_hda_codec mxm_wmi snd_hda_core drm_gpuvm drm_exec snd_hwdep iwlwifi gpu_sched bluetooth drm_ttm_helper rapl intel_cstate i2c_i801 ttm snd_pcm drm_display_helper i2c_mux cec snd_timer i2c_smbus snd rc_core i2c_algo_bit soundcore binfmt_misc nls_iso8859_1 intel_pmc_core intel_vsec pmt_telemetry pmt_class acpi_pad mac_hid cfg80211 sch_fq_codel dm_multipath efi_pstore nfnetlink dmi_sysfs ip_tables x_tables autofs4 btrfs blake2b_generic raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor
 raid6_pq libcrc32c raid1 raid0 crct10dif_pclmul crc32_pclmul polyval_generic ghash_clmulni_intel sha256_ssse3 nvme sha1_ssse3 nvme_core xhci_pci r8169 nvme_auth ahci realtek libahci xhci_pci_renesas video wmi aesni_intel crypto_simd cryptd
CR2: ffff984057cca1f0
---[ end trace 0000000000000000 ]---
RIP: 0010:__xas_next+0xb0/0x170
Code: 01 41 88 44 24 12 48 8b 5b 08 49 89 5c 24 18 48 85 db 0f 84 8c 00 00 00 3c 40 74 de 44 0f b6 e8 0f 87 a2 00 00 00 49 83 c5 04 <4a> 8b 44 eb 08 48 89 c2 83 e2 03 48 83 fa 02 75 50 48 3d 00 10 00
RSP: 0018:ffffbce000c039d8 EFLAGS: 00010202
RAX: 0000000000000039 RBX: ffff984057cca000 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000008e3f RDI: ffffbce000c03a28
RBP: ffffbce000c03a00 R08: ffff98c057cd2920 R09: 0000000000000000
R10: 0000000008e3f000 R11: 000000007ca12f5d R12: ffffbce000c03a28
R13: 000000000000003d R14: 000000000000003f R15: 000000000000003f
FS:  00007c03952006c0(0000) GS:ffff98c13fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffff984057cca1f0 CR3: 00000001063d2005 CR4: 00000000003706f0
note: transmission-da[40939] exited with irqs disabled
# transmission-create -V
transmission-create 4.0.6 (38c164933e)

# lsb_release -a
Нет доступных модулей LSB.
Идентификатор дистрибьютора: Ubuntu
Описание:    Ubuntu 24.10
Версия:        24.10
Кодовое имя:       oracular

# uname -a
Linux ubuntu2204 6.11.0-9-generic #9-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 14 13:19:59 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

# sudo lshw -class disk
  *-disk:0                  
       description: ATA Disk
       product: WDC WD120EDAZ-11
       vendor: Western Digital
       physical id: 0
       bus info: scsi@2:0.0.0
       logical name: /dev/sda
       version: 0A81
       serial: 8CKM****
       size: 10TiB (12TB)
       capabilities: gpt-1.00 partitioned partitioned:gpt
       configuration: ansiversion=5 guid=********-****-****-****-************ logicalsectorsize=512 sectorsize=4096

Ответ или решение

Изменение 1 бита в файле после вызова функции read()

Введение

В процессе работы с программным обеспечением и файловыми системами иногда возникают ситуации, которые требуют всестороннего анализа. Одной из таких проблем является то, что после вызова функции read(), ботом "transmission-create" происходит изменение 1 бита в файле. Для решения данного вопроса необходимо рассмотреть все возможные аспекты, включая структуру работы программы, файловую систему и системные ошибки, которые могут быть связаны с этой проблемой.

Описание проблемы

Как упоминалось в вашем запросе, после выполнения команды transmission-create, которая предназначена для генерации метаинформационного файла для папки, была зафиксирована модификация некоторых файлов. Информация о состоянии файлов (stat) указывает на то, что было изменено только время доступа.

s ряд ключевых моментов:

  • transmission-create открывает каждый файл в режиме только для чтения, затем читает указанный размер данных и вычисляет SHA1-хэш для каждого фрагмента.
  • Файлы, измененные в результате работы программы, не соответствуют метаинформационному файлу, что указывает на возможную ошибку при обработке файлов.

Технический анализ

Описанная проблема может возникать в результате нескольких факторов:

  1. Файловая система ext4:

    • Стандартные ошибки файловой системы, такие как повреждение или некорректная работа, могут привести к тому, что данные, считываемые из файлов, будут искажены, что может вызвать модификацию содержимого файлов.
    • Логи, которые вы привели, показывают, что во время работы transmission-da произошла ошибка страницы (page fault). Это может указывать на проблему с доступом к памяти, что в свою очередь может происходить из-за недоступных или поврежденных страниц.
  2. Системный уровень:

    • Код ошибки #PF: supervisor read access в приведенных логах сигнализирует о том, что программа пытается прочитать память, которая в данный момент не доступна. Это может повлечь за собой неправильное считывание данных, что, в свою очередь, может привести к изменению содержимого файла.
  3. Проблемы с памятью:

    • Возможные проблемы с оперативной памятью или кешированием данных также могут констатировать неисправность. Если программа transmission-da работает с некорректными адресами в памяти, это может привести к непредсказуемым результатам и изменению файловых данных.

Рекомендации по устранению проблемы

Для диагностики и устранения проблемы рекомендуется выполнить следующие действия:

  1. Проверка файловой системы:

    • Запустите команду fsck для проверки и исправления ошибок на диске, особенно если вы используете файловую систему ext4. Пример команды: sudo fsck -f /dev/sda (где /dev/sda – ваша целевая файловая система).
  2. Анализ логов:

    • Анализируйте более широкий диапазон системных логов (dmesg, /var/log/syslog) для определения других возможных ошибок, которые могут вмешиваться в работу transmission-da.
  3. Обновление системы и программного обеспечения:

    • Убедитесь, что все пакеты вашего программного обеспечения и ядро системы обновлены до последних стабильных версий. Это может решить проблему в случае, если существует известный баг.
  4. Тестирование системы памяти:

    • Запустите тестирование оперативной памяти с помощью таких инструментов, как memtest86+, чтобы исключить возможные ошибки железа.
  5. Создание резервных копий:

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

Заключение

Изменение 1 бита в файле после вызова функции read() — это серьезная проблема, требующая тщательного анализа. Разобравшись в причинах, можно устранить источник ошибки и восстановить корректную работу системы. Следуя описанным рекомендациям, вы сможете более уверенно подойти к решению проблемы и минимизировать риск ее повторения в будущем.

Оцените материал
Добавить комментарий

Капча загружается...