Difference between revisions of "External UNIX socket"

From CRIU
Jump to navigation Jump to search
(created (based on xemul's CRIU post https://plus.google.com/b/103175467322423551911/103175467322423551911/posts/8yv9pBYJXF8))
 
(splitted into two sections, nicer wording)
Line 1: Line 1:
This article explains the meaning of "external unix socket" log message, and the purpose of <code>--ext-unix-sk</code> option.
+
This explains the meaning of "external socket is used" error message, and the purpose of <code>--ext-unix-sk</code> option.
 +
 
 +
== Unix socket consistency check ==
  
 
When dumping a process sub-tree, crtools checks that the resulting image is consistent and self-contained, meaning if an object A references another object B, and A goes into dump, then B should be dumped as well. For example, if there is a pipe, and crtools dumps its one end (object A) because it belongs to a process it dumps, it must also dump the other end of the pipe (object B), meaning it should take a process owning B into the image as well. Same is true for unix sockets: if there is a socket (A) that is <code>connect()</code>ed to another socket (B), and crtools dumps socket A (because it is opened by a process it dumps), it must also dump socket B and the task who owns it. Possibly socket B is dumped some time later in the dumping process, but it must be dumped.
 
When dumping a process sub-tree, crtools checks that the resulting image is consistent and self-contained, meaning if an object A references another object B, and A goes into dump, then B should be dumped as well. For example, if there is a pipe, and crtools dumps its one end (object A) because it belongs to a process it dumps, it must also dump the other end of the pipe (object B), meaning it should take a process owning B into the image as well. Same is true for unix sockets: if there is a socket (A) that is <code>connect()</code>ed to another socket (B), and crtools dumps socket A (because it is opened by a process it dumps), it must also dump socket B and the task who owns it. Possibly socket B is dumped some time later in the dumping process, but it must be dumped.
  
This restriction is in place to make sure that upon restore applications will continue to work, rather than, say, receive SIGPIPE singals due to half-closed pipes or sockets.
+
This restriction is in place to make sure that upon restore applications will continue to work, rather than, say, receive SIGPIPE signals due to half-closed pipes or sockets.
 +
 
 +
With that said, "external socket is used" error means crtools detected a unix socket connected to another socket which is not being dumped (because it belongs to a process not going into the image).
 +
 
 +
== Using --ext-unix-sk ==
 +
 
 +
However, sometimes it is possible to dump and successfully restore only one end of a unix socket pair. One particular example is the <code>logd</code>, a daemon which opens a datagram unix socket and waits on it for messages to be written into a log file. Processes using logd also create datagram unix sockets and connect those to the logd socket. These connections are thus uni-directional, meaning that the logd's socket remains unconnected. In this case it is possible to dump a program using logd as a client. For it to work after restore its socket needs to be reconnected back to logd using the logd's socket name.
  
With that said, "external unix socket" in log means crtools found a unix socket that is connected to another one, but that another one is not dumped, because it belongs to a process not going into the image.
+
This is when <code>--ext-unix-sk</code> option should be used. By providing this option (for both dump and restore commands), user states "I know there may be uni-directional unix connections, and I will make sure the server end will exist on restore".
  
However, sometimes it is possible to dump and restore only one end of a unix socket pair. One example is <code>logd</code> daemon. It opens a datagram unix socket and waits on it for messages to be put  into a log file. Processes using logd also create datagram unix sockets and connect those to the logd socket. Such connections are thus uni-directional, meaning that the logd's socket remains unconnected. In this case it is possible to dump a program which is a logd client, we just have to connect its socket back to logd during restore using the logd's socket name.
+
For '''crtools dump''', this option enables dumping unix sockets with additional information about that other ("external") socket it is connected to.
  
This is when <code>--ext-unix-sk</code> option should be used. By providing this option (for both dump and restore commands), user states "I know there may be uni-directional unix connections, and I will make sure the server end will exist on restore". When this option is used, crtools dump puts unix sockets with information about the "external" socket it is connected to, and then crtools restore tries to re-connect such sockets back.
+
For '''crtools restore''', this option asks crtools to re-connect such sockets back.
  
 
== See also ==
 
== See also ==
  
 
* [[Advanced usage]]
 
* [[Advanced usage]]

Revision as of 19:58, 26 March 2013

This explains the meaning of "external socket is used" error message, and the purpose of --ext-unix-sk option.

Unix socket consistency check

When dumping a process sub-tree, crtools checks that the resulting image is consistent and self-contained, meaning if an object A references another object B, and A goes into dump, then B should be dumped as well. For example, if there is a pipe, and crtools dumps its one end (object A) because it belongs to a process it dumps, it must also dump the other end of the pipe (object B), meaning it should take a process owning B into the image as well. Same is true for unix sockets: if there is a socket (A) that is connect()ed to another socket (B), and crtools dumps socket A (because it is opened by a process it dumps), it must also dump socket B and the task who owns it. Possibly socket B is dumped some time later in the dumping process, but it must be dumped.

This restriction is in place to make sure that upon restore applications will continue to work, rather than, say, receive SIGPIPE signals due to half-closed pipes or sockets.

With that said, "external socket is used" error means crtools detected a unix socket connected to another socket which is not being dumped (because it belongs to a process not going into the image).

Using --ext-unix-sk

However, sometimes it is possible to dump and successfully restore only one end of a unix socket pair. One particular example is the logd, a daemon which opens a datagram unix socket and waits on it for messages to be written into a log file. Processes using logd also create datagram unix sockets and connect those to the logd socket. These connections are thus uni-directional, meaning that the logd's socket remains unconnected. In this case it is possible to dump a program using logd as a client. For it to work after restore its socket needs to be reconnected back to logd using the logd's socket name.

This is when --ext-unix-sk option should be used. By providing this option (for both dump and restore commands), user states "I know there may be uni-directional unix connections, and I will make sure the server end will exist on restore".

For crtools dump, this option enables dumping unix sockets with additional information about that other ("external") socket it is connected to.

For crtools restore, this option asks crtools to re-connect such sockets back.

See also