我试图编译页面大小高于 4096 的 x64 Linux 内核。需要通过 VFS 挂载具有高块大小的文件系统。在其他架构上,我可以使用内核配置选择页面大小。它不适用于 x86_64。是否可以更改 x86_64 上的页面大小?我尝试将 PAGE_SHIFT 增加到 16 arch/x86/include/asm/page_types.h
,但它只会导致错误。
如果可以在 x86_64 上构建不同的页面大小,那么支持哪些页面大小以及正确的配置是什么?
我试图编译页面大小高于 4096 的 x64 Linux 内核。需要通过 VFS 挂载具有高块大小的文件系统。在其他架构上,我可以使用内核配置选择页面大小。它不适用于 x86_64。是否可以更改 x86_64 上的页面大小?我尝试将 PAGE_SHIFT 增加到 16 arch/x86/include/asm/page_types.h
,但它只会导致错误。
如果可以在 x86_64 上构建不同的页面大小,那么支持哪些页面大小以及正确的配置是什么?
给定 ext4 文件系统上的任何文件,都可以(使用filefrag -v
)获取该文件在底层块设备上的实际偏移量+长度列表。
当文件系统以读写方式安装时,打开设备并向它们写入是否安全?它会导致 fs 损坏吗?
我这么问是因为我将实现一个替代loop
驱动程序,它将完全绕过文件系统层,因此具有更好的性能。
如果我没记错的话,交换文件就是这样实现的。如果说的有什么不对的地方请指正。
答案是否依赖于文件系统?如果文件突然被删除,并且这些偏移量被某些元数据重用,会发生什么?
最后,有没有办法锁定文件,防止其被e4defrag
或类似的东西重新定位?防止文件被删除(位于内核空间)的最佳方法是什么?是否有一些内核内部结构可以用来获取文件范围列表?
我使用 ext4 文件系统很长时间了,这是我第一次看到 ext4 文件系统的奇怪行为。
底层设备中发生 I/O 错误,并且该文件系统被重新挂载为只读,其中存在
ext4 文件系统。这很好,符合配置的预期。但由于某种未知的原因,现在不可能完全卸载文件系统。
命令成功返回。进一步运行该命令会显示“未安装”。
安装条目已从命令输出中消失。文件系统未安装在其他任何地方。
但。
第一:我在 dmesg 中看不到通常的文本。事实上,dmesg 中什么也没有。
/dev/dm-2
umount /the/mount/point
mount
EXT4-fs: unmounting filesystem
第二件事(它本身就说明出了问题):
root# cat /proc/meminfo | grep dirty
Dirty: 9457728 kB
root# time sync
real 0m0.012s
user 0m0.000s
sys 0m0.002s
root# cat /proc/meminfo | grep dirty
Dirty: 9453632 kB
第三件事:调试目录/sys/fs/ext4/dm-2
仍然存在。尝试写入“1”,希望/sys/fs/ext4/dm-2/simulate_fail
它能关闭文件系统。但它什么也没做,在 dmesg 中什么也不显示。
最后,第四件事导致设备无法使用:
root# e2fsck -fy /dev/dm-2
e2fsck 1.46.5 (30-Dec-2021)
/dev/dm-2 is in use.
e2fsck: Cannot continue, aborting.
我知道可以重新启动等。这个问题不是为了解决一些简单的新手问题。我希望有 ext4 文件系统经验的人帮助我了解导致此行为的原因。
该dm-2
设备没有安装在其他任何地方,没有绑定安装,也没有被其他任何东西使用。
在用 进行测量时,没有其他任何东西使用脏缓存cat /proc/meminfo | grep dirty
。
成功的卸载调用不是MNT_DETACH
(未-l
使用标志)。尽管如此,它几乎立即成功了(这很奇怪)。挂载点不再挂载:但正如我上面所描述的,可以很容易地看出文件系统没有卸载。
更新:正如 AB 指出的,我尝试检查文件系统是否仍然安装在不同的命名空间中。我没有将它安装在不同的命名空间中,所以我没想到会看到任何东西。但是,令人惊讶的是,它被安装在不同的命名空间中,令人惊讶的是(用户名已更改):
4026533177 mnt 1 3411291 an-unrelated-nonroot-user xdg-dbus-proxy --args=43
我尝试进入该命名空间并使用它卸载它,nsenter -t 3411291 -m -- umount /the/mount/point
这导致了分段错误(核心转储),这在 dmesg 中
[970130.866738] Buffer I/O error on dev dm-2, logical block 0, lost sync page write
[970130.867925] EXT4-fs error (device dm-2): ext4_mb_release_inode_pa:4846: group 9239, free 2048, pa_free 4
[970130.870291] Buffer I/O error on dev dm-2, logical block 0, lost sync page write
[970130.949466] divide error: 0000 [#1] PREEMPT SMP PTI
[970130.950677] CPU: 49 PID: 4118804 Comm: umount Tainted: P W OE 6.1.68-missmika #1
[970130.953056] Hardware name: OEM X79G/X79G, BIOS 4.6.5 08/02/2022
[970130.953121] RIP: 0010:mb_update_avg_fragment_size+0x35/0x120
[970130.953121] Code: 41 54 53 4c 8b a7 98 03 00 00 41 f6 44 24 7c 80 0f 84 9a 00 00 00 8b 46 14 48 89 f3 85 c0 0f 84 8c 00 00 00 99 b9 ff ff ff ff <f7> 7e 18 0f bd c8 41 89 cd 41 83 ed 01 0f 88 ce 00 00 00 0f b6 47
[970130.957139] RSP: 0018:ffffb909e3123a28 EFLAGS: 00010202
[970130.957139] RAX: 000000000000082a RBX: ffff91140ac554d8 RCX: 00000000ffffffff
[970130.957139] RDX: 0000000000000000 RSI: ffff91140ac554d8 RDI: ffff910ead74f800
[970130.957139] RBP: ffffb909e3123a40 R08: 0000000000000000 R09: 0000000000004800
[970130.957139] R10: ffff910ead74f800 R11: ffff9114b7126000 R12: ffff910eb31d2000
[970130.957139] R13: 0000000000000007 R14: ffffb909e3123b80 R15: ffff911d732beffc
[970130.957139] FS: 00007f6d94ab4800(0000) GS:ffff911d7fcc0000(0000) knlGS:0000000000000000
[970130.957139] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[970130.957139] CR2: 00003d140602f000 CR3: 0000000365690002 CR4: 00000000001706e0
[970130.957139] Call Trace:
[970130.957139] <TASK>
[970130.957139] ? show_regs.cold+0x1a/0x1f
[970130.957139] ? __die_body+0x24/0x70
[970130.957139] ? __die+0x2f/0x3b
[970130.957139] ? die+0x34/0x60
[970130.957139] ? do_trap+0xdf/0x100
[970130.957139] ? do_error_trap+0x73/0xa0
[970130.957139] ? mb_update_avg_fragment_size+0x35/0x120
[970130.957139] ? exc_divide_error+0x3f/0x60
[970130.957139] ? mb_update_avg_fragment_size+0x35/0x120
[970130.957139] ? asm_exc_divide_error+0x1f/0x30
[970130.957139] ? mb_update_avg_fragment_size+0x35/0x120
[970130.957139] ? mb_set_largest_free_order+0x11c/0x130
[970130.957139] mb_free_blocks+0x24d/0x5e0
[970130.957139] ? ext4_validate_block_bitmap.part.0+0x29/0x3e0
[970130.957139] ? __getblk_gfp+0x33/0x3b0
[970130.957139] ext4_mb_release_inode_pa.isra.0+0x12e/0x350
[970130.957139] ext4_discard_preallocations+0x22e/0x490
[970130.957139] ext4_clear_inode+0x31/0xb0
[970130.957139] ext4_evict_inode+0xba/0x750
[970130.989137] evict+0xd0/0x180
[970130.989137] dispose_list+0x39/0x60
[970130.989137] evict_inodes+0x18e/0x1a0
[970130.989137] generic_shutdown_super+0x46/0x1b0
[970130.989137] kill_block_super+0x2b/0x60
[970130.989137] deactivate_locked_super+0x39/0x80
[970130.989137] deactivate_super+0x46/0x50
[970130.989137] cleanup_mnt+0x109/0x170
[970130.989137] __cleanup_mnt+0x16/0x20
[970130.989137] task_work_run+0x65/0xa0
[970130.989137] exit_to_user_mode_prepare+0x152/0x170
[970130.989137] syscall_exit_to_user_mode+0x2a/0x50
[970130.989137] ? __x64_sys_umount+0x1a/0x30
[970130.989137] do_syscall_64+0x6d/0x90
[970130.989137] ? syscall_exit_to_user_mode+0x38/0x50
[970130.989137] ? __x64_sys_newfstatat+0x22/0x30
[970130.989137] ? do_syscall_64+0x6d/0x90
[970130.989137] ? exit_to_user_mode_prepare+0x3d/0x170
[970130.989137] ? syscall_exit_to_user_mode+0x38/0x50
[970130.989137] ? __x64_sys_close+0x16/0x50
[970130.989137] ? do_syscall_64+0x6d/0x90
[970130.989137] ? exc_page_fault+0x8b/0x180
[970130.989137] entry_SYSCALL_64_after_hwframe+0x64/0xce
[970130.989137] RIP: 0033:0x7f6d94925a3b
[970130.989137] Code: fb 43 0f 00 f7 d8 64 89 01 48 83 c8 ff c3 90 f3 0f 1e fa 31 f6 e9 05 00 00 00 0f 1f 44 00 00 f3 0f 1e fa b8 a6 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 05 c3 0f 1f 40 00 48 8b 15 c1 43 0f 00 f7 d8
[970130.989137] RSP: 002b:00007ffdd60f7d08 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
[970130.989137] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 00007f6d94925a3b
[970130.989137] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 000055ca1c6f7d60
[970130.989137] RBP: 000055ca1c6f7b30 R08: 0000000000000000 R09: 00007ffdd60f6a90
[970130.989137] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
[970130.989137] R13: 000055ca1c6f7d60 R14: 000055ca1c6f7c40 R15: 000055ca1c6f7b30
[970130.989137] </TASK>
[970130.989137] Modules linked in: 88x2bu(OE) erofs dm_zero zram ext2 hfs hfsplus xfs kvdo(OE) dm_bufio mikasecfs(OE) simplefsplus(OE) melon(OE) mikatest(OE) iloveaki(OE) tls vboxnetadp(OE) vboxnetflt(OE) vboxdrv(OE) ip6t_REJECT nf_reject_ipv6 ip6t_rt ipt_REJECT nf_reject_ipv4 xt_recent xt_tcpudp nft_limit xt_limit xt_addrtype xt_pkttype nft_chain_nat xt_MASQUERADE xt_nat nf_nat xt_conntrack nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nft_compat nf_tables binfmt_misc nfnetlink nvidia_uvm(POE) nvidia_drm(POE) intel_rapl_msr intel_rapl_common nvidia_modeset(POE) sb_edac nls_iso8859_1 x86_pkg_temp_thermal intel_powerclamp coretemp nvidia(POE) snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_codec_hdmi cfg80211 joydev snd_hda_intel input_leds snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec kvm_intel snd_hda_core snd_hwdep kvm snd_pcm snd_seq_midi rapl snd_seq_midi_event snd_rawmidi intel_cstate serio_raw pcspkr snd_seq video wmi snd_seq_device snd_timer drm_kms_helper fb_sys_fops snd syscopyarea sysfillrect sysimgblt soundcore
[970130.989137] ioatdma dca mac_hid sch_fq_codel dm_multipath scsi_dh_rdac scsi_dh_emc scsi_dh_alua msr parport_pc ppdev lp parport drm efi_pstore ip_tables x_tables autofs4 raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear crct10dif_pclmul hid_generic crc32_pclmul ghash_clmulni_intel sha512_ssse3 sha256_ssse3 sha1_ssse3 usbhid cdc_ether aesni_intel usbnet uas hid crypto_simd r8152 cryptd usb_storage mii psmouse ahci i2c_i801 r8169 lpc_ich libahci i2c_smbus realtek [last unloaded: 88x2bu(OE)]
[970131.024615] ---[ end trace 0000000000000000 ]---
[970131.203209] RIP: 0010:mb_update_avg_fragment_size+0x35/0x120
[970131.204344] Code: 41 54 53 4c 8b a7 98 03 00 00 41 f6 44 24 7c 80 0f 84 9a 00 00 00 8b 46 14 48 89 f3 85 c0 0f 84 8c 00 00 00 99 b9 ff ff ff ff <f7> 7e 18 0f bd c8 41 89 cd 41 83 ed 01 0f 88 ce 00 00 00 0f b6 47
[970131.207841] RSP: 0018:ffffb909e3123a28 EFLAGS: 00010202
[970131.209048] RAX: 000000000000082a RBX: ffff91140ac554d8 RCX: 00000000ffffffff
[970131.210284] RDX: 0000000000000000 RSI: ffff91140ac554d8 RDI: ffff910ead74f800
[970131.211512] RBP: ffffb909e3123a40 R08: 0000000000000000 R09: 0000000000004800
[970131.212749] R10: ffff910ead74f800 R11: ffff9114b7126000 R12: ffff910eb31d2000
[970131.213977] R13: 0000000000000007 R14: ffffb909e3123b80 R15: ffff911d732beffc
[970131.215181] FS: 00007f6d94ab4800(0000) GS:ffff911d7fcc0000(0000) knlGS:0000000000000000
[970131.216370] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[970131.217553] CR2: 00003d140602f000 CR3: 0000000365690002 CR4: 00000000001706e0
[970131.218740] note: umount[4118804] exited with preempt_count 1
机器仍然可以工作,可以同步其他文件系统:
root# sync -f /
root#
但不是全局同步:
root# sync
(goes D state forever)
与该 Ghost 文件系统相关的脏缓存没有消失,文件系统仍然“挂载”
这些问题的原因是什么?
通常,块设备驱动程序会报告设备的正确大小,并且可以实际使用所有“可用”块。因此,文件系统事先知道它可以向此类设备写入多少内容。
但在某些特殊情况下,例如使用dm-thin
或dm-vdo
设备时,这种说法是错误的。如果这种块设备的ENOSPC
底层存储(上层 FS 对此一无所知)已满,那么它们随时可能返回错误。
因此,我的问题是,在这种情况下会发生什么:EXT4 文件系统已挂载r/w
,处于async
模式(默认),并且正在执行大量写入。磁盘缓存(脏内存)也会参与其中,此时如果用户运行sync
命令,就会有大量数据需要写入。
但突然间,该 EXT4 文件系统的底层块设备开始拒绝任何写入,因为“没有剩余空间”。文件系统的行为是什么?
它会打印错误并进入r/o
中止所有写入并可能导致数据丢失的模式吗?如果没有,它是否会等待空间,定期重试写入并拒绝新写入?在这种情况下,如果其他进程尝试分配大量 RAM,巨大的磁盘缓存会发生什么情况?(在 Linux 上,脏内存被认为是可用的,不是吗?)。
考虑到最坏的情况,如果磁盘缓存在错误发生时占用了大部分 RAM ENOSPC
(因为管理员已设置vm.dirty_ratio
太高),内核会崩溃或锁定吗?或者它只会使所有想要分配内存的进程等待/挂起?最后,不同文件系统的行为是否有所不同?
提前致谢。
我经常使用非持久设备映射器快照,示例表如下所示:
0 10485760 snapshot /dev/sdc3 /dev/sdc6 N 16
万一发生崩溃,我仍然拥有两者/dev/sdc3
,/dev/sdc6
因为磁盘是非易失性的。但是是否有可能取回该snapshot
设备,或者至少以某种方式恢复更改/dev/sdc6
?我知道持久快照的存在是出于我的目的,但我仍然很好奇。谢谢。
例如,我有一个(GPT 分区的)磁盘/dev/sda
。
/dev/sda8
是该磁盘上的一个分区。我使用该cfdisk
实用程序在/dev/sda8
. 我希望这些分区可以通过类似/dev/sda8p1
. 但Linux并没有自动识别它们。
如何让 Linux 识别分区中的分区,并在可能的情况下实现自动化?
我使用的是 Linux (Ubuntu),有人告诉我可以使用下面描述的方法将系统的硬盘克隆到另一个硬盘 - 插入一台新机器。(无需从 Live CD 启动)
它假设系统的磁盘是/dev/sda
,以 root 身份挂载的分区是/dev/sda1
,并且将其克隆到的空磁盘是/dev/sdb
。
echo u > /proc/sysrq-trigger
重新挂载所有文件系统,包括以 root 只读方式挂载的文件系统。
e2fsck -fy /dev/sda1
更正了因强制 R/O 重新挂载而导致的文件系统错误。
dd if=/dev/sda of=/dev/sdb
将磁盘克隆到空磁盘。
e2fsck -fy /dev/sdb1
修复新克隆的文件系统。在这一步,它通常会告诉您固定的块校验和。
reboot -f
重新启动系统。在此步骤中,我断开新克隆的磁盘,并将其插入新电脑。
我已经使用此方法两次,并且所有机器都工作正常,但我担心这样做可能会导致一些危险的文件系统问题?如果是,为什么?我以后应该避免使用这种方法克隆硬盘吗?