📄 mke2fs.c
字号:
blk = fs->group_desc[i].bg_inode_table; num = fs->inode_blocks_per_group; retval = zero_blocks(fs, blk, num, 0, &blk, &num); mke2fs_error_msg_and_die(retval, "write %d blocks in inode table starting at %d.", num, blk); if (sync_kludge) { if (sync_kludge == 1) sync(); else if ((i % sync_kludge) == 0) sync(); } } zero_blocks(0, 0, 0, 0, 0, 0); progress_close(&progress);}static void create_root_dir(ext2_filsys fs){ errcode_t retval; struct ext2_inode inode; retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, EXT2_ROOT_INO, 0); mke2fs_error_msg_and_die(retval, "create root dir"); if (geteuid()) { retval = ext2fs_read_inode(fs, EXT2_ROOT_INO, &inode); mke2fs_error_msg_and_die(retval, "read root inode"); inode.i_uid = getuid(); if (inode.i_uid) inode.i_gid = getgid(); retval = ext2fs_write_new_inode(fs, EXT2_ROOT_INO, &inode); mke2fs_error_msg_and_die(retval, "set root inode ownership"); }}static void create_lost_and_found(ext2_filsys fs){ errcode_t retval; ext2_ino_t ino; const char *name = "lost+found"; int i = 1; char *msg = "create"; int lpf_size = 0; fs->umask = 077; retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, 0, name); if (retval) { goto CREATE_LOST_AND_FOUND_ERROR; } retval = ext2fs_lookup(fs, EXT2_ROOT_INO, name, strlen(name), 0, &ino); if (retval) { msg = "lookup"; goto CREATE_LOST_AND_FOUND_ERROR; } for (; i < EXT2_NDIR_BLOCKS; i++) { if ((lpf_size += fs->blocksize) >= 16*1024) break; retval = ext2fs_expand_dir(fs, ino); msg = "expand";CREATE_LOST_AND_FOUND_ERROR: mke2fs_error_msg_and_die(retval, "%s %s", msg, name); }}static void create_bad_block_inode(ext2_filsys fs, badblocks_list bb_list){ errcode_t retval; ext2fs_mark_inode_bitmap(fs->inode_map, EXT2_BAD_INO); fs->group_desc[0].bg_free_inodes_count--; fs->super->s_free_inodes_count--; retval = ext2fs_update_bb_inode(fs, bb_list); mke2fs_error_msg_and_die(retval, "set bad block inode");}static void reserve_inodes(ext2_filsys fs){ ext2_ino_t i; int group; for (i = EXT2_ROOT_INO + 1; i < EXT2_FIRST_INODE(fs->super); i++) { ext2fs_mark_inode_bitmap(fs->inode_map, i); group = ext2fs_group_of_ino(fs, i); fs->group_desc[group].bg_free_inodes_count--; fs->super->s_free_inodes_count--; } ext2fs_mark_ib_dirty(fs);}#define BSD_DISKMAGIC (0x82564557UL) /* The disk magic number */#define BSD_MAGICDISK (0x57455682UL) /* The disk magic number reversed */#define BSD_LABEL_OFFSET 64static void zap_sector(ext2_filsys fs, int sect, int nsect){ char *buf; char *fmt = "could not %s %d"; int retval; unsigned int *magic; buf = xmalloc(512*nsect); if (sect == 0) { /* Check for a BSD disklabel, and don't erase it if so */ retval = io_channel_read_blk(fs->io, 0, -512, buf); if (retval) mke2fs_warning_msg(retval, fmt, "read block", 0); else { magic = (unsigned int *) (buf + BSD_LABEL_OFFSET); if ((*magic == BSD_DISKMAGIC) || (*magic == BSD_MAGICDISK)) return; } } memset(buf, 0, 512*nsect); io_channel_set_blksize(fs->io, 512); retval = io_channel_write_blk(fs->io, sect, -512*nsect, buf); io_channel_set_blksize(fs->io, fs->blocksize); free(buf); mke2fs_warning_msg(retval, fmt, "erase sector", sect);}static void create_journal_dev(ext2_filsys fs){ struct progress_struct progress; errcode_t retval; char *buf; char *fmt = "%s journal superblock"; blk_t blk; int count; retval = ext2fs_create_journal_superblock(fs, fs->super->s_blocks_count, 0, &buf); mke2fs_error_msg_and_die(retval, fmt, "init"); if (quiet) memset(&progress, 0, sizeof(progress)); else progress_init(&progress, "Zeroing journal device: ", fs->super->s_blocks_count); retval = zero_blocks(fs, 0, fs->super->s_blocks_count, &progress, &blk, &count); mke2fs_error_msg_and_die(retval, "zero journal device (block %u, count %d)", blk, count); zero_blocks(0, 0, 0, 0, 0, 0); retval = io_channel_write_blk(fs->io, fs->super->s_first_data_block+1, 1, buf); mke2fs_error_msg_and_die(retval, fmt, "write"); progress_close(&progress);}static void show_stats(ext2_filsys fs){ struct ext2_super_block *s = fs->super; char *os; blk_t group_block; dgrp_t i; int need, col_left; mke2fs_warning_msg((param.s_blocks_count != s->s_blocks_count), "%d blocks unused\n", param.s_blocks_count - s->s_blocks_count); os = e2p_os2string(fs->super->s_creator_os); printf( "Filesystem label=%.*s\n" "OS type: %s\n" "Block size=%u (log=%u)\n" "Fragment size=%u (log=%u)\n" "%u inodes, %u blocks\n" "%u blocks (%2.2f%%) reserved for the super user\n" "First data block=%u\n", (int) sizeof(s->s_volume_name), s->s_volume_name, os, fs->blocksize, s->s_log_block_size, fs->fragsize, s->s_log_frag_size, s->s_inodes_count, s->s_blocks_count, s->s_r_blocks_count, 100.0 * s->s_r_blocks_count / s->s_blocks_count, s->s_first_data_block); free(os); if (s->s_reserved_gdt_blocks) { printf("Maximum filesystem blocks=%lu\n", (s->s_reserved_gdt_blocks + fs->desc_blocks) * (fs->blocksize / sizeof(struct ext2_group_desc)) * s->s_blocks_per_group); } printf( "%u block group%s\n" "%u blocks per group, %u fragments per group\n" "%u inodes per group\n", fs->group_desc_count, (fs->group_desc_count > 1) ? "s" : "", s->s_blocks_per_group, s->s_frags_per_group, s->s_inodes_per_group); if (fs->group_desc_count == 1) { puts(""); return; } printf("Superblock backups stored on blocks: "); group_block = s->s_first_data_block; col_left = 0; for (i = 1; i < fs->group_desc_count; i++) { group_block += s->s_blocks_per_group; if (!ext2fs_bg_has_super(fs, i)) continue; if (i != 1) printf(", "); need = int_log10(group_block) + 2; if (need > col_left) { printf("\n\t"); col_left = 72; } col_left -= need; printf("%u", group_block); } puts("\n");}/* * Set the S_CREATOR_OS field. Return true if OS is known, * otherwise, 0. */static int set_os(struct ext2_super_block *sb, char *os){ if (isdigit (*os)) { sb->s_creator_os = atoi(os); return 1; } if((sb->s_creator_os = e2p_string2os(os)) >= 0) { return 1; } else if (!strcasecmp("GNU", os)) { sb->s_creator_os = EXT2_OS_HURD; return 1; } return 0;}static void parse_extended_opts(struct ext2_super_block *sb_param, const char *opts){ char *buf, *token, *next, *p, *arg; int r_usage = 0; buf = xstrdup(opts); for (token = buf; token && *token; token = next) { p = strchr(token, ','); next = 0; if (p) { *p = 0; next = p+1; } arg = strchr(token, '='); if (arg) { *arg = 0; arg++; } if (strcmp(token, "stride") == 0) { if (!arg) { r_usage++; continue; } fs_stride = strtoul(arg, &p, 0); if (*p || (fs_stride == 0)) { bb_error_msg("Invalid stride parameter: %s", arg); r_usage++; continue; } } else if (!strcmp(token, "resize")) { unsigned long resize, bpg, rsv_groups; unsigned long group_desc_count, desc_blocks; unsigned int gdpb, blocksize; int rsv_gdb; if (!arg) { r_usage++; continue; } resize = parse_num_blocks(arg, sb_param->s_log_block_size); if (resize == 0) { bb_error_msg("Invalid resize parameter: %s", arg); r_usage++; continue; } if (resize <= sb_param->s_blocks_count) { bb_error_msg("The resize maximum must be greater " "than the filesystem size"); r_usage++; continue; } blocksize = EXT2_BLOCK_SIZE(sb_param); bpg = sb_param->s_blocks_per_group; if (!bpg) bpg = blocksize * 8; gdpb = blocksize / sizeof(struct ext2_group_desc); group_desc_count = (sb_param->s_blocks_count + bpg - 1) / bpg; desc_blocks = (group_desc_count + gdpb - 1) / gdpb; rsv_groups = (resize + bpg - 1) / bpg; rsv_gdb = (rsv_groups + gdpb - 1) / gdpb - desc_blocks; if (rsv_gdb > EXT2_ADDR_PER_BLOCK(sb_param)) rsv_gdb = EXT2_ADDR_PER_BLOCK(sb_param); if (rsv_gdb > 0) { sb_param->s_feature_compat |= EXT2_FEATURE_COMPAT_RESIZE_INODE; sb_param->s_reserved_gdt_blocks = rsv_gdb; } } else r_usage++; } if (r_usage) { bb_error_msg_and_die( "\nBad options specified.\n\n" "Extended options are separated by commas, " "and may take an argument which\n" "\tis set off by an equals ('=') sign.\n\n" "Valid extended options are:\n" "\tstride=<stride length in blocks>\n" "\tresize=<resize maximum size in blocks>\n"); }}static __u32 ok_features[3] = { EXT3_FEATURE_COMPAT_HAS_JOURNAL | EXT2_FEATURE_COMPAT_RESIZE_INODE | EXT2_FEATURE_COMPAT_DIR_INDEX, /* Compat */ EXT2_FEATURE_INCOMPAT_FILETYPE| /* Incompat */ EXT3_FEATURE_INCOMPAT_JOURNAL_DEV| EXT2_FEATURE_INCOMPAT_META_BG, EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER /* R/O compat */};static int PRS(int argc, char **argv){ int c; int size; char * tmp; int blocksize = 0; int inode_ratio = 0; int inode_size = 0; int reserved_ratio = 5; int sector_size = 0; int show_version_only = 0; ext2_ino_t num_inodes = 0; errcode_t retval; char * extended_opts = 0; const char * fs_type = 0; blk_t dev_size; long sysval; /* Update our PATH to include /sbin */ e2fs_set_sbin_path(); tmp = getenv("MKE2FS_SYNC"); if (tmp) sync_kludge = atoi(tmp); /* Determine the system page size if possible */#if (!defined(_SC_PAGESIZE) && defined(_SC_PAGE_SIZE))#define _SC_PAGESIZE _SC_PAGE_SIZE#endif#ifdef _SC_PAGESIZE sysval = sysconf(_SC_PAGESIZE); if (sysval > 0) sys_page_size = sysval;#endif /* _SC_PAGESIZE */ setbuf(stdout, NULL); setbuf(stderr, NULL); memset(¶m, 0, sizeof(struct ext2_super_block)); param.s_rev_level = 1; /* Create revision 1 filesystems now */ param.s_feature_incompat |= EXT2_FEATURE_INCOMPAT_FILETYPE; param.s_feature_ro_compat |= EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER;#ifdef __linux__ linux_version_code = get_linux_version_code(); if (linux_version_code && linux_version_code < KERNEL_VERSION(2,2,0)) { param.s_rev_level = 0; param.s_feature_incompat = 0; param.s_feature_compat = 0; param.s_feature_ro_compat = 0; }#endif /* If called as mkfs.ext3, create a journal inode */ if (last_char_is(applet_name, '3')) journal_size = -1; while ((c = getopt (argc, argv, "b:cE:f:g:i:jl:m:no:qr:R:s:tvI:J:ST:FL:M:N:O:V")) != EOF) { switch (c) { case 'b': blocksize = xatou_range(optarg, EXT2_MIN_BLOCK_SIZE, EXT2_MAX_BLOCK_SIZE); mke2fs_warning_msg((blocksize > 4096), "blocksize %d not usable on most systems", blocksize); param.s_log_block_size = int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE); break; case 'c': /* Check for bad blocks */ case 't': /* deprecated */ cflag++; break; case 'f': size = xatou_range(optarg, EXT2_MIN_BLOCK_SIZE, EXT2_MAX_BLOCK_SIZE); param.s_log_frag_size = int_log2(size >> EXT2_MIN_BLOCK_LOG_SIZE); mke2fs_warning_msg(1, "fragments not supported. Ignoring -f option"); break; case 'g': param.s_blocks_per_group = xatou32(optarg); if ((param.s_blocks_per_group % 8) != 0) { bb_error_msg_and_die("blocks per group must be multiple of 8"); } break; case 'i': /* Huh? is "* 1024" correct? */ inode_ratio = xatou_range(optarg, EXT2_MIN_BLOCK_SIZE, EXT2_MAX_BLOCK_SIZE * 1024); break; case 'J': parse_journal_opts(&journal_device, &journal_flags, &journal_size, optarg); break; case 'j': param.s_feature_compat |= EXT3_FEATURE_COMPAT_HAS_JOURNAL; if (!journal_size) journal_size = -1; break; case 'l': bad_blocks_filename = optarg; break; case 'm': reserved_ratio = xatou_range(optarg, 0, 50); break; case 'n':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -