Вопрос или проблема
После выполнения 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-хэш для каждого фрагмента.- Файлы, измененные в результате работы программы, не соответствуют метаинформационному файлу, что указывает на возможную ошибку при обработке файлов.
Технический анализ
Описанная проблема может возникать в результате нескольких факторов:
-
Файловая система ext4:
- Стандартные ошибки файловой системы, такие как повреждение или некорректная работа, могут привести к тому, что данные, считываемые из файлов, будут искажены, что может вызвать модификацию содержимого файлов.
- Логи, которые вы привели, показывают, что во время работы
transmission-da
произошла ошибка страницы (page fault
). Это может указывать на проблему с доступом к памяти, что в свою очередь может происходить из-за недоступных или поврежденных страниц.
-
Системный уровень:
- Код ошибки
#PF: supervisor read access
в приведенных логах сигнализирует о том, что программа пытается прочитать память, которая в данный момент не доступна. Это может повлечь за собой неправильное считывание данных, что, в свою очередь, может привести к изменению содержимого файла.
- Код ошибки
-
Проблемы с памятью:
- Возможные проблемы с оперативной памятью или кешированием данных также могут констатировать неисправность. Если программа
transmission-da
работает с некорректными адресами в памяти, это может привести к непредсказуемым результатам и изменению файловых данных.
- Возможные проблемы с оперативной памятью или кешированием данных также могут констатировать неисправность. Если программа
Рекомендации по устранению проблемы
Для диагностики и устранения проблемы рекомендуется выполнить следующие действия:
-
Проверка файловой системы:
- Запустите команду
fsck
для проверки и исправления ошибок на диске, особенно если вы используете файловую систему ext4. Пример команды:sudo fsck -f /dev/sda
(где/dev/sda
– ваша целевая файловая система).
- Запустите команду
-
Анализ логов:
- Анализируйте более широкий диапазон системных логов (
dmesg
,/var/log/syslog
) для определения других возможных ошибок, которые могут вмешиваться в работуtransmission-da
.
- Анализируйте более широкий диапазон системных логов (
-
Обновление системы и программного обеспечения:
- Убедитесь, что все пакеты вашего программного обеспечения и ядро системы обновлены до последних стабильных версий. Это может решить проблему в случае, если существует известный баг.
-
Тестирование системы памяти:
- Запустите тестирование оперативной памяти с помощью таких инструментов, как
memtest86+
, чтобы исключить возможные ошибки железа.
- Запустите тестирование оперативной памяти с помощью таких инструментов, как
-
Создание резервных копий:
- На всякий случай создайте резервные копии всех файлов перед проведением вышеуказанных действий, чтобы предотвратить потерю данных.
Заключение
Изменение 1 бита в файле после вызова функции read()
— это серьезная проблема, требующая тщательного анализа. Разобравшись в причинах, можно устранить источник ошибки и восстановить корректную работу системы. Следуя описанным рекомендациям, вы сможете более уверенно подойти к решению проблемы и минимизировать риск ее повторения в будущем.