gnome-disk-utility 包的作用(mkfs set ownership principle)

1. 它提供了一个硬盘信息显示的图形工具:

/usr/bin/palimpsest

 

2. 和nautilus移动设备挂载相关,提供了部分扩展:

比如修正挂载点label 的显示。

 

3.格式化移动设备:

一般我们在终端中使用类似mkfs.ext3的格式化命令后,mount得到的挂载点都是root权限。普通用户无法往里写东西。

在palimpsest中,我们格式化时选择“Take ownership of file system“选项后,普通用户也可以往格式好的设备读写东西了。

这一功能的实现原理是,使用udisks 格式化时,将普通用户的uid/gid作为格式化参数,gnome-disk-utility:

void
gdu_device_op_partition_create (GduDevice   *device,
                                guint64      offset,
                                guint64      size,
                                const char  *type,
                                const char  *label,
                                char       **flags,
                                const char  *fstype,
                                const char  *fslabel,
                                const char  *encrypt_passphrase,
                                gboolean     fs_take_ownership,
                                GduDevicePartitionCreateCompletedFunc callback,
                                gpointer user_data)
{
        int n;
        char *fsoptions[16];
        char *options[16];
        PartitionCreateData *data;

        data = g_new0 (PartitionCreateData, 1);
        data->device = g_object_ref (device);
        data->callback = callback;
        data->user_data = user_data;

        options[0] = NULL;

        n = 0;
        if (fslabel != NULL && strlen (fslabel) > 0) {
                fsoptions[n++] = g_strdup_printf ("label=%s", fslabel);
        }
        if (encrypt_passphrase != NULL && strlen (encrypt_passphrase) > 0) {
                fsoptions[n++] = g_strdup_printf ("luks_encrypt=%s", encrypt_passphrase);
        }
        if (fs_take_ownership) {
                fsoptions[n++] = g_strdup_printf ("take_ownership_uid=%d", getuid ());
                fsoptions[n++] = g_strdup_printf ("take_ownership_gid=%d", getgid ());
        }
        fsoptions[n] = NULL;

        org_freedesktop_UDisks_Device_partition_create_async (device->priv->proxy,
                                                              offset,
                                                              size,
                                                              type,
                                                              label,
                                                              (const char **) flags,
                                                              (const char **) options,
        while (n >= 0)
                g_free (fsoptions[n--]);
}

 

在UDISKS 调用对应的格式化命令后,会自己在“/run/udisks/job-mkfs-XXXXXX“ 挂载一遍。然后再调用chown (dir, take_ownership_uid, take_ownership_gid) 函数,将挂载好的路径chown成普通用户。

udisks/src/helpers/job-mkfs.c:

  /* take ownership of the device if requested */
  if (take_ownership_uid != 0 || take_ownership_gid != 0)
    {
      char dir[256] = PACKAGE_LOCALSTATE_DIR "/run/udisks/job-mkfs-XXXXXX";

      if (mkdtemp (dir) == NULL)
        {
          g_printerr ("cannot create directory %s: %m\n", dir);
          goto out;
        }

      if (mount (device, dir, fstype, 0, NULL) != 0)
        {
          g_printerr ("cannot mount %s at %s: %m\n", device, dir);
          ret = 2;
          goto tos_err0;
        }

      if (chown (dir, take_ownership_uid, take_ownership_gid) != 0)
        {
          g_printerr ("cannot chown %s to uid=%d and gid=%d: %m\n", dir, take_ownership_uid, take_ownership_gid);
          ret = 2;
        }

      if (chmod (dir, 0700) != 0)
        {
          g_printerr ("cannot chmod %s to mode 0700: %m\n", dir);
          ret = 2;
        }
      if (umount (dir) != 0)
        {
          g_printerr ("cannot unmount %s: %m\n", dir);
          ret = 2;
          goto tos_err0;
        }

    tos_err0:
      if (rmdir (dir) != 0)
        {
          g_printerr ("cannot remove directory %s: %m\n", dir);
          goto out;
        }
    }
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值