日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Ext2 文件系統(tǒng)的硬盤(pán)布局

系統(tǒng) 2271 0

趙蔚 (zhaoway@public1.ptt.js.cn)

簡(jiǎn)介: 本文主要講述 Linux 上比較流行的 ext2 文件系統(tǒng)在硬盤(pán)分區(qū)上的詳細(xì)布局情況。Ext2 文件系統(tǒng)加上日志支持的下一個(gè)版本是 ext3 文件系統(tǒng),它和 ext2 文件系統(tǒng)在硬盤(pán)布局上是一樣的,其差別僅僅是 ext3 文件系統(tǒng)在硬盤(pán)上多出了一個(gè)特殊的 inode(可以理解為一個(gè)特殊文件),用來(lái)記錄文件系統(tǒng)的日志,也即所謂的 journal。由于本文并不討論日志文件,所以本文的內(nèi)容對(duì)于 ext2 和 ext3 都是適用的。

?

前言

本文的資料來(lái)源是 Linux 內(nèi)核中 ext3 文件系統(tǒng)的源代碼。為了便于讀者查閱源代碼,本文中一些關(guān)鍵的技術(shù)詞匯都使用了內(nèi)核源代碼中所使用的英語(yǔ)單詞,而沒(méi)有使用相應(yīng)的中文翻譯。(這種方法是否恰當(dāng),還請(qǐng)讀者朋友們指教。)

回頁(yè)首

粗略的描述

對(duì)于 ext2 文件系統(tǒng)來(lái)說(shuō),硬盤(pán)分區(qū)首先被劃分為一個(gè)個(gè)的 block,一個(gè) ext2 文件系統(tǒng)上的每個(gè) block 都是一樣大小的,但是對(duì)于不同的 ext2 文件系統(tǒng),block 的大小可以有區(qū)別。典型的 block 大小是 1024 bytes 或者 4096 bytes。這個(gè)大小在創(chuàng)建 ext2 文件系統(tǒng)的時(shí)候被決定,它可以由系統(tǒng)管理員指定,也可以由文件系統(tǒng)的創(chuàng)建程序根據(jù)硬盤(pán)分區(qū)的大小,自動(dòng)選擇一個(gè)較合理的值。這些 blocks 被聚在一起分成幾個(gè)大的 block group。每個(gè) block group 中有多少個(gè) block 是固定的。

每個(gè) block group 都相對(duì)應(yīng)一個(gè) group descriptor,這些 group descriptor 被聚在一起放在硬盤(pán)分區(qū)的開(kāi)頭部分,跟在 super block 的后面。所謂 super block,我們下面還要講到。在這個(gè) descriptor 當(dāng)中有幾個(gè)重要的 block 指針。我們這里所說(shuō)的 block 指針,就是指硬盤(pán)分區(qū)上的 block 號(hào)數(shù),比如,指針的值為 0,我們就說(shuō)它是指向硬盤(pán)分區(qū)上的 block 0;指針的值為 1023,我們就說(shuō)它是指向硬盤(pán)分區(qū)上的 block 1023。我們注意到,一個(gè)硬盤(pán)分區(qū)上的 block 計(jì)數(shù)是從 0 開(kāi)始的,并且這個(gè)計(jì)數(shù)對(duì)于這個(gè)硬盤(pán)分區(qū)來(lái)說(shuō)是全局性質(zhì)的。

在 block group 的 group descriptor 中,其中有一個(gè) block 指針指向這個(gè) block group 的 block bitmap,block bitmap 中的每個(gè) bit 表示一個(gè) block,如果該 bit 為 0,表示該 block 中有數(shù)據(jù),如果 bit 為 1,則表示該 block 是空閑的。注意,這個(gè) block bitmap 本身也正好只有一個(gè) block 那么大小。假設(shè) block 大小為 S bytes,那么 block bitmap 當(dāng)中只能記載 8*S 個(gè) block 的情況(因?yàn)橐粋€(gè) byte 等于 8 個(gè) bits,而一個(gè) bit 對(duì)應(yīng)一個(gè) block)。這也就是說(shuō),一個(gè) block group 最多只能有 8*S*S bytes 這么大。

在 block group 的 group descriptor 中另有一個(gè) block 指針指向 inode bitmap,這個(gè) bitmap 同樣也是正好有一個(gè) block 那么大,里面的每一個(gè) bit 相對(duì)應(yīng)一個(gè) inode。硬盤(pán)上的一個(gè) inode 大體上相對(duì)應(yīng)于文件系統(tǒng)上的一個(gè)文件或者目錄。關(guān)于 inode,我們下面還要進(jìn)一步講到。

在 block group 的 descriptor 中另一個(gè)重要的 block 指針,是指向所謂的 inode table。這個(gè) inode table 就不止一個(gè) block 那么大了。這個(gè) inode table 就是這個(gè) block group 中所聚集到的全部 inode 放在一起形成的。

一個(gè) inode 當(dāng)中記載的最關(guān)鍵的信息,是這個(gè) inode 中的用戶數(shù)據(jù)存放在什么地方。我們?cè)谇懊嫣岬剑粋€(gè) inode 大體上相對(duì)應(yīng)于文件系統(tǒng)中的一個(gè)文件,那么用戶文件的內(nèi)容存放在什么地方,這就是一個(gè) inode 要回答的問(wèn)題。一個(gè) inode 通過(guò)提供一系列的 block 指針,來(lái)回答這個(gè)問(wèn)題。這些 block 指針指向的 block,里面就存放了用戶文件的內(nèi)容。

2.1 回顧

現(xiàn)在我們回顧一下。硬盤(pán)分區(qū)首先被分為好多個(gè) block。這些 block 聚在一起,被分成幾組,也就是 block group。每個(gè) block group 都有一個(gè) group descriptor。所有這些 descriptor 被聚在一起,放在硬盤(pán)分區(qū)的開(kāi)頭部分,跟在 super block 的后面。從 group descriptor 我們可以通過(guò) block 指針,找到這個(gè) block group 的 inode table 和 block bitmap 等等。從 inode table 里面,我們就可以看到一個(gè)個(gè)的 inode 了。從一個(gè) inode,我們通過(guò)它里面的 block 指針,就可以進(jìn)而找到存放用戶數(shù)據(jù)的那些 block。我們還要提一下,block 指針不是可以到處亂指的。一個(gè) block group 的 block bitmap 和 inode bitmap 以及 inode table,都依次存放在這個(gè) block group 的開(kāi)頭部分,而那些存放用戶數(shù)據(jù)的 block 就緊跟在它們的后面。一個(gè) block group 結(jié)束后,另一個(gè) block group 又跟著開(kāi)始。

回頁(yè)首

詳細(xì)的布局情況

3.1 Super Block

所謂 ext2 文件系統(tǒng)的 super block,就是硬盤(pán)分區(qū)開(kāi)頭(開(kāi)頭的第一個(gè) byte 是 byte 0)從 byte 1024 開(kāi)始往后的一部分?jǐn)?shù)據(jù)。由于 block size 最小是 1024 bytes,所以 super block 可能是在 block 1 中(此時(shí) block 的大小正好是 1024 bytes),也可能是在 block 0 中。

硬盤(pán)分區(qū)上 ext3 文件系統(tǒng)的 super block 的詳細(xì)情況如下。其中 __u32 是表示 unsigned 不帶符號(hào)的 32 bits 的數(shù)據(jù)類(lèi)型,其余類(lèi)推。這是 Linux 內(nèi)核中所用到的數(shù)據(jù)類(lèi)型,如果是開(kāi)發(fā)用戶空間(user-space)的程序,可以根據(jù)具體計(jì)算機(jī)平臺(tái)的情況,用 unsigned long 等等來(lái)代替。下面列表中關(guān)于 fragments 的部分可以忽略,Linux 上的 ext3 文件系統(tǒng)并沒(méi)有實(shí)現(xiàn) fragments 這個(gè)特性。另外要注意,ext3 文件系統(tǒng)在硬盤(pán)分區(qū)上的數(shù)據(jù)是按照 Intel 的 Little-endian 格式存放的,如果是在 PC 以外的平臺(tái)上開(kāi)發(fā) ext3 相關(guān)的程序,要特別注意這一點(diǎn)。如果只是在 PC 上做開(kāi)發(fā),倒不用特別注意。struct ext3_super_block {
/*00*/ __u32 s_inodes_count;????? /* inodes 計(jì)數(shù) */
?????? __u32 s_blocks_count;????? /* blocks 計(jì)數(shù) */
?????? __u32 s_r_blocks_count;??? /* 保留的 blocks 計(jì)數(shù) */
?????? __u32 s_free_blocks_count; /* 空閑的 blocks 計(jì)數(shù) */
/*10*/ __u32 s_free_inodes_count; /* 空閑的 inodes 計(jì)數(shù) */
?????? __u32 s_first_data_block;? /* 第一個(gè)數(shù)據(jù) block */
?????? __u32 s_log_block_size;??? /* block 的大小 */
?????? __s32 s_log_frag_size;???? /* 可以忽略 */
/*20*/ __u32 s_blocks_per_group;? /* 每 block group 的 block 數(shù)量 */
?????? __u32 s_frags_per_group;?? /* 可以忽略 */
?????? __u32 s_inodes_per_group;? /* 每 block group 的 inode 數(shù)量 */
?????? __u32 s_mtime;???????????? /* Mount time */
/*30*/ __u32 s_wtime;???????????? /* Write time */
?????? __u16 s_mnt_count;???????? /* Mount count */
?????? __s16 s_max_mnt_count;???? /* Maximal mount count */
?????? __u16 s_magic;???????????? /* Magic 簽名 */
?????? __u16 s_state;???????????? /* File system state */
?????? __u16 s_errors;??????????? /* Behaviour when detecting errors */
?????? __u16 s_minor_rev_level;?? /* minor revision level */
/*40*/ __u32 s_lastcheck;???????? /* time of last check */
?????? __u32 s_checkinterval;???? /* max. time between checks */
?????? __u32 s_creator_os;??????? /* 可以忽略 */
?????? __u32 s_rev_level;???????? /* Revision level */
/*50*/ __u16 s_def_resuid;??????? /* Default uid for reserved blocks */
?????? __u16 s_def_resgid;??????? /* Default gid for reserved blocks */
?????? __u32 s_first_ino;???????? /* First non-reserved inode */
?????? __u16 s_inode_size;??????? /* size of inode structure */
?????? __u16 s_block_group_nr;??? /* block group # of this superblock */
?????? __u32 s_feature_compat;??? /* compatible feature set */
/*60*/ __u32 s_feature_incompat;? /* incompatible feature set */
?????? __u32 s_feature_ro_compat; /* readonly-compatible feature set */
/*68*/ __u8? s_uuid[16];????????? /* 128-bit uuid for volume */
/*78*/ char? s_volume_name[16];?? /* volume name */
/*88*/ char? s_last_mounted[64];? /* directory where last mounted */
/*C8*/ __u32 s_algorithm_usage_bitmap; /* 可以忽略 */
?????? __u8? s_prealloc_blocks;??????? /* 可以忽略 */
?????? __u8? s_prealloc_dir_blocks;??? /* 可以忽略 */
?????? __u16 s_padding1;?????????????? /* 可以忽略 */
/*D0*/ __u8? s_journal_uuid[16]; /* uuid of journal superblock */
/*E0*/ __u32 s_journal_inum;???? /* 日志文件的 inode 號(hào)數(shù) */
?????? __u32 s_journal_dev;????? /* 日志文件的設(shè)備號(hào) */
?????? __u32 s_last_orphan;????? /* start of list of inodes to delete */
/*EC*/ __u32 s_reserved[197];??? /* 可以忽略 */
};

我們可以看到,super block 一共有 1024 bytes 那么大。在 super block 中,我們第一個(gè)要關(guān)心的字段是 magic 簽名,對(duì)于 ext2 和 ext3 文件系統(tǒng)來(lái)說(shuō),這個(gè)字段的值應(yīng)該正好等于 0xEF53。如果不等的話,那么這個(gè)硬盤(pán)分區(qū)上肯定不是一個(gè)正常的 ext2 或 ext3 文件系統(tǒng)。從這里,我們也可以估計(jì)到,ext2 和 ext3 的兼容性一定是很強(qiáng)的,不然的話,Linux 內(nèi)核的開(kāi)發(fā)者應(yīng)該會(huì)為 ext3 文件系統(tǒng)另選一個(gè) magic 簽名才對(duì)。

在 super block 中另一個(gè)重要的字段是 s_log_block_size。從這個(gè)字段,我們可以得出真正的 block 的大小。我們把真正 block 的大小記作 B,B = 1 << (s_log_block_size + 10),單位是 bytes。舉例來(lái)說(shuō),如果這個(gè)字段是 0,那么 block 的大小就是 1024 bytes,這正好就是最小的 block 大小;如果這個(gè)字段是 2,那么 block 大小就是 4096 bytes。從這里我們就得到了 block 的大小這一非常重要的數(shù)據(jù)。

3.2 Group Descriptors

我們繼續(xù)往下,看跟在 super block 后面的一堆 group descriptors。首先注意到 super block 是從 byte 1024 開(kāi)始,一共有 1024 bytes 那么大。而 group descriptors 是從 super block 后面的第一個(gè) block 開(kāi)始。也就是說(shuō),如果 super block 是在 block 0,那么 group descriptors 就是從 block 1 開(kāi)始;如果 super block 是在 block 1,那么 group descriptors 就是從 block 2 開(kāi)始。因?yàn)?super block 一共只有 1024 bytes 那么大,所以不會(huì)超出一個(gè) block 的邊界。如果一個(gè) block 正好是 1024 bytes 那么大的話,我們看到 group descriptors 就是緊跟在 super block 后面的了,沒(méi)有留一點(diǎn)空隙。而如果一個(gè) block 是 4096 bytes 那么大的話,那么在 group descriptors(從 byte 4096 開(kāi)始)和 super block 的結(jié)尾之間,就有一定的空隙(4096 - 2048 bytes)。

那么硬盤(pán)分區(qū)上一共有多少個(gè) block group,或者說(shuō)一共有多少個(gè) group descriptors,這我們要在 super block 中找答案。super block 中的 s_blocks_count 記錄了硬盤(pán)分區(qū)上的 block 的總數(shù),而 s_blocks_per_group 記錄了每個(gè) group 中有多少個(gè) block。顯然,文件系統(tǒng)上的 block groups 數(shù)量,我們把它記作 G,G = (s_blocks_count - s_first_data_block - 1) / s_blocks_per_group + 1。為什么要減去 s_first_data_block,因?yàn)?s_blocks_count 是硬盤(pán)分區(qū)上全部的 block 的數(shù)量,而在 s_first_data_block 之前的 block 是不歸 block group 管的,所以當(dāng)然要減去。最后為什么又要加一,這是因?yàn)槲舶蜕峡赡芏喑鰜?lái)一些 block,這些 block 我們要把它劃在一個(gè)相對(duì)較小的 group 里面。

注意,硬盤(pán)分區(qū)上的所有這些 group descriptors 要能塞在一個(gè) block 里面。也就是說(shuō) groups_count * descriptor_size 必須小于等于 block_size。

知道了硬盤(pán)分區(qū)上一共有多少個(gè) block group,我們就可以把這么多個(gè) group descriptors 讀出來(lái)了。先來(lái)看看 group descriptor 是什么樣子的。struct ext3_group_desc
{
__u32 bg_block_bitmap;????? /* block 指針指向 block bitmap */
__u32 bg_inode_bitmap;????? /* block 指針指向 inode bitmap */
__u32 bg_inode_table;?????? /* block 指針指向 inodes table */
__u16 bg_free_blocks_count; /* 空閑的 blocks 計(jì)數(shù) */
__u16 bg_free_inodes_count; /* 空閑的 inodes 計(jì)數(shù) */
__u16 bg_used_dirs_count;?? /* 目錄計(jì)數(shù) */
__u16 bg_pad;?????????????? /* 可以忽略 */
__u32 bg_reserved[3];?????? /* 可以忽略 */
};

每個(gè) group descriptor 是 32 bytes 那么大。從上面,我們看到了三個(gè)關(guān)鍵的 block 指針,這三個(gè)關(guān)鍵的 block 指針,我們已經(jīng)在前面都提到過(guò)了。

3.3 Inode

前面都準(zhǔn)備好了以后,我們現(xiàn)在終于可以開(kāi)始讀取文件了。首先要讀的,當(dāng)然是文件系統(tǒng)的根目錄。注意,這里所謂的根目錄,是相對(duì)于這一個(gè)文件系統(tǒng)或者說(shuō)硬盤(pán)分區(qū)而言的,它并不一定是整個(gè) Linux 操作系統(tǒng)上的根目錄。這里的這個(gè) root 目錄存放在一個(gè)固定的 inode 中,這就是文件系統(tǒng)上的 inode 2。需要提到 inode 計(jì)數(shù)同 block 計(jì)數(shù)一樣,也是全局性質(zhì)的。這里需要特別注意的是,inode 計(jì)數(shù)是從 1 開(kāi)始的,而前面我們提到過(guò) block 計(jì)數(shù)是從 0 開(kāi)始,這個(gè)不同在開(kāi)發(fā)程序的時(shí)候要特別留心。(這一奇怪的 inode 計(jì)數(shù)方法,曾經(jīng)讓本文作者大傷腦筋。)

那么,我們先來(lái)看一下得到一個(gè) inode 號(hào)數(shù)以后,怎樣讀取這個(gè) inode 中的用戶數(shù)據(jù)。在 super block 中有一個(gè)字段 s_inodes_per_group 記載了每個(gè) block group 中有多少個(gè) inode。用我們得到的 inode 號(hào)數(shù)除以 s_inodes_per_group,我們就知道了我們要的這個(gè) inode 是在哪一個(gè) block group 里面,這個(gè)除法的余數(shù)也告訴我們,我們要的這個(gè) inode 是這個(gè) block group 里面的第幾個(gè) inode;然后,我們可以先找到這個(gè) block group 的 group descriptor,從這個(gè) descriptor,我們找到這個(gè) group 的 inode table,再?gòu)?inode table 找到我們要的第幾個(gè) inode,再以后,我們就可以開(kāi)始讀取 inode 中的用戶數(shù)據(jù)了。

這個(gè)公式是這樣的:block_group = (ino - 1) / s_inodes_per_group。這里 ino 就是我們的 inode 號(hào)數(shù)。而 offset = (ino - 1) % s_inodes_per_group,這個(gè) offset 就指出了我們要的 inode 是這個(gè) block group 里面的第幾個(gè) inode。

找到這個(gè) inode 之后,我們來(lái)具體的看看 inode 是什么樣的。struct ext3_inode {
__u16 i_mode;??? /* File mode */
__u16 i_uid;???? /* Low 16 bits of Owner Uid */
__u32 i_size;??? /* 文件大小,單位是 byte */
__u32 i_atime;?? /* Access time */
__u32 i_ctime;?? /* Creation time */
__u32 i_mtime;?? /* Modification time */
__u32 i_dtime;?? /* Deletion Time */
__u16 i_gid;???? /* Low 16 bits of Group Id */
__u16 i_links_count;????????? /* Links count */
__u32 i_blocks;?????????????? /* blocks 計(jì)數(shù) */
__u32 i_flags;??????????????? /* File flags */
__u32 l_i_reserved1;????????? /* 可以忽略 */
__u32 i_block[EXT3_N_BLOCKS]; /* 一組 block 指針 */
__u32 i_generation;?????????? /* 可以忽略 */
__u32 i_file_acl;???????????? /* 可以忽略 */
__u32 i_dir_acl;????????????? /* 可以忽略 */
__u32 i_faddr;??????????????? /* 可以忽略 */
__u8? l_i_frag;?????????????? /* 可以忽略 */
__u8? l_i_fsize;????????????? /* 可以忽略 */
__u16 i_pad1;???????????????? /* 可以忽略 */
__u16 l_i_uid_high;?????????? /* 可以忽略 */
__u16 l_i_gid_high;?????????? /* 可以忽略 */
__u32 l_i_reserved2;????????? /* 可以忽略 */
};

我們看到在 inode 里面可以存放 EXT3_N_BLOCKS(= 15)這么多個(gè) block 指針。用戶數(shù)據(jù)就從這些 block 里面獲得。15 個(gè) blocks 不一定放得下全部的用戶數(shù)據(jù),在這里 ext3 文件系統(tǒng)采取了一種分層的結(jié)構(gòu)。這組 15 個(gè) block 指針的前 12 個(gè)是所謂的 direct blocks,里面直接存放的就是用戶數(shù)據(jù)。第 13 個(gè) block,也就是所謂的 indirect block,里面存放的全部是 block 指針,這些 block 指針指向的 block 才被用來(lái)存放用戶數(shù)據(jù)。第 14 個(gè) block 是所謂的 double indirect block,里面存放的全是 block 指針,這些 block 指針指向的 block 也被全部用來(lái)存放 block 指針,而這些 block 指針指向的 block,才被用來(lái)存放用戶數(shù)據(jù)。第 15 個(gè) block 是所謂的 triple indirect block,比上面說(shuō)的 double indirect block 有多了一層 block 指針。作為練習(xí),讀者可以計(jì)算一下,這樣的分層結(jié)構(gòu)可以使一個(gè) inode 中最多存放多少字節(jié)的用戶數(shù)據(jù)。(計(jì)算所需的信息是否已經(jīng)足夠?還缺少哪一個(gè)關(guān)鍵數(shù)據(jù)?)

一個(gè) inode 里面實(shí)際有多少個(gè) block,這是由 inode 字段 i_size 再通過(guò)計(jì)算得到的。i_size 記錄的是文件或者目錄的實(shí)際大小,用它的值除以 block 的大小,就可以得出這個(gè) inode 一共占有幾個(gè) block。注意上面的 i_blocks 字段,粗心的讀者可能會(huì)以為是這一字段記錄了一個(gè) inode 中實(shí)際用到多少個(gè) block,其實(shí)不是的。那么這一字段是干什么用的呢,讀者朋友們可以借這個(gè)機(jī)會(huì),體驗(yàn)一下閱讀 Linux 內(nèi)核源代碼的樂(lè)趣。;-)

3.4 文件系統(tǒng)的目錄結(jié)構(gòu)

現(xiàn)在我們已經(jīng)可以讀取 inode 的內(nèi)容了,再往后,我們將要讀取文件系統(tǒng)上文件和目錄的內(nèi)容。讀取文件的內(nèi)容,只要把相應(yīng)的 inode 的內(nèi)容全部讀出來(lái)就行了;而目錄只是一種固定格式的文件,這個(gè)文件按照固定的格式記錄了目錄中有哪些文件,以及它們的文件名,和 inode 號(hào)數(shù)等等。struct ext3_dir_entry_2 {
__u32 inode;??? /* Inode 號(hào)數(shù) */
__u16 rec_len;? /* Directory entry length */
__u8? name_len; /* Name length */
__u8? file_type;
char? name[EXT3_NAME_LEN]; /* File name */
};

上面用到的 EXT3_NAME_LEN 是 255。注意,在硬盤(pán)分區(qū)上的 dir entry 不是固定長(zhǎng)度的,每個(gè) dir entry 的長(zhǎng)度由上面的 rec_len 字段記錄。

回頁(yè)首

小結(jié)

有了以上的這些信息,我們就可以讀取一個(gè) ext3 文件系統(tǒng)的全部?jī)?nèi)容了。如果讀者有 Windows 驅(qū)動(dòng)程序開(kāi)發(fā)的經(jīng)驗(yàn),從本文的信息,開(kāi)發(fā)一個(gè) Windows 下只讀的 ext3 文件系統(tǒng)是可能的。但是要想又讀又寫(xiě),那還需要了解 Ext3 的日志文件的結(jié)構(gòu),而本文限于篇幅,并沒(méi)有包括這方面的內(nèi)容。

參考資料

1 Remy Card, Theodore Ts'o, Stephen Tweedie, Design and Implementation of the Second Extended Filesystem, http://web.mit.edu/tytso/www/linux/ext2intro.html

2 Linux Kernel 2.4.18 Source Code, http://lxr.linux.no/source/fs/ext3/

關(guān)于作者

趙蔚,是中國(guó)大陸第二個(gè)注冊(cè)的 Debian GNU/Linux 義務(wù)開(kāi)發(fā)人員。作者對(duì)于 LISP 和 Lambda Calculus 也有濃厚的興趣。

Ext2 文件系統(tǒng)的硬盤(pán)布局


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 沾益县| 上林县| 丹凤县| 航空| 瓦房店市| 巴楚县| 军事| 丹阳市| 龙岩市| 石河子市| 金平| 舟曲县| 电白县| 台山市| 华容县| 土默特左旗| 临清市| 来安县| 西宁市| 孙吴县| 蒙山县| 黄山市| 浑源县| 乐安县| 葵青区| 镇江市| 鸡东县| 莱芜市| 榆中县| 兰州市| 贡嘎县| 定兴县| 沭阳县| 福鼎市| 鸡西市| 喀什市| 南华县| 虞城县| 青岛市| 新竹市| 登封市|