如何在内部存储中检查文件(例如群集或扇区#)的位置? -- internal-storage 领域 和 file-system 领域 android 相关 的问题

How Can I Check the Location of a File (e.g. Cluster or Sector #) in the Internal Storage?


简体版||繁體版
1
vote

问题

中文

我想知道我是否在写入/更新之间移动某些文件在闪存(内部存储器)上移动。

有些方法我可以在闪存上获取文件的位置吗?
(群集号码,扇区号等)

我正在使用Android v8,
并且可以安装使用应用程序,
或者使用命令行,如果在Linux命令中存在相关命令,则Android具有。

英文原文

I would like to know If I certain file moves on the Flash memory (internal storage), between writes/updates to it.

Is there some way I can get the file's location on the Flash memory?
(Cluster Number, Sector Number, etc)

I am using Android v8,
and can either install use an App for that,
or use the Command Line, If a relevant command exists in the Linux command-prompt that Android has.

     

回答列表

0
 
vote

我假设 群集 你是指Windows'分配单元,在Linux世界中常见于 。它是一个数据存储的单位文件系统使用。群集/块可以包含或对应于底层存储介质(HDD或闪存存储)上的多个 扇区 。扇区是存储OS可以读取或写入的最小原子单元。块大小在文件系统创建时决定,即我们格式化分区时( high-level formatting )。分区和文件系统使其易于对物理存储设备进行分类和组织我们的数据。

硬盘驱动器

"扇区" 可以参考 物理扇区 逻辑扇区 。在HDD的早期,只有通过将簇/轨道分成旋转磁盘进入小部分而产生的物理扇区。 c ylinder / h ead / s ector(chs)是在 l ogical之前的一种流行的解决方法 b 锁定 a dddressing(lba)。操作系统而不是直接处理物理扇区,而是通过引用LBA号码与磁盘控制器固件(通过SATA / SCSI命令)交谈。返回的固件维护 lba到chs mapping 本身,其中包括 ecc , G-List (磁盘的缺陷表)等。此映射(1:1 / semence / linear) ref )在制造时的 abcdefghijklmnabcdefghijklmnlow-level formatting 期间创建的,除了某些扇区的磁盘驱动器时,它永远不会改变,除了标记坏并重新映射到某些备用扇区。因此,操作系统/文件系统了解磁盘的物理几何形状,它是授权的LBA的几何形状。

闪存存储

在闪存介质(SSD,EMMC,UF,SD卡等)上没有旋转磁盘,因此没有汽缸。 NAND闪光由硅电池制成,每个细胞由一个(<强> S ingle- l evel- c ell),两个( m ulti- lc ),三( t riple- lc )或四( q aad - <强> lc )位。将细胞分为<强>页面(例如4kb),并进入<强>擦除块(例如128 kB)。 lbas到 p hysical b lock a ddresses映射由 f leash t 播回<强> l ayer;闪存控制器固件的一部分。操作系统一无所知,它可以在最大限度地看到LBA,而不是下面发生的事情。甚至不是 Ecc 的失败的内存单元,这就是我们不实现的原因emmc的不良健康,除非它失败,除非阅读 EXT_CSD (需要root)使用 mmc-utils 或来自 /sys/class/mmc_host/*/*/life_time (如果驱动程序支持)。

由于内存页面不能只是覆盖与HDD不同,因此整个 eraseBlock 必须是 擦除 <强之前> 编程 (写)。副作用是删除/重写的数量的页面,并且即使编辑小文件,物理映射也会发生变化。这种不必要的读取修改 - 写入( RMW w 仪式 a mplification。在HDD上,除非缩短或伸长,否则文件不会物理更换。操作系统知道硬盘上的这些物理更改,但不在闪存上。

什么是扇区?

所以毕竟我们关注的是逻辑领域。 存储媒体通知操作系统其逻辑扇区大小,但"the ,因为HDD已经使用 512B from早期,虽然事情已经发生了与 4kn格式用于HDD。 512B 是尺寸的尺寸,在实际上,对于标题,ECC等空间,闪存存储上的一些空间是一个更大的空间是 No USE 给我们。


您的查询:

我想知道某个文件是否在闪存(内部存储器)上移动,写入/更新之间。

取决于"移动" 的定义。在闪存存储上,即使您没有写入文件,它可能会继续通过背景 g 插头 c ollection来改变其真实的物理位置;由FTL内部控制的现象以减少WA,实现<强> 磨损水平 ,并通过删除提供高写入吞吐量(程序操作) 无效的页面 在背景中(擦除操作)。

有些方法可以在闪存(群集号,扇区号等)上获取文件的位置吗?

是,您可以获得文件的文件系统块地址,该文件具有线性映射与底层块设备的LBA(分区)。但这些地址不是闪存上的实际/物理文件的位置。然而,除非涉及某些取证或数据恢复,否则通常一个人不关心真实的物理位置。

示例

  ~# cat /sys/block/mmcblk0/queue/logical_block_size 512 ~# blockdev --getss /dev/block/by-name/cache 512 ~# tune2fs -l /dev/block/by-name/cache | grep 'Block size' Block size:               4096   

所以这里的扇区大小是512b,而文件系统块大小为4kib。让我们创建一个测试文件:

  ~# echo foobar >/cache/test_file ~# cat /cache/test_file foobar ~# filefrag -sv -b512 /cache/test_file Filesystem type is: ef53 File size of /cache/test_file is 7 (8 block of 512 bytes)  ext:     logical_offset:        physical_offset: length:   expected: flags:       0:        0..       7:     307200..    307207:      8:             last,eof /cache/test_file: 1 extent found   

* debugfs -R 'stat test_file' /dev/block/by-name/cache 也可以用代替 filefrag

创建的文件(7个字节大小)占用1个文件系统块。 low-level formatting0 将块大小(4096b)转换为扇区大小(512b)。 "test_file" 应在307200 th 扇区,同样适用于分区和文件系统,因为文件系统占用整个分区:

  low-level formatting1  

让我们直接从分区读取文件:

  low-level formatting2  

它在那里。现在从emmc的开始定位文件:

  low-level formatting3  

因此即使文件系统和分区被删除,您也可以读取该文件(提供它未被覆盖)。

让我们做一些更多的挖掘:

  low-level formatting4  

文件从文件系统中删除,但在身体上仍然存在。让我们询问FTL永久删除它:

  low-level formatting5  

它已经消失了。但大多数可能仍然存在于 o ver- p rovision空间中,计划在下一个gc中的擦除 ,我们不知道它在哪里。

注意:

  • low-level formatting6 在naked partitions上是一个杀手。 谨慎!
  • low-level formatting7 low-level formatting8 是 e2fsprogs low-level formatting9 未与android一起发货,从源或尝试这个< / a>。 EXT_CSD0 是一个busybox applet。

相关:

  • 应该fstrim运行?
  • 恢复删除数据困难/不可能?

 

I assume by saying cluster you mean Windows' allocation unit, commonly called block in Linux world. It's a unit of data storage a filesystem uses. A cluster/block may consist of or correspond to multiple sectors on underlying storage media (HDD or flash storage). Sector is the minimum atomic unit of storage an OS can read or write. Block size is decided at the time of filesystem creation i.e. when we format a partition (high-level formatting). Partitions and filesystems make it easy to categorize and organize our data on the physical storage device.

HARD DISK DRIVES

"Sector" may refer to a physical sector or logical sector. In early days of HDDs there were only physical sectors created by dividing clusters/tracks on rotating disks into small parts. Cylinder/Head/Sector (CHS) has been a popular method of addressing before the Logical Block Addressing (LBA) was devised. Instead of directly dealing with physical sectors, OS now talks to disk controller firmware (through SATA/SCSI commands) referring an LBA number. Firmware in return maintains an LBA to CHS mapping itself, which includes ECC, G-list (disk's defect table) etc. This mapping (1:1 / sequenced / linear) (ref) is created during low-level formatting of disk drive when manufacturing, which never changes except if some sector is marked bad and remapped to some spare sector. So the OS / filesystem is aware of the physical geometry of the disk, which is propotional to the geometry of LBAs.

FLASH STORAGE

On flash media (SSDs, eMMC, UFS, SD cards etc.) there are no rotating disks and hence no cylinders. NAND flash is made of silicon cells, each cell consists of one (Single-Level-Cell), two (Multi-LC), three (Triple-LC) or four (Quad-LC) bits. Cells are grouped into pages (e.g. of 4KB) and pages into erase blocks (e.g. of 128 KB). LBAs to Physical Block Addresses mapping is fully controlled by Flash Translation Layer; a part of flash controller firmware. OS knows nothing about it, it can see at maximum the LBAs, not what's happening below it. Not even the ECC of failed memory cells, and that's why we don't realize the bad health of eMMC unless it fails, except by reading EXT_CSD (requires root) using mmc-utils or from /sys/class/mmc_host/*/*/life_time (if driver supports).

Since a page of memory can't be just overwritten unlike HDDs, a whole EraseBlock has to be Erased first before being Programmed (written). A side effect is that a number of pages are erased/re-written and the physical mapping changes even if a small file is edited. This unnecessary read-modify-write (RMW) is called Write Amplification. On HDDs, files aren't physically replaced unless shortened or elongated. OS is aware of these physical changes on HDD, but not on flash memory.

WHAT IS SECTOR?

So after all what we are concerned with is logical sector. Storage media informs the OS of its logical sector size but xe2x80x9cthe default of 512 covers most hardwarexe2x80x9d because HDDs have been using 512B from early days, though things have changed with 4Kn format for HDDs too. 512B is the size what OS sees, in actual it's a bit larger to make some room for header, ECC etc. Physical sector size on flash storage is of no use to us.


Your queries:

I would like to know if a certain file moves on the Flash memory (internal storage), between writes/updates to it.

It depends on the definition of xe2x80x9cmovexe2x80x9d. On flash storage, even if you don't write to a file, it may keep on changing its true physical location due to background Garbage Collection; a phenomenon controlled by FTL internally to reduce WA, to achieve Wear Leveling and to provide high write throughput (Program operations) by deleting invalid pages in background (Erase operations).

Is there some way I can get the file's location on the Flash memory (Cluster Number, Sector Number etc.)?

Yes you can get the filesystem block addresses of a file which have a linear mapping with LBAs of underlying block device (partition). But these addresses aren't the actual/physical file's location on the Flash memory. However usually one isn't concerned with true physical location unless some forensics or data recovery is involved.

EXAMPLE

~# cat /sys/block/mmcblk0/queue/logical_block_size 512 ~# blockdev --getss /dev/block/by-name/cache 512 ~# tune2fs -l /dev/block/by-name/cache | grep 'Block size' Block size:               4096 

So the sector size here is 512B while filesystem block size is 4KiB. Let's create a test file:

~# echo foobar >/cache/test_file ~# cat /cache/test_file foobar ~# filefrag -sv -b512 /cache/test_file Filesystem type is: ef53 File size of /cache/test_file is 7 (8 block of 512 bytes)  ext:     logical_offset:        physical_offset: length:   expected: flags:       0:        0..       7:     307200..    307207:      8:             last,eof /cache/test_file: 1 extent found 

* debugfs -R 'stat test_file' /dev/block/by-name/cache can also be used in place of filefrag

Created file (of 7 bytes size) occupies 1 filesystem block. -b 512 converts block size (4096B) to sector size (512B). "test_file" should be at 307200th sector, same for partition and filesystem because filesystem occupies whole partition:

~# blockdev --getsize64 /dev/block/by-name/cache | awk '$1 /= 4096' 65536 ~# tune2fs -l /dev/block/by-name/cache | grep 'Block count' Block count:              65536 

Let's read the file directly from partition:

~# dd if=/dev/block/by-name/cache skip=307200 count=1 | head -c7 foobar 

It's there. Now locate the file from the start of eMMC:

~# readlink /dev/block/by-name/cache /dev/block/mmcblk0p25 ~# cat /sys/block/mmcblk0/mmcblk0p25/start 7471104 ~# dd if=/dev/block/mmcblk0 skip=$(( 7471104 + 307200 )) count=1 | head -c7 foobar 

So even if filesystem and partition are deleted, you can read the file (provided that it's not overwritten).

Let's do some more digging:

~# rm /cache/test_file; sync; echo -n 1 >/proc/sys/vm/drop_caches ~# dd if=/dev/block/mmcblk0 skip=$(( 7471104 + 307200 )) count=1 | head -c7 foobar 

File is deleted from filesystem, but physically still there. Let's ask FTL to delete it permanently:

~# fstrim /cache; sync; echo -n 1 >/proc/sys/vm/drop_caches ~# dd if=/dev/block/mmcblk0 skip=$(( 7471104 + 307200 )) count=1 | head -c7 

And it's gone. But most probably it's still there somewhere in Over-Provisioning Space, scheduled to be Erased in next GC, just we don't know where it is.

Note:

  • dd on naked partitions is a killer. Be cautious!
  • tune2fs and filefrag are part of e2fsprogs. filefrag isn't shipped with Android, build from source or try this one. fstrim is a busybox applet.

RELATED:

  • When should fstrim run?
  • What makes recovery of deleted data difficult / impossible?
 
 

相关问题

-2  我如何让系统文件夹在没有生根的情况下写入?  ( How can i make the system folder writable without rooting ) 
我的设备是 Sprint Samsung Galaxy S III 型号: SPH-L710 我想这样做,因为我想停止相机快门声音。 我不想root我的设备。 ...

0  build.prop修改了。但没有更新系统(例如,在设置中的平板电脑)  ( Build prop modifies okay but not updates in system e g about tablet in settin ) 
我在VirtualBox上运行Android-x86 4.4。一切都很好。 但是,当我用其他制造商或模型修改build.prop(使用es文件资源管理器或buildprop编辑器)并保存它。重新启动后任何发生。关于平板电脑存储旧信息。 似乎是Android缓存此信息某个信息。 任何想法?如何强制android从b...

0  从文件名更改文件(图片,视频)时间戳  ( Change file pictures videos timestamp from filename ) 
当周围移动不同的文件和跨pc /智能手机时,最后修改日期的时间戳通常会重置为移动/复制操作的非常日期。这导致文件在某些​​应用程序(画廊)中是非按时间顺序排序的,特别是尤其适用于图像和视频。 通常,这些文件遵循img_yyyyyymmmd_hhmmss.jpg的命名约定,用于图像和vid_yyyyymmdd_hhmm...

1  如何在内部存储中检查文件(例如群集或扇区#)的位置?  ( How can i check the location of a file e g cluster or sector in the interna ) 
我想知道我是否在写入/更新之间移动某些文件在闪存(内部存储器)上移动。 有些方法我可以在闪存上获取文件的位置吗? (群集号码,扇区号等) 我正在使用Android v8, 并且可以安装使用应用程序, 或者使用命令行,如果在Linux命令中存在相关命令,则Android具有。 ...

3  包含病毒的未知文件类型  ( Unknown file type containing a virus ) 
我会尽量保持故事,所以你可以更清楚地了解我的担忧。虽然,我使用Chrome浏览器应用程序在手机上浏览互联网,我收到了我下载文件的通知。通知显示正在下载的文件是一个mp3。 在我甚至有时间做出反应和停止下载过程之前,文件已经在我的手机上。我立即使用手机上的文件管理器从下载文件夹中删除它。但是,我注意到文件格式丢失了。...

2  Galaxy S3用于SD卡的文件系统格式  ( Filesystem format used for sd card by galaxy s3 ) 
当我删除由我的Galaxy S3格式化的SD卡,并将其放在MacBook中, fdisk 显示其唯一分区,与具有分区ID 0C 表示它是FAT32 LBA分区。但是,OSX无法安装它,并且Ubuntu似乎将其安装为exfat分区。 此分区上使用的文件系统是什么?可以在分区ID和分区上使用的文件系统之间的差异阻止OS...

2  更换/系统/ bin / toolbox。我如何恢复?  ( Replaced system bin toolbox how to i revert that ) 
我将原始/系统/ bin / toolbox"重命名为" toolbox_alt"。 我用一个应该工作的文件替换了文件/系统/ bin / toolbox,但根本不起作用。 我的FileManagers和最终端的昏迷停止了工作,我显然丢失了root访问权限。 我有一个三星Galaxy Note 3(N9005)(国际...

5  如何检查文件系统(/ sdcard)进行错误?  ( How to check filesystem sdcard for errors ) 
我想检查我/ sdcard,也可能是其他内部分区,因为文件系统级别的错误。 我想知道如何完成这一点。 我正在使用verizon wireless的三星Galaxy Nexus(Toro)。 更新: 此设备是否有一个实际的SD卡,我相信它是通过:"adb shell" (在系统靴子之前(即恢复模式内)的唯一方法,这...

0  如何更改Android的默认密钥按声音?  ( How to change androids default key press sound ) 
手机rooted,我尝试改变文件/ s; /system/media/audio/ui/*.ogg 及其权限; -rw-r--r-- 但仍然播放默认值。重新启动手机也不起作用。我错过了什么? ...

7  如何在Android上取消删除或恢复已删除的文件? [复制]  ( How do i undelete or recover deleted files on android ) 
这个问题已经在这里有答案: 关闭 9年前。 可能的重复: 如何在android上恢复删除的文件? 是否有一种方法可以在不使用标准USB存储恢复工具上恢复删除的文件,而无需使用标准USB存储恢...

30  如何查看android内部分区表?  ( How can i view the android internal partition table ) 
我扎根了我的设备,把它放在恢复模式下,并将其链接到pc by adb shell < / a>。 如何查看存储设备和分区列表? 注意: fdisk 不起作用。 ...

2  在哪里可以在文件系统中找到IP地址(例如proc或sys)  ( Where to find ip address in file system e g proc or sys ) 
是否有一种方法可以在Android文件系统中获取接口的IP(v4)地址?我知道我可以使用ifconfig或netcfg,但我想使用一个监控工具,只能只能访问文件而不是执行命令。 ...

1  通过卡读卡器从Windows 7访问Android SD  ( Access android sd from windows 7 via card reader ) 
我想在我的新手机使用它之前备份我的SD卡。所以我用一张读卡器将其连接到我的Windows 7笔记本。可悲的是,分区未安装到驱动器号,大家可以看到它在磁盘管理中没有错误。 我怀疑Android使用一个不受支持的文件系统。但是哪个以及如何从Windows读取它? 编辑:我的手机是一个moto g3。设备未植根。将S...

0  在“浏览”对话框中浏览整个文件系统?  ( Browse entire file system in browse dialog box ) 
我正在尝试使用Keepassdroid,当我选择keyfile部分的浏览按钮时,它会显示此屏幕:​​ 正如您所看到的,它只限于"最近,图像,视频,音频,下载" 。我的钥匙文件位于其他地方,无法从这些选项找到。 如何浏览整个文件系统并绕过这些预定义选项? ...

4  TWRP CreateTarfork()错误255备份数据时  ( Twrp createtarfork error 255 when backing up data ) 
我在我的onlusplus 5中安装了Freedomos 5.我不确定这是否与Freedomos有关,但是当我尝试使用数据,系统和引导的TWRP备份时,它与<代码>有一个错误createTarFork() 备份数据后不久。当我尝试从高级和运行' cd /data/media/0/TWRP/BACKUPS/bad7d6...

0  如何知道我的nexus设备是文件加密的?  ( How to know my nexus device is file encrypted ) 
从Android N支持新功能,称为文件加密。 如何识别我的设备是否是文件加密。 如果我使用触摸创建内部/数据典型内的任何新文件。我会在我做LS -L时看到该文件。 在创建文件后,文件名将显示为安全名称,如果设备是加密的文件。 ...

3  我应该在哪里安装Toybox?  ( Where should i install toybox ) 
我拥有一个rooted三星galaxy s继承4g运行股票和roid4.1.2。 如果您有Android 6.0"Marshmallow" 或更好,那么您有 toybox 。这是一包命令行工具,为有时使用终端仿真器的高级用户提供方便。不幸的是,Android 4.1.2不包括Toybox。相反,它包括一些与使用不太好...

3  挂载加密仿真AVD userData-qemu.img.qcow2  ( Mount encrypted emulated avd userdata qemu img qcow2 ) 
我正在尝试备份我的AVD。要加快速度,我喜欢制作增量备份。备份 *.img.qcow2 文件效率低下。我希望能够安装驻留在虚拟块设备上的文件系统,然后备份其内容。 我的设备是使用Google服务和播放商店运行Android Oreo 8.1 x86系统映像的模拟Nexus 5x。没有选项不为全磁盘加密userdata...

9  Android是否具有2.1GB的文件大小限制?  ( Does android have a 2 1gb file size limit ) 
我已经尝试过许多语音录制类型应用程序,我发现的最佳允许我录制到最大文件大小为2.1gb。我可以做这些2.1GB录制中的许多录制,因为我有一个相当大的SD卡。 在我尝试的其中一个应用程序上,开发人员具体说他/她的应用程序没有录音长度限制 所以我的问题,Android是否拥有每个文件的2.1GB限制? ...

4  什么时候应该fstrim运行?  ( When should fstrim run ) 
基于这个 cyanogenmod论坛线程,我尝试过通过手动运行FSTIM运行FSTIM,解决CyanogenMod运行CyanogenMod的Galaxy Nexus的应用程序之间的延迟。 root@maguro:/ # fstrim -v /data ...

0  为什么我的(ofrooed)/数据分区似乎是空的?  ( Why my unrooted data partition appears to be empty ) 
我有一些问题使用我/数据分区。除此之外,当我用Astro应用程序浏览其内容时,它似乎是空的。手机从未生根植根,它在最后一小时内至少重置了三次,所以我希望它至少最小的运作。 为什么/ data partitize为什么空?出厂重置时,是否不应该包含某些东西?这是我不一致的原因(也许他们不是不一致:他们缺失)UID? ...

29  什么是Android等同于/ etc / fstab?  ( Whats the android equivalent of etc fstab ) 
有时我真的希望他们这么多搞砸了Linux!我知道有一个 /etc/fstab 在某处,但在哪里? 我想用替代文件系统挂载一些分区(因为我不喜欢FAT32)。 ...

9  如何在SD卡上找到交换分区的路径名?  ( How to find the pathname of the swap partition on sd card ) 
作为 < / a>警告,你不应该在错误的分区上启用交换,或者您可以销毁您的手机: 在我们进一步进一步之前好的!之前的手机有一个分区布局,其中MMCBLCK0是SDCard(外部)我们的手机使用MMCB1CCK1用于外部SD。这很重要,因为如果使用应用程序,它可能会预设使用mmcblck0作为交换分区。使用此设置将导...

0  错误地,我从根文件中删除了系统文件夹,我的手机从我的手机中扎根,我的手机无法正常工作?  ( By mistake i deleted system folder from root file and my mobile was rooted from ) 
通过错误,我从根文件中删除了系统文件夹,我的手机从那时起我的手机扎根了我无法正常工作? USB Debbug是OFF FLAH文件找不到"REACH COGENT颜色" PLZZZ帮助我........ ...

11  如何将格式化为内部存储的损坏SD卡进行解密?  ( How to decrypt the corrupt sd card formatted as internal storage ) 
所以我在棉花糖上,并将我的SD卡格式化为内部存储。它的文件系统出于某种原因两周后损坏。 将其插入gparted,我看到16MB的FAT32,其余的是一个无法识别的文件系统。它不是未格式化的,只是无法识别。 gparted给出"无法读取文件系统的内容。" 两个分区的错误,尽管FAT32分区无瑕地从文件浏览器中访问。 ...

相关问题

-2  我如何让系统文件夹在没有生根的情况下写入? 
0  build.prop修改了。但没有更新系统(例如,在设置中的平板电脑) 
0  从文件名更改文件(图片,视频)时间戳 
1  如何在内部存储中检查文件(例如群集或扇区#)的位置? 
3  包含病毒的未知文件类型 
2  Galaxy S3用于SD卡的文件系统格式 
2  更换/系统/ bin / toolbox。我如何恢复? 
5  如何检查文件系统(/ sdcard)进行错误? 
0  如何更改Android的默认密钥按声音? 
7  如何在Android上取消删除或恢复已删除的文件? [复制] 
30  如何查看android内部分区表? 
2  在哪里可以在文件系统中找到IP地址(例如proc或sys) 
1  通过卡读卡器从Windows 7访问Android SD 
0  在“浏览”对话框中浏览整个文件系统? 
4  TWRP CreateTarfork()错误255备份数据时 
0  如何知道我的nexus设备是文件加密的? 
3  我应该在哪里安装Toybox? 
3  挂载加密仿真AVD userData-qemu.img.qcow2 
9  Android是否具有2.1GB的文件大小限制? 
4  什么时候应该fstrim运行? 
0  为什么我的(ofrooed)/数据分区似乎是空的? 
29  什么是Android等同于/ etc / fstab? 
9  如何在SD卡上找到交换分区的路径名? 
0  错误地,我从根文件中删除了系统文件夹,我的手机从我的手机中扎根,我的手机无法正常工作? 
11  如何将格式化为内部存储的损坏SD卡进行解密? 



© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有