find test и bash test не дают одинакового результата, почему?

Не следует устанавливать пакеты с суффиксом .src.rpm. Пакеты с этим суффиксом необходимы для сборки пакетов RPM в собственной системе.

Инструменты VMware (также инструменты VBox )создают модули для вашего ядра. Поэтому ему нужны инструменты :компилятор, заголовки ядра и среда сборки (Makefiles с определенными предопределенными макросами и пара скриптов ).

Компилятор предоставляет пакет gcc-. Вы должны убедиться, что ваша версия компилятора работающего ядра(cat /proc/version=>gcc version)и установленного пакета компилятора gcc-совпадают.

В Centos 7 пакет kernel-devel-$(uname -r)предоставляет заголовки ядра со средой сборки.

Это все, что вам нужно для создания инструментов VMware (или инструментов VBox ).


УПД:

О open-vm-toolsв Centos 7 и сборке Centos 7. Centos 7 уже имеет open-vm-toolsв репозитории. Он содержит 2 systemd-сервиса(vgauthdи vmtoolsd), vmware-программы и документацию.

Я скачал open-vm-tools(yumdownloader --source open-vm-tools), чтобы посмотреть в файле spec, как он строится. В макросе %buildсодержится эта инструкция:

%configure \
    --without-kernel-modules \
    --enable-xmlsec1 \
    --disable-static

Таким образом, в пакете нет модулей. Где модули? В github open -vm -tools README.md написал:

The open-vm-tools packages available with Linux distributions do not include Linux drivers because Linux drivers are available as part of Linux kernel itself.

Это правда. Проверил на своем Centos 7 (x86 _64):

find /lib/modules/$(uname -r) -name 'vm*'
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/crypto/vmac.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/gpu/drm/vmwgfx
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/gpu/drm/vmwgfx/vmwgfx.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/misc/vmw_balloon.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/misc/vmw_vmci
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/misc/vmw_vmci/vmw_vmci.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/net/vmxnet3
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/net/vmxnet3/vmxnet3.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/drivers/scsi/vmw_pvscsi.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/net/vmw_vsock
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko.xz
/lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/net/vmw_vsock/vmw_vsock_vmci_transport.ko.xz

Я скачал вашу версию ядра(3.10.0 -693.2.2.el7.centos.plus.i686)и изучил ее содержимое:

$ ls kernel-3.10.0-693.2.2.el7.centos.plus.i686.rpm
kernel-3.10.0-693.2.2.el7.centos.plus.i686.rpm
$ rpm2cpio kernel-3.10.0-693.2.2.el7.centos.plus.i686.rpm | cpio -idm # content will be extracted to boot and lib directories in this directory
$ find./lib/ -name 'vm*'
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/crypto/vmac.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/gpu/drm/vmwgfx
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/gpu/drm/vmwgfx/vmwgfx.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/misc/vmw_balloon.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/misc/vmw_vmci
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/misc/vmw_vmci/vmw_vmci.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/net/vmxnet3
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/net/vmxnet3/vmxnet3.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/drivers/scsi/vmw_pvscsi.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/net/vmw_vsock
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko
./lib/modules/3.10.0-693.2.2.el7.centos.plus.i686/kernel/net/vmw_vsock/vmw_vsock_vmci_transport.ko

Итак. Модули и инструменты предоставляются репозиторием. Вы можете перестроить инструменты, но с --without-kernel-modules. Если вы хотите пересобрать модули (, я сомневаюсь, что это необходимо ), вам следует пересобрать пакет ядра. Подробная инструкция представлена ​​в Centos Wiki .


УПД2:

Настройка служб. После того, как успешно скомпилированные инструменты были установлены, необходимо создать 2 служебных файла в /usr/lib/systemd/systemсо следующим содержимым:

vmtoolsd.service:

[Unit]
Description=Service for virtual machines hosted on VMware
Documentation=http://github.com/vmware/open-vm-tools
ConditionVirtualization=vmware
Requires=vgauthd.service
After=vgauthd.service

[Service]
ExecStart=/usr/local/bin/vmtoolsd
TimeoutStopSec=5
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Also=vgauthd.service

vgautd.service:

[Unit]
Description=VGAuth Service for open-vm-tools
Documentation=http://github.com/vmware/open-vm-tools
ConditionVirtualization=vmware
PartOf=vmtoolsd.service

[Service]
ExecStart=/usr/local/bin/VGAuthService -s
TimeoutStopSec=5
PrivateTmp=true

[Install]
RequiredBy=vmtoolsd.service

Когда они будут созданы, вам необходимо перезагрузить зависимости модулей с помощью systemctd daemon-reload. После этого вы сможете запустить услуги, позвонив по номеру systemctl start vmtoolsdили systemctl start vgauthd.

0
13.04.2020, 20:27
2 ответа

Чтобы избежать findвхода в каталоги, которые на самом деле вам недоступны, вы можете использовать! -executable -prune:

find. ! -executable -prune -type f ! -user "$USER"

Отрицательный тест -executableбудет верен для каталогов, к которым у вас нет доступа, и -pruneудалит их из дерева поиска find, останавливая попытки утилиты получить к ним доступ, и, таким образом, избегая генерации ошибок разрешения.

Тест -executable(, а также аналогичные -readableи -writableтесты )не являются стандартными -и требуют GNU find.

Я не могу (пока )сказать что-либо о различиях в результатах, так как вы ничего не сказали о них. Поскольку выходные данные сильно различаются по размеру, должно быть тривиально найти и изучить случаи, когда одна команда нашла что-то, чего не нашла другая команда.

0
19.03.2021, 02:29

Хм..., в моем домашнем каталоге обе команды работают одинаково. 8 -/

Тем не менее, вы должны перенаправить stderr в /dev/null и использовать wc -lдля правильного подсчета вывода.

find. -type f ! -user "$USER" 2>/dev/null | wc -l
find. -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

Отсюда вы можете перенаправить результаты в текстовые файлы и сравнить файлы, чтобы найти различия.

find. -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find. -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

Если есть различия, возьмите некоторые лишние файлы из /tmp/file _2.txt и уточните, почему файл не считается «Истинным, если файл существует и принадлежит действующему идентификатору пользователя».

1
19.03.2021, 02:29

Теги

Похожие вопросы