Какие возможности требуются для ioctl () на emmc на systemd? - PullRequest
0 голосов
/ 03 ноября 2019

Я хочу запустить мою программу с systemd с обычным пользователем (без полномочий root). Эта программа использует системный вызов ioctl () для доступа к регистрам emmc. Я хочу узнать, какие возможности необходимо добавить в мой файл системного модуля.

Я пробовал использовать файл модуля ниже:

[Unit]
Description=EMMC-LIFETIME UTILITY

[Service]
User=tron
Group=disk
ExecStart=/HARICI/emmc-lifetime /dev/mmcblk0 -v
CapabilityBoundingSet=CAP_SYS_ADMIN
DeviceAllow=/dev/mmcblk0 rw

[Install]
WantedBy=multi-user.target

Вот код времени жизни emmc:

int main(int argc, char **argv)
{

    if(argc < 2){
        printf("Usage: %s <mmcfilename> (-v)\n", argv[0]);
        printf("Example: %s /dev/mmcblk1 -v\n", argv[0]);
        return 1;
    }

    char ext_csd[512], ext_csd_rev;
    int fd, ret;

    fd = open(argv[1], O_RDWR);
    if (fd < 0) {
        printf("Failed to open eMMC device, please check which path you have passed\n");
        return 1;
    }

    struct mmc_ioc_cmd idata;
    memset(&idata, 0, sizeof(idata));
    memset(ext_csd, 0, sizeof(char) * 512);
    idata.write_flag = 0;
    idata.opcode = MMC_SEND_EXT_CSD;
    idata.arg = 0;
    idata.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
    idata.blksz = 512;
    idata.blocks = 1;
    mmc_ioc_cmd_set_data(idata, ext_csd);

    ret = ioctl(fd, MMC_IOC_CMD, &idata);
    if (ret){
        printf("ioctl failed, are you sure it is an MMC device???\n");
        return ret;
    }


    ext_csd_rev = ext_csd[EXT_CSD_REV];

    if (ext_csd_rev >= 7) {

        if(argc==3 && !strcmp(argv[2],"-v")){
        printf("EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A: 0x%02x\n",
            ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]);
        printf("EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B: 0x%02x\n",
            ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]);
        printf("EXT_CSD_PRE_EOL_INFO: 0x%02x\n",
            ext_csd[EXT_CSD_PRE_EOL_INFO]);
        }else{
            printf("%d\n",ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]*10);
        }
    }

    if(fd)
        close(fd);

    return ret;

Если я закомментирую «User = tron» в моем файле модуля, все будет работать ожидаемо:

Nov 03 01:17:03 tron systemd[1]: Started EMMC-LIFETIME UTILITY.
Nov 03 01:17:03 tron emmc-lifetime[28294]: EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A: 0x01 
Nov 03 01:17:03 tron emmc-lifetime[28294]: EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B: 0x01 
Nov 03 01:17:03 tron emmc-lifetime[28294]: EXT_CSD_PRE_EOL_INFO: 0x01 

Но если я раскомментирую »User = tron ​​", вот результат:

Nov 03 00:57:17 tron systemd[1]: Started EMMC-LIFETIME UTILITY. 
Nov 03 00:57:17 tron emmc-lifetime[27706]: ioctl failed, are you sure it is an MMC device??? 
Nov 03 00:57:17 tron systemd[1]: emmc-info.service: Main process exited, code=exited, status=255/n/a 
Nov 03 00:57:18 tron systemd[1]: emmc-info.service: Unit entered failed state. 
Nov 03 00:57:18 tron systemd[1]: emmc-info.service: Failed with result 'exit-code'.

Какие возможности требуются в моем модульном файле для запуска моего исполняемого файла от имени пользователя" tron ​​"?

1 Ответ

0 голосов
/ 05 ноября 2019

решаемая. Что касается возможностей, он должен иметь CAP_SYS_RAWIO.

Мы можем использовать:

setcap cap_sys_rawio=+eip /HARICI/emmc-lifetime

И, таким образом, мы можем запустить двоичный файл "emmc-life" с пользователем без полномочий root. Обратите внимание, что этот пользователь должен быть в группе "диск", чтобы иметь возможность открывать "/ dev / mmcblkX"

Но, к сожалению, это не работает в файлах системных модулей.

ВФайлы системного блока, если вы пишете:

User=some-non-root-user
CapabilityBoundingSet=SOME_CAPABILITY

Не работает. Вот почему мой приведенный выше код всегда дает сбой.

Я должен найти другой способ запуска моего бинарного файла с привилегиями не-root.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...