lxcControllerRun() is calling virFileOpenTtyAt() with a slave opened on /the/container/chroot/dev/pts. While it is not documented in the manpages, glibc's grantpt does a first check (ensuring that the passed in fd is a pty slave) with '/dev/pts' as the hardcoded path, appending the pty#.
lxcControllerRun always calls this on the first slave opened after creating the new /dev/pts, so grantpt is always checking /dev/pts/0. Therefore, if your host does not have /dev/pts/0 (easy to reproduce using screen), then grantpt will fail, and the container creation will subsequently also fail.
lxcControllerRun() is calling virFileOpenTtyAt() with a slave opened on /the/container/ chroot/ dev/pts. While it is not documented in the manpages, glibc's grantpt does a first check (ensuring that the passed in fd is a pty slave) with '/dev/pts' as the hardcoded path, appending the pty#.
lxcControllerRun always calls this on the first slave opened after creating the new /dev/pts, so grantpt is always checking /dev/pts/0. Therefore, if your host does not have /dev/pts/0 (easy to reproduce using screen), then grantpt will fail, and the container creation will subsequently also fail.