RHEL6のlogrotateのcompress(gzip)でNFSv4のACLが上書きされる
RHEL6のApache-HTTPDのログファイルにNFSv4のACLを付与している
logrotateで
普通の新ログファイル生成はnocreateでWebサーバまかせにしていて
この場合はちゃんと上位ディレクトリのデフォルトACLを引き継いでいる
しかしcompress(gzip)したログファイルに関しては
デフォルトACLを引き継がず新しいACLが上書きされていた
logrotate-3.7.8-16.el6のSRPMを拾ってきて調べると
logrotate.cにおいて
static int compressLogFile(char *name, struct logInfo *log, struct stat *sb) { char *compressedName; const char **fullCommand; int inFile; int outFile; int i; int status; : outFile = createOutputFile(compressedName, O_RDWR | O_CREAT | O_TRUNC, sb, prev_acl, 0); #ifdef WITH_ACL if (prev_acl) { acl_free(prev_acl); prev_acl = NULL; } #endif
とcompressLogFileでcreateOutputFileしている
ここでWITH_ACLと書いているのはPOSIX ACLのこと
createOutputFileでなにをしているかというと
同じくlogrotate.cにおいて
int createOutputFile(char *fileName, int flags, struct stat *sb, acl_type acl, int force_mode) { int fd; char template[PATH_MAX + 1]; mode_t umask_value; struct stat sb_create; int acl_set = 0; snprintf(template, PATH_MAX, "%s/logrotate_temp.XXXXXX", ourDirName(fileName)); : if (!acl_set || force_mode) { if (fchmod(fd, sb->st_mode)) { message(MESS_ERROR, "error setting mode of %s: %s\n", fileName, strerror(errno)); close(fd); unlink(template); return -1; } }
のようにchmodしてたのでここで上書きされていたのが原因
まあPOSIX ACLみたいなパッチを書けばいいと思うけど
そんな頑なにgzipしなければいけないわけでもないので
とりあえずnocompress(gzipなし)で運用