From 360efa59a27462d4088ec509e58c68bf465a628e Mon Sep 17 00:00:00 2001 From: jinjin Date: Tue, 18 Feb 2020 00:22:56 -0500 Subject: [PATCH] package init --- README.en.md | 36 ------ README.md | 39 ------- sparsify.c | 274 +++++++++++++++++++++++++++++++++++++++++++++ zerofree-1.1.1.tgz | Bin 0 -> 8710 bytes zerofree.8 | 65 +++++++++++ zerofree.spec | 45 ++++++++ 6 files changed, 384 insertions(+), 75 deletions(-) delete mode 100644 README.en.md delete mode 100644 README.md create mode 100644 sparsify.c create mode 100644 zerofree-1.1.1.tgz create mode 100644 zerofree.8 create mode 100644 zerofree.spec diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 419bfd8..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# zerofree - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index b3d2656..0000000 --- a/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# zerofree - -#### 介绍 -{**以下是码云平台说明,您可以替换此简介** -码云是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 码云特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 -5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/sparsify.c b/sparsify.c new file mode 100644 index 0000000..4c52e00 --- /dev/null +++ b/sparsify.c @@ -0,0 +1,274 @@ +/* + * sparsify - a tool to make files on an ext2 filesystem sparse + * + * Copyright (C) 2004-2012 R M Yorston + * + * This file may be redistributed under the terms of the GNU General Public + * License, version 2. + */ +#include +#include +#include +#include + +#define USAGE "usage: %s [-n] [-v] filesystem filename ...\n" + +/* initially assume pre-ext4 API version */ +#define API 140 + +#if defined(BLOCK_FLAG_READ_ONLY) +#undef API +#define API 141 +#endif + +#if defined(EXT2_FLAG_64BITS) +#undef API +#define API 142 +#endif + +struct process_data { + unsigned char *buf; + int verbose; + int dryrun; + blk_t count; + blk_t blocks; + blk_t total_blocks; + int old_percent; +}; + +static int process(ext2_filsys fs, blk_t *blocknr, e2_blkcnt_t blockcnt, + blk_t ref_block, int ref_offset, void *priv) +{ + struct process_data *p; + errcode_t errcode; + int i, group; + int ret = 0; + + p = (struct process_data *)priv; + + p->blocks++; + if ( blockcnt >= 0 ) { + errcode = io_channel_read_blk(fs->io, *blocknr, 1, p->buf); + if ( errcode ) { + return BLOCK_ABORT; + } + + for ( i=0; i < fs->blocksize; ++i ) { + if ( p->buf[i] ) { + break; + } + } + + if ( i == fs->blocksize ) { + p->count++; + + if ( !p->dryrun ) { + ext2fs_unmark_block_bitmap(fs->block_map, *blocknr); + group = ext2fs_group_of_blk(fs, *blocknr); +#if API >= 142 + ext2fs_bg_free_blocks_count_set(fs, group, + ext2fs_bg_free_blocks_count(fs, group)+1); + ext2fs_free_blocks_count_add(fs->super, (blk64_t)1); +#else + fs->group_desc[group].bg_free_blocks_count++; + fs->super->s_free_blocks_count++; +#endif +#if API >= 141 + ext2fs_group_desc_csum_set(fs, group); +#endif + *blocknr = 0; + ret = BLOCK_CHANGED; + } + } + + if ( p->verbose ) { + double percent; + + percent = 100.0 * (double)p->blocks/(double)p->total_blocks; + + if ( (int)(percent*10) != p->old_percent ) { + fprintf(stderr, "\r%4.1f%%", percent); + p->old_percent = (int)(percent*10); + } + } + } + + return ret; +} + +int main(int argc, char **argv) +{ + int verbose = 0; + int dryrun = 0; + errcode_t ret; + int flags; + int superblock = 0; + int open_flags = EXT2_FLAG_RW; + int iter_flags = 0; + int blocksize = 0; + ext2_filsys fs = NULL; + struct ext2_inode inode; + ext2_ino_t root, cwd, inum; + int i, c; + struct process_data pdata; + + while ( (c=getopt(argc, argv, "nv")) != -1 ) { + switch (c) { + case 'n' : + dryrun = 1; +#if defined(BLOCK_FLAG_READ_ONLY) + iter_flags |= BLOCK_FLAG_READ_ONLY; +#endif + break; + case 'v' : + verbose = 1; + break; + default : + fprintf(stderr, USAGE, argv[0]); + return 1; + } + } + + if ( argc < optind+2 ) { + fprintf(stderr, USAGE, argv[0]); + return 1; + } + + ret = ext2fs_check_if_mounted(argv[optind], &flags); + if ( ret ) { + fprintf(stderr, "%s: failed to determine filesystem mount state %s\n", + argv[0], argv[optind]); + return 1; + } + + if ( flags & EXT2_MF_MOUNTED ) { + fprintf(stderr, "%s: filesystem %s is mounted\n", + argv[0], argv[optind]); + return 1; + } + + ret = ext2fs_open(argv[optind], open_flags, superblock, blocksize, + unix_io_manager, &fs); + if ( ret ) { + fprintf(stderr, "%s: failed to open filesystem %s\n", + argv[0], argv[optind]); + return 1; + } + + pdata.buf = (unsigned char *)malloc(fs->blocksize); + if ( pdata.buf == NULL ) { + fprintf(stderr, "%s: out of memory (surely not?)\n", argv[0]); + return 1; + } + + ret = ext2fs_read_inode_bitmap(fs); + if ( ret ) { + fprintf(stderr, "%s: error while reading inode bitmap\n", argv[0]); + return 1; + } + + ret = ext2fs_read_block_bitmap(fs); + if ( ret ) { + fprintf(stderr, "%s: error while reading block bitmap\n", argv[0]); + return 1; + } + + root = cwd = EXT2_ROOT_INO; + + for ( i=optind+1; isuper->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) + && (inode.i_flags & EXT4_HUGE_FILE_FL) ) { + fprintf(stderr, "%s: unable to process %s, it's huge\n", + argv[0], argv[i]); + continue; + } +#endif + + if ( verbose ) { + printf("processing %s\n", argv[i]); + } + + pdata.verbose = verbose; + pdata.dryrun = dryrun; + pdata.count = pdata.blocks = 0; + pdata.total_blocks = inode.i_blocks/(fs->blocksize >> 9); + pdata.old_percent = 1000; + ret = ext2fs_block_iterate2(fs, inum, iter_flags, NULL, + process, &pdata); + if ( ret ) { + fprintf(stderr, "%s: failed to process file %s\n", argv[0], + argv[i]); + continue; + } + + if ( pdata.count && !dryrun ) { + ext2fs_mark_bb_dirty(fs); + ext2fs_mark_super_dirty(fs); + + ret = ext2fs_read_inode(fs, inum, &inode); + if ( ret ) { + fprintf(stderr, "%s: failed to open inode (%s)\n", argv[0], + argv[i]); + continue; + } + +#if API >= 141 + ret = ext2fs_iblk_sub_blocks(fs, &inode, (blk64_t)pdata.count); + if ( ret ) { + fprintf(stderr, "%s: failed to update block count (%s)\n", + argv[0], argv[i]); + continue; + } +#else + inode.i_blocks -= pdata.count * (fs->blocksize >> 9); +#endif + + ret = ext2fs_write_inode(fs, inum, &inode); + if ( ret ) { + fprintf(stderr, "%s: failed to write inode (%s)\n", + argv[0], argv[i]); + continue; + } + } + + if ( verbose ) { + printf("\r%d/%d/%d %s\n", pdata.count, pdata.blocks, + pdata.total_blocks, argv[i]); + } + } + + ret = ext2fs_close(fs); + if ( ret ) { + fprintf(stderr, "%s: error while closing filesystem\n", argv[0]); + return 1; + } + + return 0; +} diff --git a/zerofree-1.1.1.tgz b/zerofree-1.1.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..dabb2e3f730a455b75816b688c33d97d84db5018 GIT binary patch literal 8710 zcmV+hBKh4PiwFRBhKgDM1MFLSa~nr;*T3A#hZxhb1;|SXfJn)fPQIcf%11}95~(<@ zI~QxPI{?<)2ePwE3XYvmlW&qQmS1@HrE?DAdelEa-TVt1yeyQd$&?iv1M%3@j? zb1)j54|nYUXm~Wb@ArRv|L_6!|K8EP@hvs{ z9eLRK`G3Cuckcx1j`G{C4wP0^QKb064;4S1q(yXTRgx>6EAzhk^Z4NK2Q^JnW0$rv z8AuS7r^RAfCbM~^dQbamJRBY#jIq<|t$L}xFG^b#xf^*tPb|+@nO>@iQKg9!Tb0SA zu1u`zJT|4O=0;Vf%&aP={NFP1n|hKa5z%^)L?*W;R9B|7Ns+7Z!1FWL z`OMgd?kn+fFdQF@#|o3Cm5OxAf)a+Yc!6VfQcpJ@nru-m-Kr7(jSECsqrfaeY$ZgWFgKp(G`?_eyVO`-QC~+u#OFz2 zP3K8mF3UQX2f^O;oDxD$^`gf!Qx%JohH5{*nm*j`_thtl)xk*h74*DkuM>(o zy-2=B8su;1x79;@*=wke9?{nc4Da$$GwRBXYPs4vZ0d#)c{~#}T4)1$+d_4n?Aduh=aY z)uOpUKue|DI`_}S}MFTU^J$a%{p z;$YHA@z=kB%@qw(SX}Hv$j=MA%<3+{xrtk(f?Ff~mN#Hwf#HDxhLfE>+LgrAe0n zfYl%S8*aNM80J`0^?2pbhYI|%!Qjfax-8y-10TOL_zn11!adOeeseHbNPUQ7u1Ov@ z$;~Acmxt)vfWEiMinc*gS$`)~B5~OkX~9lfQzFnNk|Gq8Gz!VVc;cGj{z}W;%#Evg%rEeX6mvbS8Y=H{E1q`4 zzO-nrA?GlTo3kNz7e=oO&Z`Tr>#~1Xcp`j*@T<7sm$g*B>P2oTf$c41^$_-EH}LMY zn$%NJ|Bdm8=8|A5p#MX7g1#c;{1W_ccXNLIXRZJDQePSp{dZmC=KdeP939;njfbPr zaEv%JrvBgPX!MW%-{0c%^y%YS6a@iL$wSq4e}lb$?md0lSNO@LXkQ%^ZI`eerw&qa zx*&*BqjSLgyOSipTV^Oy)SW@0?)+yn{O`~`{?C8b{Qv3eH{YMW`sVjtgZ=+-m;WE$ z!`EA*;r*irM@QpBdOjNC_kZ~R-{P~kM=e_Jte?C(d3*dqy?OWK#pzRp|4v?=odhxf zpMUl3^-z6Vqp}@+_0=c{)|&pKufF^$PbNd2BCU+tP~Q%Xml{TH+-O|!VlC5FvPN;o}nd( zm?c#uwO#~vl+I(-o+mKgz|tALOpFcWJOMLPIXX~r5pi#Y&|pP{T0SETkW@q-MU&KnxtXN6VTFGtO z(O}Nf=zOUP%qi8PEM}$70NDse>bja2rG=I<*a1ccwUzAyOTDuqGj7^0i(C;dDqt>r z#1eRAzepyfMp?Z>vLpvg)bXIN)b~ZLBAv6aOC`*(>K(^6q|>zlS*)B7 zxXcEBs^@H{oUthc>`yR*D=bY-N03(6iJkYuW+})LndFLy)Tr4Mwa68$h!i#hLQkr| zPlVCpYiBBrahAGbjhIdcRNyfZE{RC4a&s;Gdc8jqBl6@f^WwUp8y7^=5@qPw^6s1$ zG_^8OC9cB}&hoD0rlZT!kftKCA}i#fj7bs)Fjfjr+zZUv)!iaOi5Mr7wwLm%pj|0V zbM7gl2En<^Sy=@xZBuF@Qn)i^r6DjzEbua!Bq<6r7l(+lXf)Wmqg_pg#F0}!mtbVR ztcvG&Vcu(s(xD%*m7J}kxzb+c(AC_K+XeVmB`h(=3^k>)j@O~?@+@)o2kS^cDu;6T zT(;2y>y_L{k*yBI%XsdZIb+I_9V~22tz%wz8+0rWbdF&X4Ig$6lfanF8v~y_Tegj* z7z}<(%D`_8`LNk$C9wNyuBvP7X=N6uFMFdt=Osy#t6GOy2EB0~`h%Z4GwEa|6s1rq z>B#cS)Xd=KobfDYW0&&6?hb?IT~0&1jotN_>*LfyL$nu0(~fcYM7(vP5LI#(2qXs2 z-slb98C<{$H$DsVfjxj!9@}OsB%J02=9iR(mb@fOw~}nI5vS9Q9Md%SCQCfe46VWk z8pPT{TZ>nO4z5k$qJ`~R5ZHBF24=3kaj*gToK7ni*peitcBd^wBuX++1X6p(xwI_e zIubTGiO}xCI*9;6b4puJyU?K(xO{XQ0~U3~8Ai&FxwOOd#9oq{qWoKuU^o6Jctm zsba!`L>6iAOh}hL3~V!EZ{s{PZ^__aq#*+YO?Ln|Xu>AQT(He-Jgo6d#{^~+m57c* zsK5!-95T5zV=+x%AGL8JG<`23yenH=fJ+septMHHjuU3M2^I@a1eh z5NnGB4NMC{dxPMgf)9dYygfg8`|?a3zj~&gzJB%W^!)Vot1~)-R<4u^)w9#H^S7r@ z-q9-_`119$)90s8kLdw1KOD$~m@QDrnIkJ35(tjDF3L+683-9-+iajoHI#c71feGcQs~E>x6_BkzdWFYQ2 z?!hMaS(J$uZ|0RfwIDOdbIK$va_0@vAi7{Rxx$XYzL<(I-wK@S>xbgg3G)KUv8;@B zYIEkiLRrxT9Wnz36Jg*OXle+OfZ}`CWULRlO>X8haFU;QEJ)#-wVsj6dVfM>L?D<} zbe`oW(1Hx!`36hOOVF84ngG(e*LmP~M(uZ3-zVgGLZRGw28TEu#{dQFCRXhuckIJa zjuGCk1RxYnuLP`i`NfKm3?>P9wg_3Q!dGeU^2nf|?oCBgw44TIoo}e# z1!a$PsQ)X7jj17y%7vxQl%NCF=@JrQ6Izh=mU94y(WK&xs5T5O@GJKa2F-$?SI$)l zA{KYH4e&V!F37os6Y5*}fAHuw8@ozw?StLU{QQvbL#{;EwH`S6CJF?7p{rMnopw^YkC=pu&rw68H)-x70#f{#Ek zRa?&RWYj?Tm~8ODwn++T$aeGvpxaoc z!Sfh)7gH*NRuC0pgm$ZF(t@{VN>S{MNf|d($bfbs0iXIs{HX7td!u@v=yTW=<4QUv zmEH_j2h^S_HKifM87DjfEdp$(CKOeYjq*$C(DG#z7lp|q$naf_=1%rVRnj@h^MwjJk12$gWa`Hk1%aY*OVOs zYwW{$f$-5x=(i0E?yj-NcW+5c1ajKu?P3b+4&&0ONmHM{h@9eLw@_D!xn7HjOr=G5 zy_5Hm;c)ek66{LKuB=I?zUS!o0K72?%5|L58%q%7OP3&DQF$mqY$XDDX*LnUzt>4A zEf}G=Mr_ara`$}`9-B#1fqQZ;n>6;yYqsve#b}Ta7QlN=w;!!>jTcrBm6JS0z|cCgC_77thg~$J zJ{I??TR97)wuXInrL};>{SIx{mZqk2T{RPeHKVgS>u3eDIrMOiDIrEmlfohKl`gJDb80!#xW0@~WrE#pCE&DlcQA$Y*W zr-)UWnJ!}_1Kxj3QrDEGr8#zviDBoMfH>v;d({L?rzcKE1dKZUKL)C{3c9T$43p}v zq!SIG0A^Mi0T}m4VVCAyIJ8S~c@voTrj+v6H_oItL@kVTtFk)x=djIwQmfy zO+rdKg2o;}g<*rpHYL-IKQZJEm0YQ2WQ`gd(YfOOo5-~^y5xhJwya=)!~tO$Iza9a zR8GfP(tyt8K#zfuJK^#b0%bo_daUgf*R|J>v#{u%DXeR}lcU!+XJsE4_(=l(xINgd zf05)j>_N24x{{n!Ad#X|vobz)iJ3P@a{t;n)DDpeqj2|3r{E=*c;;Y?JGPbfz?9pE zIU!MslqlOa+8w@)KuM40H~e+6)`y*!Va_FU$_KrHMCq6q&MEig)gj`k* z$fj*jk&c+~!pDNL9a)n(X%HR8xlZkBWd?oniRg1K8oEqNN3L;wSv}y@Wl4V?v%wdh zW09I_rKGJ|P}!xm<;p}`TSSR(h`|Lk89x2}O(MNksx;{>&MY)9v==it)2$d zcBl2IY?pSSqYNEQxB>}ipZcvQWco)&02wTr(P>X4B#tj(#wHbLVkwOGorD2$R4GNP zyUET?CJMZ(@>8V*t=2i?7UsEGDsZq}I}hbX^Q!icuSAw8r(x*wDdW z0P4K7yO6=?Si7TWwuXh=_h3}(XDNc~2+hRh8i5V#^KhHNC=*kBHUR)#-j=k28o;SpM=C)k|7`I`$#*t`Qw_l7E7?W?kq59#K~ByoQ) zoa*c5^xhSUoAL-9B$tBDrYB1|7~_7$3cy}#-uGOCac7ggFU=h~aEuzOk@dA}>aOf@ z#Q>I$sj1`WuNnQCgFWH6VLw=tWX1uMo1p#&B(A!b8rB@h89$ZC z-Wz>L3;aQ{dm}eR#EDmXiJb#}&lkL#V^KxN*=EOKsJ}wt!c&6G;5wJny5#e!l?x}X z25Xz@w^dVYy5Q;p0NXWGG3O($L9psc?uLq>BviKe8PPtq9_WsgI^me*SgXh$4AkjV z5<9n3;G)gR03`ub?LXG>jC*+kQaaVCoH++TqLgurA2fCQ>CX?SU!!_*+MFfsZlOD` zhP&3r_QRlKg$#ySk8B8JJ3V**g@h8WfczMdpj`F~w~@N<^E6%cgPT+i={HNP`A8_o zZQ{$6E~xoQ>o%!z_guMh;qE`t^lneTaA@4ptsR(`O|m+Ln;JPRk^>CnkeS1kZPX9C z$2OhYdIo#R?f1?!m-;t0k)XFX%pJbxj{P@pCjC!4*V5ZIl7#R46%Ai90c2-q4~rc* z2tY}+#T}VcNXm|GBUy|sL>3KEa-e^|^;K0jo02>;m&IP#m&A6nAJtXW_4umi_H-S3 zrrNK?kQ0ok*;WT~6AqUQDe#2bvlHwrr2NF}tr&(=xdfZ0SeA4xJOZM@VSD!zxshyD z&^}~~ta;e6P{=2kfmUV7yC5RLc$Pqvf6sBZ1(YE&>RVh|E*!*%{3pv78_rAmoCKuk zzt81*>FSGtq}zy4mTcw8)yqRb7$5iRIceI}_HqAGv(^?3x0tUR6<+$odq~tkf|53$ zVmo;23>iPU@Ole&RbAka^&deG<@ zhwCg*Ph)iwI9Tltnhgp#nk_xA+mk=f)uX}gycOCkpCW0n>8GuZxKkKr<6yUrSd9Lj zi?0SNus$@2T=B00&#>J8${~3W%$Peq$Fc&{+Cg%HC*V3rtVQeSG|mx=4YaIJ|_aLA?n@5kFTewh4FNn8*a$~O^!MR|H#$*o%NPSi6y5&yoj$+hD+#V19*9%-yq?ZGFIKCs|W zc8s=ATI!vGR~qhL9Gc9Q@2887Zp@JrED^LKyIyr`9j9&pYxMbYDRBod0Uh^KiSDn@ zoI!7G(F48Ey(YQ1KoqgtN>8Af^IiMXRylx#b2e-QypSspG=vb!NLQ^q#J$(y=)?gdcW z2DJr=*$kmwRJFCJf!0*^fE$<|*daK>4kvqW5*k8;!#NThCCLsB!%|s0-+lt$^!#eh z)no{C=^t0tc(fQ)PdeCEIKiJV7Ebi9k3y|Af7g=WBcob4jdR3Y%-p^o0>#k7d~ZBy zH4WV@;PR2an)?gNA5Hh3yk2t&NA*%d$m)Ra0~chh9pYKbG;oPA-8qIql1D7RY}NwE z_)|4svvjlUZQm^0iCI7@XD@JG`o0MQ@ULuzPpfW5Myg&a=d+{oN3acez)P!aEb^78N@*H(3;!^u`QEVTRXO zs9zSLhd&lDvfcpHE9IY~Z$*?8W)fw0aZ%7{{h0|T6B<11k0Ub0gFr=n&WrAXH?A z(M>cc;(Iz?>Pge&)4NFNofk}?@z^BMfYuvkGm}TzeLMgif-IVZF_9k_=`6!2X(GDi zpI10M;*#hdJTOhh*liYlozi~Ja012%Z;9JLOz+%-hnObE2^}APk3XS5G>1PUHcHK1 zI1^y@Oxc5$>5$uPt{|ppxHIghph2J36Z5iYAs`5jXc*pww^7~;924-=3MTKFd=d>} z{D=NdtVd@(7OIdGeVyVI=@&YP3F$boHSnPx8DtQ=mRKI4xsT=YmuBuG{sUi((;Uo3 zlN6!h71O`{2)(l?A$qYmg@eH~Bhf++d_k+przC7~!iN%IzbwshHnj4@bT&6(Jf3DJ zJVrC8L_!S7yygzXGFkqy$2?%-8=7h`($h07shyb-9YsH)ZsG7ghUSrZ0+NM1R+^+b zg3^%{8yBC_{yHwSt>oDX2>p+wh^Sh_fNt-EOWar^YmLU|wrEN*IDD!mdy~|BkI;#qR4D z+nMowoMXaYG{?fPgW6(IsX!6TAQ=d6eUM04f>MumUjvD(GdpMga9LNo9Xxb@lS`6BbOU+NVQwa)w6RX4UyS*+it zI7|?fyTAY7sxz$JW2=(muK&V{G)GqC>GJ(Vsyb26z~t7Ou2s^_ndQnS+E|2gO~leux$f z7`C|DiB_?X7W)WQV*OHaP`4X0jo-v3w;cVi-+D)K2r)FKErchZKavxmrJrFxPse05 zjAy>Vd(G^ioM3hb;_W}U==A4@t41P@1-ZF2Sc{iy%mcz6$u*ClB~UKxV?C*Bf4avH z{z9$-|a+ zvaVELi$8R;jHyEvF?WHeR0sO(7hACIP{jK6OS%1Mqy&2#)bPC5lA_oM5FI&U)W0<` zwWf0BqA4)3hQsQ6ut9};ErpgN1(?qPe;}#77Vr~)12&a1iCJ~1mWNF#4{r20E4Mhf zi3HZuEPzD>riE%>oty^x!{hT0$ZIjwkHoQ-O5EBgzy$b}`lE}5(PaO@YRqW<_ydnW z(^#Jc0fL%s;*#P(qE>Cb^vthhWNlY#en14)hWw$2hc@b!EzPOHn zgeJg0{`qoHBJc`W-CF@JJGS+8(HyzeZH3e_v<<%q;bJR+g>`dbB{aTVQ=B!Fm5_zN zpe%nzFCbn!I7y&`+t`mNg`XDPX{)i9WQp0rmotx41m_>AIE_jEzaOCKTGzVPwXSuo kYhCMF*SglVu63{ZHC|0gnT6&;WP<01OxFs{jB1 literal 0 HcmV?d00001 diff --git a/zerofree.8 b/zerofree.8 new file mode 100644 index 0000000..b0be0d2 --- /dev/null +++ b/zerofree.8 @@ -0,0 +1,65 @@ +.TH "ZEROFREE" "8" +.SH "NAME" +zerofree \(em zero free blocks from ext2/3 file-systems +.SH "SYNOPSIS" +.PP +\fBzerofree\fR [\fB-n\fP] [\fB-v\fP] \fIfilesystem\fR +.SH "DESCRIPTION" +.PP +\fBzerofree\fR finds the unallocated, +non-zeroed blocks in an ext2 or ext3 +\fIfilesystem\fR (e.g. /dev/hda1) and +fills them with zeroes. This is useful if the device on which +this file-system resides is a disk image. In this case, +depending on the type of disk image, a secondary utility may be +able to reduce the size of the disk image after zerofree has +been run. +.PP +The usual way to achieve the same result (zeroing the +unallocated blocks) is to run \fBdd\fR (1) to +create a file full of zeroes that takes up the entire free +space on the drive, and then delete this file. This has many +disadvantages, which zerofree alleviates: +.IP " \(bu" 6 +it is slow; +.IP " \(bu" 6 +it makes the disk image (temporarily) grow to its maximal +extent; +.IP " \(bu" 6 +it (temporarily) uses all free space on the disk, so other +concurrent write actions may fail. +.PP +\fIfilesystem\fR has to be unmounted or +mounted read-only for \fBzerofree\fR to work. It +will exit with an error message if the +\fIfilesystem\fR is mounted writable. To +remount the root file-system readonly, you can first switch to +single user runlevel (\fBtelinit 1\fR) then use +\fBmount \-o remount,ro +\fIfilesystem\fR\fR. +.PP +\fBzerofree\fR has been written to be +run from GNU/Linux systems installed as guest OSes inside a +virtual machine. It may however be useful in other +situations. +.SH "OPTIONS" +.IP "\fB-n\fP " 10 +Perform a dry run (do not modify the file-system); +.IP "\fB-v\fP " 10 +Be verbose. +.SH "SEE ALSO" +.PP +dd (1). +.SH "AUTHOR" +.PP +This manual page was written by Thibaut Paumard for +the \fBDebian\fP system (but may be used by others). Permission is +granted to copy, distribute and/or modify this document under +the terms of the GNU General Public License, Version 2 or any +later version published by the Free Software Foundation. + +.PP +On Debian systems, the complete text of the GNU General Public +License can be found in /usr/share/common-licenses/GPL-2. + +.\" created by instant / docbook-to-man, Wed 25 Nov 2009, 17:45 diff --git a/zerofree.spec b/zerofree.spec new file mode 100644 index 0000000..1843315 --- /dev/null +++ b/zerofree.spec @@ -0,0 +1,45 @@ +Name: zerofree +Version: 1.1.1 +Release: 3 +Summary: Utility to force unused ext2/3/4 inodes and blocks to zero +License: GPLv2 +URL: https://frippery.org/uml/ +Source0: https://frippery.org/uml/%{name}-%{version}.tgz +Source1: https://frippery.org/uml/sparsify.c +Source2: zerofree.8 +BuildRequires: e2fsprogs-devel + +%description +This module is a utility to set unused filesystem inodes and blocks of an ext2/3/4 filesystem to zero, +which can improve the compressibility and privacy of an ext2/3/4 filesystem. + +%package help +Summary: man files for %{name} +Requires: man + +%description help +This package includes man files for %{name}. + +%prep +%autosetup -p1 +cp -p %{SOURCE1} . + +%build +make CC="gcc $RPM_OPT_FLAGS" +gcc $RPM_OPT_FLAGS sparsify.c -o sparsify -lext2fs + +%install +install -D -p -m 755 zerofree $RPM_BUILD_ROOT%{_sbindir}/zerofree +install -D -p -m 755 sparsify $RPM_BUILD_ROOT%{_sbindir}/sparsify +install -D -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_mandir}/man8/zerofree.8 + +%files +%license COPYING +%{_sbindir}/* + +%files help +%{_mandir}/man*/* + +%changelog +* Thu Dec 12 2019 openEuler Buildteam - 1.1.1-3 +- Package init -- Gitee