linux中生成考核用的NTFS文件系统(历史版本)
注2017年6月25日修改:这个版本想得复杂了,还是改为python脚本容易实现的方式。见相关blog(ntfs案例一)
目的:
生成一个NTFS文件系统,要求:
1、$MFT至少2个碎片
2、根目录下建90个以从1开始的数字编号为名的子目录,每个子目录下建80-100个文件,文件编号从1开始编起。
3、有大量文件是由2个或以上碎片组成。(本例多为2个碎片)
1、shell 脚本如下:
!/bin/sh # Script.sh # # # Created by 张宇 on 2017/3/29. 此脚本已包含后面的命令 # mkdir ~/$1 cd ~/$1 qemu-img create -f raw $1.img 1G qemu-nbd -f raw -c /dev/nbd0 $1.img parted -s /dev/nbd0 mklabel msdos parted -s /dev/nbd0 mkpart -s primary NTFS 128s 100% mkfs.ntfs -f /dev/nbd0p1 mount.ntfs-3g /dev/nbd0p1 /mnt #第一段for,先创建30个子目录,每个目录下80-100个文件,大小为16K-48K,这一段基本连续 for((i=1;i<=3;i++));do mkdir /mnt/$i r1=$(($RANDOM % 20)) for((ii=1;ii<80+$r1;ii++));do r2=$(($RANDOM % 64 + 32)) dd if=/dev/urandom of=/mnt/$i/$ii bs=512 count=$r2 done done #sleep 60 便于让文件系统flush #sleep 60 mkdir /mnt/padding cd /mnt/padding #填充65000个文件,这样可以使NTFS $MFT填充到第一个使用的数据区段,从而产生$MFT 碎片。 for((i=1;i<65000;i++));do touch $i done #创建出其他4-90子目录,这些文件会位于$MFT的第二个片断或以后 for((i=4;i<=90;i++));do mkdir /mnt/$i r1=$(($RANDOM % 20)) for((ii=1;ii<80+$r1;ii++));do r2=$(($RANDOM % 64 + 32)) dd if=/dev/urandom of=/mnt/$i/$ii bs=512 count=$r2 done done #sleep 60 #第二段for,使用dd把第一段for创建出的文件,从0-16K的位置,写入48K-80K,基本保证>约2个碎片,子目录3下的文件是第一段$MFT下的文件,3之后的为$MFT第二个片断。 for((i=3;i<=90;i++));do cd /mnt/$i for ii in `ls`;do r2=$(($RANDOM % 64 + 96)) r3=$(($RANDOM % 32)) dd if=/dev/urandom of=/mnt/$i/$ii bs=512 seek=$r3 count=$r2 done done #删除padding,以免目录结构太臃肿 rm -rf /mnt/padding cd /mnt find . -type f -print|xargs md5sum -b |tr a-z A-Z 1>~/$1/md5.list for i in `find . -type f`;do ntfscluster -f -F $i /dev/nbd0p1;done 1>~/$1/file.info 2>/dev/null
2、在shell中执行如下命令:
qemu-img create -f raw test2.img 1G qemu-nbd -f raw -c /dev/nbd0 test2.img fdisk /dev/nbd0 #此命令交互,目的为/dev/nbd0分个区,不想交互,可使用parted加参数 mkfs.ntfs -f /dev/nbd0p1 mount.ntfs-3g /dev/nbd0p1 /mnt /bin/bash run.sh
3、测试结果是否满意:
命令一:ntfscluster -f -I 0 /dev/nbd0p1
结果与预想相符,$mft果然为2个片断:
Forced to continue.
Dump: /$MFT
0x10 - resident
0x30 - resident
0x80 - non-resident
VCN LCN Length
0 4 16387
16387 20488 1880
0xb0 - non-resident
VCN LCN Length
0 2 2
2 16391 1
命令二:ntfscluster -f -F 1/ /dev/nbd0p1
结果与预想相符,抽样目录,也为2个片断
Forced to continue.
Unnormalized path 1/
Dump: /1
0x10 - resident
0x30 - resident
0x50 - resident
0x90 - resident
0xa0 - non-resident
VCN LCN Length
0 53328 2
2 49238 1
0xb0 - resident
命令三: ntfscluster -f -F 60/9 /dev/nbd0p1
结果与预想相符,抽样文件,也为2个片断
Forced to continue.
Dump: /60/9
0x10 - resident
0x30 - resident
0x50 - resident
0x80 - non-resident
VCN LCN Length
0 211991 8
8 115298 7
4、生成所有文件的md5 哈希,便于生成考核答案
cd /mnt find . -type f -print|xargs md5sum -b |tr a-z A-Z
5、生成所有文件的碎片信息,便于生成考核答案
cd /mnt for i in `find . -type f`;do ntfscluster -f -F $i /dev/nbd0p1;done 2>/dev/null
6、生成目录的碎片信息,便于生成考核答案
cd /mnt for i in `find . -type d`;do ntfscluster -f -F $i /dev/nbd0p1;done 2>/dev/null
7、生成元文件的文件记录信息,便于生成考核答案
for((i=0;i<16;i++));do ntfscluster -f -I $i /dev/nbd0p1;done 2>/dev/null
或者通过命令:ntfscluster -i -f /dev/nbd0p1,
查看如下值:initialized mft records : 73115
再执行,下面命令即可将所有文件的碎片信息打印出来,再做加工,即可生成考核答案
for((i=0;i<73115;i++));do ntfscluster -f -I $i /dev/nbd0p1;done 2>/dev/null
ntfs-3g源码改动:
1、ntfscluster.c 400行while改为如下,目的是便于输出结果用grep,sed或awk加工
while ((rec = find_attribute(AT_UNUSED, ctx))) { ntfs_log_info(" 0x%02x - ", (int)le32_to_cpu(rec->type)); if (rec->non_resident) { ntfs_log_info("non-resident\n"); runs = ntfs_mapping_pairs_decompress(vol, rec, NULL); if (runs) { ntfs_log_info(" INODE ATTR RUN# VCN LCN Length\n"); for (i = 0; runs[i].length > 0; i++) { ntfs_log_info(" %8lld 0x%02x %8lld %8lld %8lld %8lld\n", (long long)(ino->mft_no & 0x0000FFFFFFFFFFFFUL), (int)le32_to_cpu(rec->type), (long long)i, (long long)runs[i].vcn, (long long)runs[i].lcn, (long long) runs[i].length); } ntfs_log_info(" [INFO]:0x%02xRuns:%d,Inode:%lld,path:%s\n", (int)le32_to_cpu(rec->type), i, (long long)(ino->mft_no & 0x0000FFFFFFFFFFFFUL), buffer); free(runs); } } else { ntfs_log_info("resident\n"); } }
结果将如下:
Dump: /50/3
0x10 - resident
0x30 - resident
0x50 - resident
0x80 - non-resident
INODE ATTR RUN# VCN LCN Length
69425 0x80 0 0 194588 9
69425 0x80 1 9 217183 8
[INFO]:0x80Runs:2,Inode:69425,path:/50/3
考题及答案生成部分:
1、$MFT:$DATA
2、$MFT:$BITMAP
3、在$MFT第一个片断中的,拥有$DATA:RUNLIST唯一一条记录的文件,回答其MD5
4、在$MFT第二个片断中的,拥有$DATA:RUNLIST两条记录的文件,回答其MD5
5、读取某个拥有至少2个A0属性的目录块的MD5
6、给定一个起始簇号,解释一个RUNLIST的前3条记录(样本中至少有3条记录)
7、恢复一个删除的文件 (可生成答案后,删除某个目录,再恢复其下面的某个文件即可)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
VBS脚本判断及获取两个文件之间的不同内容
由于公司目前的数据比较乱,近期做系统优化,A系统中有1000个用户,B系统有1300个用户,但是A系统中的用户是正确的,B系统中的数据不正确,也有可能是用户数据没有及时做删除,所以想通过vbs脚本进行判断及删除,所以我们需要将A系统中的用户导出来,然后以A系统的数据为准,然后同时将B系统的用户信息也导出来,通过vbs比较,将不同的数据写入到新生成的文件中做处理,具体见下: 以下是一个例子: A系统中导出的文件: B系统导出的文件: 执行的效果应该是在新生成的文件中,将B系统文件中的user06、user07写入到新的文件中就正常了; 因为:A系统的数据是准确的,所以通过比对后,将差异数据写入到新的数据文件中; DimTxt1,Txt2,Txt3 msgbox"请选择源文件-01" Txt1=CreateObject("WScript.Shell").Exec("mshtavbscript:""<inputtype=fileid=f><script>f.click();newActiveXObject('Scripting.FileSystemObject').G...
- 下一篇
Windows Server 2012 R2域控和Exchange 2016 ALL IN ONE
虽然微软是非常不推荐域控和Exchange在一台服务器上,但客户有这样的需求我们还是要迎头而上了,在此我给大家分享部署一台ALL IN ONE的结构仅供学习。 首先安装一台Windows Server 2012 R2的系统,安装过程不再累赘(安装域控前记得把服务器名改好) 现在开始装成域控 现在开始提升域控 设置域名 设置林级别域级别以及还原密码 一直下一步,设置AD数据库存放位置 先决检查完成开始安装 安装媒体基础功能 接下来安装随需的Windows Server 角色和功能 Install-WindowsFeature AS-HTTP-Activation, Desktop-Experience, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-ADDS, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, We...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2更换Tomcat为Jetty,小型站点的福音