Start Arduino IDE as root on Fedora / Allow root to start an X application
Solution
Execute the following as a normal user
xhost +si:localuser:root; sudo ./arduino;
Background Story and More Information
Recently we needed to start the official Arduino IDE as root on Fedora to allow the application to take control of the serial port.
We were getting the following error whenever we tried to upload the application to the board:
processing.app.debug.RunnerException at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:160) at cc.arduino.UploaderUtils.upload(UploaderUtils.java:78) at processing.app.SketchController.upload(SketchController.java:713) at processing.app.SketchController.exportApplet(SketchController.java:686) at processing.app.Editor$DefaultExportHandler.run(Editor.java:2168) at java.lang.Thread.run(Thread.java:748) Caused by: processing.app.SerialException: Error touching serial port '/dev/ttyACM0'. at processing.app.Serial.touchForCDCReset(Serial.java:107) at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:144) ... 5 more Caused by: jssc.SerialPortException: Port name - /dev/ttyACM0; Method name - openPort(); Exception type - Permission denied. at jssc.SerialPort.openPort(SerialPort.java:170) at processing.app.Serial.touchForCDCReset(Serial.java:101) ... 6 more
So, we tried to start the arduino IDE using root and got another error:
[george@bytefreaks bin]$ sudo ./arduino; [sudo] password for george: No protocol specified Picked up JAVA_TOOL_OPTIONS: No protocol specified java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable. at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65) at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115) at java.security.AccessController.doPrivileged(Native Method) at sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:74) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103) at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82) at sun.awt.X11.XToolkit.(XToolkit.java:126) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at java.awt.Toolkit$2.run(Toolkit.java:860) at java.awt.Toolkit$2.run(Toolkit.java:855) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:854) at java.awt.SystemColor.updateSystemColors(SystemColor.java:473) at java.awt.SystemColor.(SystemColor.java:465) at processing.app.Theme.init(Theme.java:84) at processing.app.Base.(Base.java:219) at processing.app.Base.main(Base.java:144)
This error occurred because the default configuration of the X server permissions did not allow the root to connect to it.
To verify this, we used xhost (the X server access control program) to check the permissions.
Executing xhost with no command line arguments gave us a message indicating whether or not access control was currently enabled, followed by the list of those users allowed to connect.
For example in our case the output was as follows:
[george@bytefreaks bin]$ xhost access control enabled, only authorized clients can connect SI:localuser:george
To add root to the list of users that was allowed to start an X application we executed the following command:
[george@bytefreaks bin]$ xhost +si:localuser:root localuser:root being added to access control list
Executing xhost again, we got the updated list which included the root
[george@bytefreaks bin]$ xhost access control enabled, only authorized clients can connect SI:localuser:root SI:localuser:george
After this, we were able to start arduino IDE using sudo with no problems.
[george@bytefreaks bin]$ sudo ./arduino;
Note: This patch is not permanent, we actually execute it once at every restart of the machine.


