저는 Ubuntu를 사용하고 있으며 Yocto 과정을 수강하려고 합니다. 저는 Yocto를 다운로드하고 "hello-world" 테스트 스크립트를 실행하여 Yocto 설치를 확인할 수 있었습니다.
강사가 안내하는 다음 단계는 "start.sh"라는 스크립트를 실행하는 것입니다. 사용자로 실행하려고 하면 "권한이 거부되었습니다"라는 메시지가 나타납니다. 루트(sudo)로 실행하려고 하면 "useradd: UID 0이 고유하지 않습니다"라는 메시지가 나타납니다.
권한은 다음과 같습니다:
-rwxr-xr-x 1 chip chip 2336 Sep 28 20:30 start.sh
start.sh를 실행하는 방법은 다음과 같습니다.
$ ./start.sh
또는
$ sudo ./start.sh
저는 Linux를 처음 접했고 무슨 일이 일어났는지, 어떻게 복구해야 하는지 전혀 모릅니다.
스크립트는 다음과 같습니다(매우 길다).
#!/usr/bin/env bash
set -e
usage() {
echo "Usage:"
echo "$0 <options>"
echo "Available options:"
echo "-x Use X11 forwarding"
echo "-n Forward /dev/net/tun"
echo "-p Run container in privileged mode"
echo "-e Execute additional instance"
exit 0
}
# rough check to see if we are in correct directory
dirs_to_check=( "./cache/downloads" "./cache/sstate" "./home" )
for d in "${dirs_to_check[@]}"; do
if [[ ! -d ${d} ]]; then
echo "\"${d}\" directory not found"
usage
fi
done
arg_privileged=""
set_arg_privileged() {
echo "WARNING: Running the container with privileged access"
arg_privileged="--privileged"
}
arg_x11_forward=""
set_arg_x11() {
xhost +
arg_x11_forward="--env DISPLAY=unix${DISPLAY} \
--volume ${XAUTH}:/root/.Xauthority \
--volume /tmp/.X11-unix:/tmp/.X11-unix "
}
arg_net_forward=""
tun_dev="/dev/net/tun"
set_arg_net() {
arg_net_forward="--cap-add=NET_ADMIN \
--device ${tun_dev}:/dev/net/tun
--publish 8000:8000"
}
run_additional_instance=false
# parse input arguments
while getopts ":hxnpe" opt; do
case ${opt} in
h )
usage
;;
x )
command -v xhost >/dev/null 2>&1 || { echo >&2 "\"xhost\" is not installed"; exit 1; }
set_arg_x11
;;
n )
[[ -e "${tun_dev}" ]] || { echo >&2 "\"${tun_dev}\" not found, is the \"tun\" kernel module loaded?"; exit 1; }
set_arg_net
;;
p )
set_arg_privileged
;;
e )
run_additional_instance=true
;;
\? )
echo "Invalid Argument: \"${opt}\"" 1>&2
usage
;;
esac
done
empty_password_hash="U6aMy0wojraho"
if [ "${run_additional_instance}" = true ]; then
docker container exec \
-it \
--user yocto \
-w /opt/yocto/workspace \
hubshuffle-yocto \
/bin/bash
else
docker container run \
-it \
--rm \
-v "${PWD}":/opt/yocto \
--name hubshuffle-yocto \
${arg_net_forward} \
${arg_x11_forward} \
${arg_privileged} \
--volume "${PWD}/home":/home/yocto \
hubshuffle/yocto:1.2 \
sudo bash -c "groupadd -g 7777 yocto && useradd --password ${empty_password_hash} --shell /bin/bash -u ${UID} -g 7777 \
yocto && usermod -aG sudo yocto && usermod -aG users yocto && cd /opt/yocto && su yocto"
fi
여기서 도움을 받을 수 있나요?
답변1
분명히 이 문제는 데스크탑에서 FileManager 창을 열면 해결됩니다. 그렇지 않으면 ./start.sh를 터미널 창에서 실행할 수 없습니다. 왜 이런 일이 일어나는지 이해가 되지 않습니다. 방금 우연히 발견했습니다. 누군가 명확히 설명할 수 있다면 감사하겠습니다. 감사해요
답변2
UID 0은 루트 사용자입니다. 루트를 종료하고 다른 사용자처럼 스크립트를 실행해야 합니다.