eco al archivo funciona sólo con sudo su

eco al archivo funciona sólo con sudo su

Estoy usando la placa de desarrollo Jetson TK1 de NVIDIA que tiene Ubuntu 14.04. Es un sistema ARM de 4 núcleos y, de forma predeterminada, 3 de ellos están "fuera de línea".

ubuntu@tegra-ubuntu ~ $ lscpu
Architecture:          armv7l
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0
Off-line CPU(s) list:  1-3
Thread(s) per core:    1
Core(s) per socket:    3
Socket(s):             1

Si bien se supone que se activan automáticamente cuando el programador detecta suficiente carga, no lo hacen (al menos para nuestra carga de trabajo). La solución es escribir un "1" en una ubicación dentro de /sys -

/sys/devices/system/cpu/cpu1/online

La documentación dice que se deben seguir estos comandos en orden:

sudo su
echo 1 > /sys/devices/system/cpu/cpu1/online

y repita para los cpus 2 y 3. Esto funciona:

ubuntu@tegra-ubuntu ~ $ sudo su
[sudo] password for ubuntu: 
root@tegra-ubuntu:/home/ubuntu# echo 1 > /sys/devices/system/cpu/cpu1/online
root@tegra-ubuntu:/home/ubuntu# lscpu
Architecture:          armv7l
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0,1
Off-line CPU(s) list:  2,3
Thread(s) per core:    1
Core(s) per socket:    3
Socket(s):             1
root@tegra-ubuntu:/home/ubuntu# 

No quiero usarlo sudo su, personalmente, porque me duele la vista, pero principalmente porque necesitamos un script que pueda activar todas las CPU y luego ejecutar el comando para iniciar nuestra carga de trabajo. Lo ideal es que lo ponga /etc/rc.local. Eso no funciona. ¿Puede ser que el kernel apague las CPU después de ejecutar rc.local en el arranque?

En cualquier caso, aquí está mi guión:

#!/bin/bash
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu1/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
<some command>

El problema es que <some command>las líneas de eco de arriba se ejecutan y no dan nada en la salida estándar. Sin embargo, lscpumuestra solo 1 CPU activa. Pegar estas líneas directamente en la terminal no funciona. Esa no fue la parte desconcertante para mí. Supuse que había estropeado algo. Esto es lo queesmisterioso. Hacerlo sudo suseguido del echocomando funciona, como dije antes. Ahora, saliendo de root y ejecutando

sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"

en mi shell de usuario (el usuario es sudoer) funciona. Entonces, si no lo hago sudo su, 1 nunca se repite para ninguna de las CPU. Pero hacer eco después sudo supara una CPU me permite hacer eco de las demás fuera del shell raíz.

Finalmente, teeusado así tampoco funciona.

echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online

sudo bash -cSe agradecería cualquier ayuda sobre por qué sucede esto y cómo podría usarlo desde un script en la terminal de usuario.

Respuesta1

La razón por la sudo echo 1 > /sys/devices/system/cpu/cpu0/onlineque no funciona es porque la sudoparte se aplica sólo al comando principal ( echo 1); no se aplica a la redirección ( > /sys/devices/system/cpu/cpu0/online), por lo que la parte de escritura en el archivo se realiza en su cuenta de usuario.

Usar algo como echo 1 | sudo tee /sys/devices/system/cpu/cpu0/onlinedebería funcionar, ya que la parte de escritura se realizará en sudo, mientras que la echoparte estará en su cuenta. No estoy seguro de por qué no funcionó en su caso.

Respuesta2

Ponerlo suen la parte superior del script y luego ejecutar los comandos normalmente funcionará bien. La razón por la que debe usar sudo suen lugar de just sudoes porque sudo solo funciona en el programa principal, la redirección ( >) se ejecuta sin privilegios de root.

Respuesta3

Eh. Eso es raro.

Esto debería funcionar:

cat | sudo bash << "EOF"
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
EOF

¿Quizás las otras cosas funcionaron para usted, pero como no desactivó el regulador de escala, apagó los núcleos antes de comenzar a usarlos?

De acuerdo ahttp://elinux.org/Jetson/Performancetambién deberíasecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable

información relacionada