mirror of https://github.com/vitalif/e2fsprogs
mke2fs: don't set root dir UID/GID automatically
Don't change the root directory's UID/GID automatically just because mke2fs was run as a non-root user. This can be confusing for users, and is not flexible for non-root installation tools that need to create a filesystem with different ownership from the current user. Add the "-E root_owner[=uid:gid]" option to mke2fs so that the user and group can be explicitly specified for the root directory. If the "=uid:gid" argument is not specified, the current UID and GID are extracted from the running process, as was done in the past. Signed-off-by: Andreas Dilger <adilger@dilger.ca> Signed-off-by: Theodore Ts'o <tytso@mit.edu>debian-1.42.9
parent
626a2e7468
commit
dc9cc7006a
|
@ -268,6 +268,15 @@ small risk if the system crashes before the journal has been overwritten
|
||||||
entirely one time. If the option value is omitted, it defaults to 1 to
|
entirely one time. If the option value is omitted, it defaults to 1 to
|
||||||
enable lazy journal inode zeroing.
|
enable lazy journal inode zeroing.
|
||||||
.TP
|
.TP
|
||||||
|
.BI root_owner [=uid:gid]
|
||||||
|
Specify the numeric user and group ID of the root directory. If no UID:GID
|
||||||
|
is specified, use the user and group ID of the user running \fBmke2fs\fR.
|
||||||
|
In \fBmke2fs\fR 1.42 and earlier the UID and GID of the root directory were
|
||||||
|
set by default to the UID and GID of the user running the mke2fs command.
|
||||||
|
The \fBroot_owner=\fR option allows explicitly specifying these values,
|
||||||
|
and avoid side-effects for users that do not expect the contents of the
|
||||||
|
filesystem to change based on the user running \fBmke2fs\fR.
|
||||||
|
.TP
|
||||||
.B test_fs
|
.B test_fs
|
||||||
Set a flag in the filesystem superblock indicating that it may be
|
Set a flag in the filesystem superblock indicating that it may be
|
||||||
mounted using experimental kernel code, such as the ext4dev filesystem.
|
mounted using experimental kernel code, such as the ext4dev filesystem.
|
||||||
|
|
|
@ -88,6 +88,8 @@ int discard = 1; /* attempt to discard device before fs creation */
|
||||||
int direct_io;
|
int direct_io;
|
||||||
int force;
|
int force;
|
||||||
int noaction;
|
int noaction;
|
||||||
|
uid_t root_uid;
|
||||||
|
gid_t root_gid;
|
||||||
int journal_size;
|
int journal_size;
|
||||||
int journal_flags;
|
int journal_flags;
|
||||||
int lazy_itable_init;
|
int lazy_itable_init;
|
||||||
|
@ -364,21 +366,19 @@ static void create_root_dir(ext2_filsys fs)
|
||||||
com_err("ext2fs_mkdir", retval, _("while creating root dir"));
|
com_err("ext2fs_mkdir", retval, _("while creating root dir"));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (geteuid()) {
|
if (root_uid != 0 || root_gid != 0) {
|
||||||
retval = ext2fs_read_inode(fs, EXT2_ROOT_INO, &inode);
|
retval = ext2fs_read_inode(fs, EXT2_ROOT_INO, &inode);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
com_err("ext2fs_read_inode", retval,
|
com_err("ext2fs_read_inode", retval,
|
||||||
_("while reading root inode"));
|
_("while reading root inode"));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
uid = getuid();
|
|
||||||
inode.i_uid = uid;
|
inode.i_uid = root_uid;
|
||||||
ext2fs_set_i_uid_high(inode, uid >> 16);
|
ext2fs_set_i_uid_high(inode, root_uid >> 16);
|
||||||
if (uid) {
|
inode.i_gid = root_gid;
|
||||||
gid = getgid();
|
ext2fs_set_i_gid_high(inode, root_gid >> 16);
|
||||||
inode.i_gid = gid;
|
|
||||||
ext2fs_set_i_gid_high(inode, gid >> 16);
|
|
||||||
}
|
|
||||||
retval = ext2fs_write_new_inode(fs, EXT2_ROOT_INO, &inode);
|
retval = ext2fs_write_new_inode(fs, EXT2_ROOT_INO, &inode);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
com_err("ext2fs_write_inode", retval,
|
com_err("ext2fs_write_inode", retval,
|
||||||
|
@ -585,6 +585,8 @@ static void show_stats(ext2_filsys fs)
|
||||||
ext2fs_r_blocks_count(s),
|
ext2fs_r_blocks_count(s),
|
||||||
100.0 * ext2fs_r_blocks_count(s) / ext2fs_blocks_count(s));
|
100.0 * ext2fs_r_blocks_count(s) / ext2fs_blocks_count(s));
|
||||||
printf(_("First data block=%u\n"), s->s_first_data_block);
|
printf(_("First data block=%u\n"), s->s_first_data_block);
|
||||||
|
if (root_uid != 0 || root_gid != 0)
|
||||||
|
printf(_("Root directory owner=%u:%u\n"), root_uid, root_gid);
|
||||||
if (s->s_reserved_gdt_blocks)
|
if (s->s_reserved_gdt_blocks)
|
||||||
printf(_("Maximum filesystem blocks=%lu\n"),
|
printf(_("Maximum filesystem blocks=%lu\n"),
|
||||||
(s->s_reserved_gdt_blocks + fs->desc_blocks) *
|
(s->s_reserved_gdt_blocks + fs->desc_blocks) *
|
||||||
|
@ -791,6 +793,29 @@ static void parse_extended_opts(struct ext2_super_block *param,
|
||||||
EXT2_MKJOURNAL_LAZYINIT : 0;
|
EXT2_MKJOURNAL_LAZYINIT : 0;
|
||||||
else
|
else
|
||||||
journal_flags |= EXT2_MKJOURNAL_LAZYINIT;
|
journal_flags |= EXT2_MKJOURNAL_LAZYINIT;
|
||||||
|
} else if (!strcmp(token, "root_owner")) {
|
||||||
|
if (arg) {
|
||||||
|
root_uid = strtoul(arg, &p, 0);
|
||||||
|
if (*p != ':') {
|
||||||
|
fprintf(stderr,
|
||||||
|
_("Invalid root_owner: '%s'\n"),
|
||||||
|
arg);
|
||||||
|
r_usage++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
root_gid = strtoul(p, &p, 0);
|
||||||
|
if (*p) {
|
||||||
|
fprintf(stderr,
|
||||||
|
_("Invalid root_owner: '%s'\n"),
|
||||||
|
arg);
|
||||||
|
r_usage++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
root_uid = getuid();
|
||||||
|
root_gid = getgid();
|
||||||
|
}
|
||||||
} else if (!strcmp(token, "discard")) {
|
} else if (!strcmp(token, "discard")) {
|
||||||
discard = 1;
|
discard = 1;
|
||||||
} else if (!strcmp(token, "nodiscard")) {
|
} else if (!strcmp(token, "nodiscard")) {
|
||||||
|
@ -828,6 +853,8 @@ static void parse_extended_opts(struct ext2_super_block *param,
|
||||||
"\tresize=<resize maximum size in blocks>\n"
|
"\tresize=<resize maximum size in blocks>\n"
|
||||||
"\tlazy_itable_init=<0 to disable, 1 to enable>\n"
|
"\tlazy_itable_init=<0 to disable, 1 to enable>\n"
|
||||||
"\tlazy_journal_init=<0 to disable, 1 to enable>\n"
|
"\tlazy_journal_init=<0 to disable, 1 to enable>\n"
|
||||||
|
"\troot_uid=<uid of root directory>\n"
|
||||||
|
"\troot_gid=<gid of root directory>\n"
|
||||||
"\ttest_fs\n"
|
"\ttest_fs\n"
|
||||||
"\tdiscard\n"
|
"\tdiscard\n"
|
||||||
"\tnodiscard\n"
|
"\tnodiscard\n"
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
Filesystem label=
|
||||||
|
OS type: Linux
|
||||||
|
Block size=1024 (log=0)
|
||||||
|
Fragment size=1024 (log=0)
|
||||||
|
Stride=0 blocks, Stripe width=0 blocks
|
||||||
|
128 inodes, 1024 blocks
|
||||||
|
51 blocks (4.98%) reserved for the super user
|
||||||
|
First data block=1
|
||||||
|
Root directory owner=1234:1234
|
||||||
|
Maximum filesystem blocks=1048576
|
||||||
|
1 block group
|
||||||
|
8192 blocks per group, 8192 fragments per group
|
||||||
|
128 inodes per group
|
||||||
|
|
||||||
|
Allocating group tables: done
|
||||||
|
Writing inode tables: done
|
||||||
|
Writing superblocks and filesystem accounting information: done
|
||||||
|
|
||||||
|
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
|
||||||
|
Pass 1: Checking inodes, blocks, and sizes
|
||||||
|
Pass 2: Checking directory structure
|
||||||
|
Pass 3: Checking directory connectivity
|
||||||
|
Pass 4: Checking reference counts
|
||||||
|
Pass 5: Checking group summary information
|
||||||
|
test_filesys: 11/128 files (0.0% non-contiguous), 38/1024 blocks
|
||||||
|
Exit status is 0
|
||||||
|
Filesystem volume name: <none>
|
||||||
|
Last mounted on: <not available>
|
||||||
|
Filesystem magic number: 0xEF53
|
||||||
|
Filesystem revision #: 1 (dynamic)
|
||||||
|
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
|
||||||
|
Default mount options: (none)
|
||||||
|
Filesystem state: clean
|
||||||
|
Errors behavior: Continue
|
||||||
|
Filesystem OS type: Linux
|
||||||
|
Inode count: 128
|
||||||
|
Block count: 1024
|
||||||
|
Reserved block count: 51
|
||||||
|
Free blocks: 986
|
||||||
|
Free inodes: 117
|
||||||
|
First block: 1
|
||||||
|
Block size: 1024
|
||||||
|
Fragment size: 1024
|
||||||
|
Reserved GDT blocks: 3
|
||||||
|
Blocks per group: 8192
|
||||||
|
Fragments per group: 8192
|
||||||
|
Inodes per group: 128
|
||||||
|
Inode blocks per group: 16
|
||||||
|
Mount count: 0
|
||||||
|
Check interval: 15552000 (6 months)
|
||||||
|
Reserved blocks uid: 0
|
||||||
|
Reserved blocks gid: 0
|
||||||
|
First inode: 11
|
||||||
|
Inode size: 128
|
||||||
|
Default directory hash: half_md4
|
||||||
|
|
||||||
|
|
||||||
|
Group 0: (Blocks 1-1023)
|
||||||
|
Primary superblock at 1, Group descriptors at 2-2
|
||||||
|
Reserved GDT blocks at 3-5
|
||||||
|
Block bitmap at 6 (+5), Inode bitmap at 7 (+6)
|
||||||
|
Inode table at 8-23 (+7)
|
||||||
|
986 free blocks, 117 free inodes, 2 directories
|
||||||
|
Free blocks: 38-1023
|
||||||
|
Free inodes: 12-128
|
|
@ -0,0 +1,4 @@
|
||||||
|
DESCRIPTION="root directory owner"
|
||||||
|
FS_SIZE=1024
|
||||||
|
MKE2FS_OPTS="-E root_owner=1234:1234"
|
||||||
|
. $cmd_dir/run_mke2fs
|
Loading…
Reference in New Issue