Slackware(64) 14.2 + Xephyr는 chroot 및 umount 파티션을 사용합니다.

Slackware(64) 14.2 + Xephyr는 chroot 및 umount 파티션을 사용합니다.

내가 처음으로 이와 똑같은 문제를 겪었던 것은 ib ->https://www.linuxquestions.org/questions/showthread.php?p=6366697#post6366697

스크립트를 개선해야 합니다.

xfce4-session을 클릭한 후 Xephyr 창을 자동으로 닫고, chroot env를 완료한 후 가장 안전한 방법을 사용하여 파티션을 마운트 해제합니다.

----이 부분은 무시하셔도 됩니다---: 나는 chroot를 마운트하고 가상 하드 드라이브의 Xephyr 창 내부에 있는 그래픽 환경에서 부팅하기 위한 스크립트(베네수엘라 출신이므로 스페인어로)를 작성했습니다. 스크립트의 아이디어는 다음을 수행하는 것입니다.

01 - 루트처럼 실행 02 - 하드 드라이브 마운트(이 경우 미러링된 qcow2 형식) 03 - 파티션 마운트 04 - chroot 시작 05 - Xephyr 시작 06 - chroot에서 일부 명령 실행 07 - Xephyr 창 시작 xfce4- 세션 08 - 대기 Xephyr이 완료되도록 09 - Xephyr이 완료되면 파티션 마운트 해제를 시작합니다. 10 - "exit 0"을 사용하여 스크립트를 완료합니다.

----다음 부분이 중요합니다---:

좋습니다. 현재 코드는 다음과 같습니다.

#!/usr/bin/env bash

echo '
Autor ----------------> Inukaze ( Venezuela )
Sitio ----------------> https://goo.gl/ij6WqW
Correo-E -------------> [email protected]
Licencia -------------> GPL 2
'

#Establecer mediante la variable "$OBJETIVO" 
#La particion con una distribucion a la cual se accedera mediante chroot
export OBJETIVO="/media/ddvirt"
mkdir -p "$OBJETIVO"

#Prevenir que se autoejecuten las funciones que se definiran despues
unset montar
unset desmontar
unset MensajeBase
unset xephyr

#Establecer y definir funciones :
function MensajeBase()
{
echo -e "\nLa forma correcta de utilizar este guion es :\n$0 «montar» , «xephyr» ó «desmontar», Por ejemplo : \n"
echo -e "$0 montar"
echo -e "$0 xephyr (Modo Ventana)"
echo -e "$0 desmontar\n"
}

function montar(){
#Desmontar en caso de que estuviera montado previamente :
umount /dev/nbd0p1              2>/dev/null ; \
qemu-nbd --disconnect /dev/nbd0 1>/dev/null ; \
#Preparar para montar el disco duro virtual
modprobe nbd max_part=8
qemu-nbd --connect=/dev/nbd0 /home/inukaze/.aqemu/Slack64-15.0.qcow2 2>/dev/null
mount /dev/nbd0p1 "$OBJETIVO" 2>/dev/null

#Preparar acceso para programas de entorno grafico :
export DISPLAY=:0.0 2>/dev/null
xhost + local 2>/dev/null

#Montar todo de una vez para una distro de 64 Bits (En este caso Slackware64 15.0) : 
mount --rbind /proc                         "$OBJETIVO/proc"                    ; \
mount --make-rslave                     "$OBJETIVO/proc"                    ; \
mount --rbind /sys                          "$OBJETIVO/sys"                     ; \
mount --make-rslave                     "$OBJETIVO/sys"                     ; \
mount --rbind /dev                          "$OBJETIVO/dev"                 ; \
mount --make-rslave                     "$OBJETIVO/dev"                 ; \
mount --rbind /run                          "$OBJETIVO/run"                 ; \
mount --make-rslave                     "$OBJETIVO/run"                 ; \
mount --rbind /tmp                          "$OBJETIVO/tmp"                 ; \
mount --make-rslave                     "$OBJETIVO/tmp"                 ; \
mount --bind /etc/fstab                 "$OBJETIVO/etc/fstab"               ; \
mount --bind /etc/hostname          "$OBJETIVO/etc/hostname"        ; \
mount --bind /etc/hosts                 "$OBJETIVO/etc/hosts"           ; \
mount --bind /etc/resolv.conf           "$OBJETIVO/etc/resolv.conf" ; \

cat << EOF | chroot "$OBJETIVO"
export DISPLAY=:1.0 2>/dev/null
EOF

chroot                                  "$OBJETIVO" /bin/bash -l                    ; \
umount                              "$OBJETIVO"                                     ; \
mount -a 2>/dev/null
}

function xephyr(){
umount "$OBJETIVO/etc/resolv.conf" 2>/dev/null
umount "$OBJETIVO/etc/hosts" 2>/dev/null
umount "$OBJETIVO/etc/hostname" 2>/dev/null
umount "$OBJETIVO/etc/fstab" 2>/dev/null
umount "$OBJETIVO/lib/modules" 2>/dev/null
umount "$OBJETIVO/var/lib/dbus" 2>/dev/null
umount "$OBJETIVO/var/run/dbus" 2>/dev/null
umount "$OBJETIVO/tmp"   2>/dev/null
umount "$OBJETIVO/run" 2>/dev/null
umount "$OBJETIVO/dev/pts" 2>/dev/null
umount -l "$OBJETIVO/dev" 2>/dev/null
umount -l "$OBJETIVO/sys" 2>/dev/null
umount "$OBJETIVO/proc" 2>/dev/null
umount -l /dev/ndb0p1 2>/dev/null
sleep 7
qemu-nbd --disconnect /dev/nbd0 1>/dev/null
modprobe nbd max_part=8
qemu-nbd --connect=/dev/nbd0 /home/inukaze/.aqemu/Slack64-15.0.qcow2
sleep 3
mount /dev/nbd0p1 "$OBJETIVO"

#Copiar archivo de autorizacion X.Org :
rm -f "$OBJETIVO/home/inukaze/.Xauthority"
rm -f "$OBJETIVO/root/.Xauthority"
cp -f "/home/inukaze/.Xauthority" "$OBJETIVO/root/.Xauthority"
cp -f "/home/inukaze/.Xauthority" "$OBJETIVO/home/inukaze/.Xauthority"

chown inukaze:users "$OBJETIVO/home/inukaze/.Xauthority"

echo ""

if [ ! -f "$OBJETIVO/etc/X11/Xwrapper.config" ] ; then
# Prevenir el error « /usr/libexec/Xorg.wrap: Only console users are allowed to run the X server »
echo '# Xwrapper.config (Debian X Window System server wrapper configuration file)
#
# This file was generated by the post-installation script of the x11-common
# package using values from the debconf database.
#
# See the Xwrapper.config(5) manual page for more information.
#
# This file is automatically updated on upgrades of the x11-common package
# *only* if it has not been modified since the last upgrade of that package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command as root:
#   dpkg-reconfigure x11-common
#allowed_users=console
allowed_users=anybody' | tee "$OBJETIVO/etc/X11/Xwrapper.config"
fi

echo ""

#Preparar acceso para programas de entorno grafico :
$(export DISPLAY=:0.0)
$(xhost + local 2>/dev/null)

#Montar todo de una vez para una distro de 64 Bits (En este caso Slackware64 15.0) : 
mount --rbind /proc                     "$OBJETIVO/proc"                                                    ; \
mount --make-rslave                 "$OBJETIVO/proc"                                                    ; \
mount --rbind /sys                      "$OBJETIVO/sys"                                                     ; \
mount --make-rslave                 "$OBJETIVO/sys"                                                     ; \
mount --rbind /dev                      "$OBJETIVO/dev"                                                 ; \
mount --make-rslave                 "$OBJETIVO/dev"                                                 ; \
mount --rbind /dev/pts              "$OBJETIVO/dev/pts"                                             ; \
mount --make-rslave                 "$OBJETIVO/dev/pts"                                             ; \
mount --rbind /run                      "$OBJETIVO/run"                                                 ; \
mount --make-rslave                 "$OBJETIVO/run"                                                 ; \
mount --rbind /tmp                      "$OBJETIVO/tmp"                                                 ; \
mount --make-rslave                 "$OBJETIVO/tmp"                                                 ; \
mount --rbind /var/run/dbus     "$OBJETIVO/var/run/dbus"                                        ; \
mount --make-rslave                 "$OBJETIVO/var/run/dbus"                                        ; \
mount --rbind /var/lib/dbus         "$OBJETIVO/var/lib/dbus"                                        ; \
mount --make-rslave                 "$OBJETIVO/var/lib/dbus"                                        ; \
mount --rbind /lib/modules          "$OBJETIVO/lib/modules"                                         ; \
mount --make-rslave                 "$OBJETIVO/lib/modules"                                         ; \
mount --bind /etc/fstab             "$OBJETIVO/etc/fstab"                                               ; \
mount --bind /etc/hostname      "$OBJETIVO/etc/hostname"                                        ; \
mount --bind /etc/hosts             "$OBJETIVO/etc/hosts"                                           ; \
mount --bind /etc/resolv.conf       "$OBJETIVO/etc/resolv.conf"                                 ; \

$(Xephyr -screen 1070x887 -ac -br -reset -terminate :1.0 \
+extension Composite \
+extension DAMAGE \
+extension DOUBLE-BUFFER \
+extension DPMS \
+extension GLX \
+extension MIT-SCREEN-SAVER \
+extension MIT-SHM \
+extension RANDR \
+extension RENDER \
+extension X-Resource \
+extension XFIXES \
+extension XTEST \
+extension XVideo \
+iglx \
2>/dev/null &)

export xerphid=$(pidof "Xephyr")

cat << EOF | chroot "$OBJETIVO"
$(export DISPLAY=:1.0 2>/dev/null) 
EOF

chroot                                  "$OBJETIVO" /bin/bash -l        <<"EOT"
#Primero Detectar Particiones, Crear Directorios dentro de /media y finalmente montarlas
#Nombre De Particion :
#   NPD1="1SlackIni"    # Esta es la particion /boot de la particion que estoy usando en chroot
    NPD2="72GB"
    NPD3="Compartido"
    NPD4="2SlackIni"
    NPD5="Slack64"  #Esta es la particion Anfrition, ya que intercambiare datos, la necesito montar.

#Parte de la Particion
#   PPD1=$(blkid -l -t LABEL="$NPD1" | awk '{print $01}' | sed 's/:.*//g')
    PPD2=$(blkid -l -t LABEL="$NPD2" | awk '{print $01}' | sed 's/:.*//g')
    PPD3=$(blkid -l -t LABEL="$NPD3" | awk '{print $01}' | sed 's/:.*//g')
    PPD4=$(blkid -l -t LABEL="$NPD4" | awk '{print $01}' | sed 's/:.*//g')
    PPD5=$(blkid -l -t LABEL="$NPD5" | awk '{print $01}' | sed 's/:.*//g')
$(mkdir -p /media/"$NPD2" ; mount "$PPD2" /media/"$NPD2" )
$(mkdir -p /media/"$NPD3" ; mount "$PPD3" /media/"$NPD3" )
$(mkdir -p /media/"$NPD4" ; mount "$PPD4" /media/"$NPD4" )
$(mkdir -p /media/"$NPD5" ; mount "$PPD5" /media/"$NPD5" )
#$(USER="inukaze" ; gpasswd -a $USER video)
$(rm -rf /tmp/.X1-lock)
$(chown root:root /tmp/.ICE-unix)
$(su - inukaze)

$(export DISPLAY=:1)
$(DISPLAY=:1 "/usr/bin/xfce4-session" -- :1 2>/dev/null &)
EOT

#Esperar que Xephyr sea cerrado para desmontar particiones :
tail --pid="$xerphid" -f /dev/null
sleep 120
umount "$OBJETIVO/etc/resolv.conf"  
umount "$OBJETIVO/etc/hosts"        
umount "$OBJETIVO/etc/hostname"
umount "$OBJETIVO/etc/fstab"        
umount "$OBJETIVO/lib/modules"      
umount "$OBJETIVO/var/lib/dbus"     
umount "$OBJETIVO/var/run/dbus"
umount "$OBJETIVO/tmp"              
umount -l "$OBJETIVO/run"
umount "$OBJETIVO/dev/pts"          
umount -l "$OBJETIVO/dev"
umount -l "$OBJETIVO/sys"
umount "$OBJETIVO/proc"
umount -l /dev/ndb0p1
qemu-nbd --disconnect /dev/nbd0     1>/dev/null
sleep 7
mount -a                            2>/dev/null

}


function desmontar(){

# Desmontar
umount "$OBJETIVO/etc/resolv.conf"  
umount "$OBJETIVO/etc/hosts"
umount "$OBJETIVO/etc/hostname"
umount "$OBJETIVO/etc/fstab"
umount "$OBJETIVO/lib/modules"
umount "$OBJETIVO/var/lib/dbus"
umount "$OBJETIVO/var/run/dbus"
umount "$OBJETIVO/tmp"
#umount -l "$OBJETIVO/run"          2>/dev/null
umount "$OBJETIVO/run"
umount "$OBJETIVO/dev/pts"
#umount -l "$OBJETIVO/dev"          2>/dev/null
umount "$OBJETIVO/dev"
#umount -l "$OBJETIVO/sys"          2>/dev/null
umount "$OBJETIVO/sys"
umount "$OBJETIVO/proc"
#umount -l /dev/ndb0p1                  2>/dev/null
umount -l /dev/ndb0p1                   2>/dev/null
qemu-nbd --disconnect /dev/nbd0     1>/dev/null
sleep 7
mount -a                                            2>/dev/null

}


#Este guión necesita ser ejecutado como SuperUsuario
#o en su defecto con permisos administrativos suficientes
#Para montar / desmontar particiones.

if [ "$(whoami)" != root ]; then

    echo
    echo
    echo 'Por favor ejecuta este guion como SuperUsuario (root)'
    echo
    echo 'Utilize este guión bajo su Propio Riesgro'
    echo 'El Autor , o sea yo , no me hago responsable'
    echo 'de las consecuencias imprevistas que puedan'
    echo 'acontecer en tu sistema operativo'
    echo
else

# Proceder en caso de tener los permisos suficientes para montar/desmontar particiones :

#Si el usuario no pasa ningun parametro iniciar directamente en "Xephyr"
#En la interfaz de linea de comandos (ILC / CLI ) indicar como se puede usar este guion

            if [ -z "$1" ]; then
                    echo
                    MensajeBase
                    echo
                    xephyr
            fi

#Guion : Aqui se ha definido como se utilizara este guion correctamente para montar o desmontar la particion Objetivo
#Entrada : Cualquier palabra pasada por el parametro $1 sera convertida en minusculas

Entrada=$(echo "$1" | tr -s  '[:upper:]'  '[:lower:]')

            if [ "$Entrada" == "montar" ]; then
                    montar
            fi

            if [ "$Entrada" == "xephyr" ]; then
                    xephyr
            fi

            if [ "$Entrada" == "desmontar" ]; then
                    desmontar
            fi

#Finalizar la condicion global de requerir usar el SuperUsuario o en su defectos persmisos administrativos
#Para poder (des)montar particiones :
fi

문제는 Xephyr 창에 대한 지시를 받았을 때 모든 프로세스가 완료될 때까지 약 5분 정도 기다렸다가 Xephyr 창을 수동으로 닫는 것입니다. Xephyr 창은 절대 사라지지 않고 "jbd2/nbd0p1-8"이 여전히 사용 중이므로 파티션을 마운트 해제할 수 없습니다." 또한 커널 모듈 'nbd'가 사용 중이기 때문에 강제로 언로드할 수 없습니다.

관련 정보